BoostCource/Back-end

[BE] 01. Servlet 기초

칸타탓 2018. 5. 20. 02:46

<1. 웹 프로그래밍 기초 - Servlet>

 

 

* 아파치 톰켓 설치

 

다음의 명령어로 톰캣을 실행할 수 있다.

./bin/startup.sh

 

톰캣이 시작되었다는 메시지는 출력되지만 8080포트로 접근이 되지 않을 때는 root 권한으로 서버를 시작한다.

sudo ./bin/startup.sh 

 

아파치 톰켓 설치 폴더 아래의 bin폴더에 있는 shutdown.bat파일이나 shutdown.sh파일을 더블클릭하여 실행하면 아파치 톰캣을 종료할 수 있다.

혹은, 실행 중인 창을 닫아도 아파치 톰캣이 종료된다.

 

아파치 톰켓이 종료 http://localhost:8080으로 다시 접속하면 오류 화면이 보여진다.

 


 

* 서블릿 컴파일 및 실행하기

package examples;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        PrintWriter out = response.getWriter(); // io 객체를 이용
        out.println("<h1>Hello Servlet</h1>");
    }

}

http://localhost:8080 /{프로젝트 이름}/{URL Mapping 값}

톰켓은 8080포트 사용, 여기에서는 URL Mapping 값이 HelloServlet, Get방식을 사용한다.

 


 

* Servlet 이란?

웹 어플리케이션은 동적인 컨텐츠와 정적인 컨텐츠로 나뉘어진다. 여기에서 페이지를 동적으로 만들어 주는 것이 서블릿이다.

 

- 자바 웹 어플리케이션(Java Web Application)

WAS에 설치(deploy)되어 동작하는 어플리케이션

자바 웹 어플리케이션에는 HTML, CSS, 이미지, 자바로 작성된 클래스(Servlet도 포함됨, package, 인터페이스 등), 각종 설정 파일 등이 포함된다.

 

- 서블릿이란?
  • 자바 웹 어플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할

  • 서블릿(servlet)은 WAS에 동작하는 JAVA 클래스

  • 서블릿은 HttpServlet 클래스를 상속받아야 한다.

  • 서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 두 가지(JSP, 서블릿)를 조화롭게 사용해야 한다.

  • (웹 페이지를 구성하는 화면(HTML)은 JSP로 표현하고, 복잡한 프로그래밍은 서블릿으로 구현)

 


 

* Servlet 작성 방법

 

- 1부터 10까지 출력해보기 (3.1 version)

file -> new -> Dynamic Web project -> Dynamic web module version 3.1 확인 -> Generate web.xml deployment descriptor

 

- TenServlet.java

package examples;


import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class TenServlet
 */
@WebServlet("/ten")
public class TenServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TenServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("<h1>1부터 10까지 출력합니다.<h1>");
        for(int i = 1; i<=10; i++) {
            out.print(i+"<br>");
        }
        out.close();
    }
}

request(요청 객체), response(응답 객체)

setContentType: 응답 결과가 텍스트 임을 알려준다.

 


 

* Servlet 라이프 사이클

 

언제 생성되고 언제 호출되는지 HttpServlet의 3가지 메소드를 오버라이딩하여 확인한다.

  • init()

  • service(request, response) //새로고침 누르면 service만 계속하여 다시 호출

  • destroy() //servlet이 수정되었을 때 호출

 

- Servlet 생명주기

1. WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인

 if (메모리에 없음) {
  - 해당 서블릿 클래스를 메모리에 올림
  - init() 메소드를 실행
 }
 - service()메소드를 실행

 

2. was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드 실행

 

- 실습 코드

실행 시 LifecycleServlet -> init -> service 순서로 출력된다.

새로고침 시에 (새로운 요청) service만 호출된다.

서블릿 객체를 여러개 만들지 않기 때문에 객체가 이미 있는지 확인 후 service 메소드만 호출한다.

init 객체가 수정되어 메모리에 올라가 있었던 객체가 사용이 불가능해졌을 때(갱신, 종료 시) destroy라는 메소드가 호출된다.\

@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       

    public LifecycleServlet() {
        System.out.println("LifecycleServlet 생성!!");
    }

    public void init(ServletConfig config) throws ServletException {
        System.out.println("init test 호출!!");
    }

    
    public void destroy() {
        System.out.println("destroy 호출!!");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>form</title></head>");
        out.println("<body>");
        out.println("<form method='post' action='/firstweb/LifecycleServlet'>");
        out.println("name : <input type='text' name='name'><br>");
        out.println("<input type='submit' value='ok'><br>");                                                 
        out.println("</form>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        out.println("<h1> hello " + name + "</h1>");
        out.close();
    }

//    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        System.out.println("service 호출!!");
//    }
}

 

- service(request, response) 메소드

HttpServlet의 service메소드는 템플릿 메소드 패턴으로 구현한다.

  • 클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request, response)메소드를 호출

  • 클라이언트의 요청이 Post일 경우에는 자신이 가지고 있는 doPost(request, response)를 호출

=> 그렇게 때문에 service() 메소드를 오버라이드 하지 않고 doGet만 오버라이드 하여도 doGet이라는 메소드가 호출되는 것!

 

(+) 해당 서블릿에 URL 주소를 직접 입력하거나 링크를 클릭하는 것은 GET 방식으로 서버에 요청된다 => doGet

요청할 때 메서드가 get이 아니라 post인 경우 doPost 호출된다.

 

(+) 메소드 오버라이드

 


 

* Request, Response 객체 이해하기

 

  • HttpServletRequest : 클라이언트가 서버에게 보낸 요청을 추상화한 객체 (요청할 때 가지고 들어온 정보를 담는다)

  • HttpServletResponse: 서버가 클라이언트에게 응답하기 위한 정보를 추상화한 객체 (클라이언트에게 전송하기 위한 정보를 담는다.)

 

- 요청과 응답

WAS는 웹 브라우저로부터 Servlet요청을 받으면,

  1. 요청할 때 가지고 있는 정보를 HttpServletRequest 객체를 생성하여 저장한다.

  2. 웹 브라우저에게 응답을 보낼 때 사용하기 위하여 HttpServletResponse 객체 생성한다.

  3. 생성된 HttpServletRequest, HttpServletResponse 객체를 서블릿에게 전달한다.

  • HttpServletRequest

    • http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용한다.

    • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가지고 있다.

    • Body의 Stream을 읽어 들이는 메소드를 가지고 있다.

  • HttpServletResponse

    • WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있다.

    • 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse 객체를 생성하여 서블릿에게 전달한다.

    • 서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지등을 전송한다.

 

- request 메소드들

http://localhost:8080/firstweb/param?name=jeong&age=10

name = 파라메터, jeong = 값

 

request.getParameter("name"), request.getParameter("age")로 파라메터를 읽어들일 수 있다.

age는 int가 아님에 꼭 주의한다. 전부 String으로 넘어온다.

  • request.getParameter()

  • request.getRequestURI()

  • request.getRequestURL()

  • request.getContextPath()

  • request.getRemoteAddr()

 

'BoostCource > Back-end' 카테고리의 다른 글

#02. BE - Maven으로 프로젝트 만들기  (0) 2018.07.15
#02. BE - JSTL  (0) 2018.07.14
#02. BE - EL  (0) 2018.07.14
#02. BE - Scope  (0) 2018.07.14
#02. BE - JSP & Servlet  (0) 2018.07.13