[Servlet] 서블릿 기초

서블릿 기초


-HttpServlet을 상속받는 클래스는 doGet() 메소드를 오버라이딩할 수 있기 때문에 이 클래스는 서블릿으로 동작할 수 있게된다.


1. 서블릿 기본

1 서블릿 규약에 따라 자바 코드를 작성한다.

2 자바 코드를 컴파일해서 클래스 파일을 생성한다.

3 클래스 파일을 /WEB-INF/classes 디렉토리에 패키지에 알맞게 위치시킨다.

4 web.xml 파일에 서블릿 클래스를 설정한다.(필요한 경우 진행)

5 톰캣 등의 컨테이러를 재실행한다.(서블릿 리로딩 기능이 있는 경우 생략)

6 웹 브라우저에서 확인한다.


MVC 패턴을 지원하는 서블릿 코드를 직접 구현하지 않더라도 서블릿 자체에 대해서 이해하는 것은 웹 개발을 하는데 있어서 중요한 부분이다.

HttpServlet 클래스는 서블릿 규약에 포함된 클래스로서, 이 클래스를 사용하려면 클래스패스에 /[톰캣]/lib/servlet-api.jar 파일을 포함시켜 주어야 한다.

서블릿 클래스를 구현하려면 먼저 HttpServlet 클래스를 상속받은 클래스를 작성해야 한다. 

HttpServlet 클래스를 상속 받았다면, 처리하고자 하는 HTTP 방식(method)에 따라 알맞은 메서드를 오버라이딩해서 구현해 주어야 한다.

예를 들어, doGet() 메서드를 오버라이딩 해주면 된다. doGet() 메서드는 HttpServletRequest와 HttpServletResponse의 두 파라미터를 갖는데,

이 두 파라미터는 각각 JSP의 request 기본 객체, response 기본 객체와 동일하다.

오버라이딩 한 메서드에서는 request를 이용해서 웹 브라우저의 요청 정보를 읽어오던가 response를 이용해서 응답을 전송할 수 있다.


2. 서블릿의 라이프사이클

① public void init( ) 또는 public void init(ServletConfig sc) {...} 메서드에 의한 초기화

web.xml 파일이 실행되면서나 최초 접속하는 클라이언트에 의해 실행된다.(한번 실행되면 서버가 종료될 때 까지 두번 다시 실행하지 않음)

② public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {...}

클라이언트의 요청에 의해 실행되는 메서드로 콘솔 프로그램의 main( ) 메서드와 같은 역할을 한다.

③ public void destroy( ) {...} 메서드에 의한 메모리 해제

웹 서버가 종료될 때 실행되어 메모리를 해제한다.(서버 종료시 실행)


3. 서블릿 설정

-web.xml 등록

서블릿 클래스를 생성했다면, 그 다음으로 할 작업은 WEB-INF 디렉터리의 web.xml 파일에 서블릿 클래스를 등록하는 것이다.

NowServlet 클래스를 web.xml 파일에 등록한 예를 보여주고 있다.

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="chap20" version="3.0">


<servlet>// 서블릿 클래스를 서블릿으로 등록한다.

<servlet-name>now</servlet-name>// 해당 서블릿을 참조할 때 사용할 이름을 입력한다.

<servlet-class>mvjsp.chap20.NowServlet</servlet-class>// 서블릿으로 사용할 서블릿 클래스의 완전한 이름을 입력한다.

</servlet>

// 위의 경우 mvcjsp.chap20.NowSerlvet 클래스를 "now"라는 이름의 서블릿으로 등록하고 있다.

<servlet-mapping> 

<servlet-name>now</servlet-name>// 매핑할 서블릿의 이름을 지정한다.

<url-pattern>/now</url-pattern>// 매핑할 URL 패턴을 지정한다.

</servlet-mapping>

</web-app>

사용할 서블릿을 지정했다면 그 다음으로 할 작업은 해당 서블릿이 어떤 URL을 처리할 지에 대한 매핑 정보를 등록하는 것이다. 이는 <servlet-mapping> 태그를 이용해서 지정한다. 여기서는 now라는 이름의 서블릿이 /now라는 URL 패턴을 처리한다고 지정하고 있다. 앞서 NowServlet 클래스를 now 라는 이름의 서블릿으로 등록했으므로 결과적으로 /now 라는 URL을 NowServlet이 처리하게 된다.

서블릿을 등록하려면 다음의 두 가지 설정을 해주어야 한다.

1 서블릿으로 사용할 클래스

2 서블릿과 URL 간의 매핑


- 서블릿 파일

package mvjsp.chap20;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Date;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class NowServlet extends HttpServlet {

// NowServlet 클래스는 HttpServlet 클래스를 상속 받고 있으며, 따라서 NowServlet은 서블릿으로 동작할 수 있게 된다.


@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html; charset=euc-kr");


PrintWriter out = response.getWriter();

out.println("<html>");

out.println("<head><title>현재시간</title></head>");

out.println("<body>");

out.println("현재 시간은");

out.println(new Date());

out.println("입니다.");

out.println("</body></html>");

}

}


4. 애노테이션으로 매핑하기

서블릿 2.5까지는 web.xml 파일에 서블릿으로 등록해주어야 서블릿 클래스를 사용할 수 있었는데, 서블릿 3.0 버전부터는 web.xml 파일에 따로 등록하지 않아도 @WebServlet 애노테이션을 사용하면 서블릿으로 자동으로 등록된다. 톰캣7 버전과 같이 서블릿 3.0을 지원하는 웹 컨테이너는 @WebServlet이 적용된 서블릿 클래스를 검색해서 사용할 서블릿으로 자동으로 등록해주는 기능을 제공하고 있다.

따라서, web.xml 파일에 따로 등록하지 않더라고 해당 클래스를 서블릿으로 사용할 수 있게 된다.


package mvjsp.chap20;

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;


@WebServlet(urlPatterns = "/hello")

// @WebServlet 애노테이션은 urlPattern 속성을 값으로 갖는데 이 속성은  해당 서블릿과 매핑될 URL 패턴을 지정할 째 사용된다.

위 코드의 경우 /hello로 들어오는 URL을 HelloServlet이 처리하도록 설정하고 있다.

이제 web.xml 파일에 별도의 설정을 하지 않더라도 HelloServlet을 실행할 수 있게 된다.

public class HelloServlet extends HttpServlet {


@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("euc-kr");

response.setContentType("text/html; charset=euc-kr");

PrintWriter out = response.getWriter();

out.println("<html>");

out.println("<head><title>인사</title></head>");

out.println("<body>");

out.println("안녕하세요, ");

out.println(request.getParameter("name"));

out.println("님");

out.println("</body></html>");

}

}

@WebServlet 애노테이션을 사용할 때 고려할 점은 서블릿이 범용적으로 사용되는 서블릿인지의 여부이다.

예를 들어, MVC 프레임워크는 어떤 URL을 서블릿이 처리할지 미리 할 수 없다. 단지, 다양한 요청 URL을 MVC 프레임워크가 처리할 수 있는 기능을 구현할 수 있을 뿐이다.

이 얘기는 @WebServlet 애노테이션을 사용할 경우 서블릿이 처리해야 할 URL 패턴이 변경될 때 마다, 자바 소스 코드의 urlPatterns 속성의 값을 변경하고 다시 컴파일해야 한다는 것이다. 반면 @WebServlet을 사용하지 않고 web.xml 파일을 사용할 경우 URL 경로가 바뀔 경우 web.xml 파일만 변경해주면 된다. 따라서, 서블릿의 용도에 따라서 @WebServlet 애노테이션을 사용할지 아니면 web.xml 설정을 사용할지를 알맞게 결정해야 한다.




'Programing > JSP/Servlet' 카테고리의 다른 글

[Servlet] 서블릿 이벤트  (0) 2014.12.18
[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10
[Servlet] 초기화 파라미터  (0) 2014.12.09
[Servlet] web.xml 주요 태그  (0) 2014.12.09