본문 바로가기

JSP/- 서블릿 (servlet)

JSP - 서블릿 1. 기초

1. 서블릿 개발 과정

 

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

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

3. 클래스 파일을 /WEB-INF/classes 폴더에 패키지에 맞게 위치시킨다.

4. web.xml 파일에 서블릿 클래스를 설정한다. (url 매핑)

5. 톰캣 등의 웹 컨테이너 실행

6. 웹 브라우저에서 결과 확인

 

ex) chap17/src/example/NowServlet.java

 

package example;

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 {

    @Override
    protected void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    	
        response.setContentType("text/html; charset=utf-8");
        
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>현재 시간</title></head>");
        out.println("<body>");
        out.println("현재 시간은");
        out.print(new Date());
        out.println("입니다.");
        out.println("</body></html>");
    }
}

 

 


2. 서블릿 클래스 작성 과정

 

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

 

 

② 상속 받았다면, HTTP 방식 (get, post) 에 따라 알맞은 매소드를 재정의(Override) 해서 구현한다.

 

만약 GET 방식의 요청을 처리해야 한다면, doGet() 메소드를 재정의하여 처리한다.

 

doGet() 메소드는 HttpServletRequest, HttpServletResponse 두 파라미터를 가지고, 이 두 파라미터는 각각

JSP의 request 기본 객체와 response 기본 객체에 해당된다.

 

재정의한 메소드는 request 를 이용해서 웹 브라우저의 요청 정보를 읽어오거나,

response 를 이용해서 응답을 전송할 수 있다.

 

 

③ 응답을 전송하려면 먼저 response.setContentType() 메소드를 이용해서 응답 컨텐츠의 타입을 지정한다.

 

response.setContentType("text/html; charset=utf-8");

 

컨텐츠 타입이 text/html 이고 캐릭터셋이 utf-8 으로 지정한다.

(JSP 에서 page 디렉티브의 contentType 속성값과 동일하다.)

 

 

④ 응답 결과를 웹 브라우저로 전송한다.

 

response.getWriter() 로 문자열 데이터를 출력할 수 있는 PrintWriter 를 구해야 한다.

 

PrintWriter out = response.getWriter();

 

out.println("<html>");

...

 

PrintWriter 는 println() 메소드를 제공, 메소드를 사용해서 전송할 응답 데이터를 전달한다.

전달한 데이터는 웹 브라우저에 전송되어 화면에 출력된다.

 

 

* 서블릿 자바 코드 직접 컴파일 하기

 

이클립스가 아닌 직접 톰캣 폴더에 직접 자바 소스를 생성한다면, 서블릿 클래스 컴파일 시

서블릿 API를 클래스 패스에 추가해야 한다.

(서블릿 관련 jar 파일은 [톰캣설치경로]\lib\servlet-api.jar)

 

ex) chap17\WEB-INF\src\example\NowServlet.java 로 작성 했을 시,

 

- 해당 WEB-INF 폴더로 이동한다.

 

c:\>cd [톰캣설치경로]\webapps\chap17\WEB-INF

 

- classes 디렉토리를 생성한다.

 

c:\..>mkdir classes

 

- 클래스패스를 지정한다.

 

c:\..>set CLASSPATH=c:\[톰캣설치경로]]\lib\servlet-api.jar

 

c:\..>set CLASSPATH=classes; %CLASSPATH%

 

- 컴파일을 수행한다.

 

c:\..>javac -d classes src\example\NowServlet.java

 

컴파일에 성공하면 WEB-INF\classes\example 폴더에 NowServlet.class 파일이 생성된다.

 

 

 


3. web.xml로 매핑하기

 

ex) NowServlet 클래스를 web.xml 파일에 등록하기

 

web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">
    
    <servlet>
        <servlet-name>now</servlet-name>
        <servlet-class>example.NowServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>now</servlet-name>
        <url-pattern>/now</url-pattern>
    </servlet-mapping>
</web-app>

 

서블릿을 web.xml 에 등록하려면 두 가지를 설정해야 한다.

 

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

- 서블릿과 URL 간의 매핑

 

<servlet> 태그를 사용해서 서블릿 클래스를 등록한다.

 

<servlet-name> 태그 : 해당 서블릿을 참조할 때 사용할 이름을 지정한다.

<servlet-class> 태그 : 서블릿으로 사용할 클래스의 완전한 이름(패키지 포함) 을 지정한다.

 

<servlet-mapping> 태그를 사용해서 매핑 정보를 등록한다.

 

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

<url-pattern> 태그 : 매핑할 URL 패턴을 지정한다.

 

따라서 URL 패턴으로 지정한 /now URL 을 입력하면, NowServlet 서블릿 클래스가 처리하게 된다.

 

http://localhost:8080/chap17/now

 

<url-pattern> 은 아래와 같이 한 번 이상을 사용할 수 있다.

각각의 URL 패턴에 해당 서블릿을 매핑할 수 있다.

 

<servlet-mapping>
    <servlet-name>now</servlet-name>
    <url-pattern>/now</url-pattern>
    <url-pattern>/now2</url-pattern>
</servlet-mapping>

 

/now, /now2 는 now 서블릿을 매핑하게 된다.

 

서블릿을 매핑할 때 사용하는 <url-pattern> 태그에 적용되는 주소는

웹 어플리케이션 경로(톰캣 경로 : webapps/chap17)를 제외한 나머지 경로를 기준으로 적용된다.

 

/now 가 실제 매핑되는 경로는 /chap17/now 가 된다.

 

 


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

 

서블릿 3.0 버전부터는 @WebServlet 어노테이션을 사용하면,

web.xml 파일에 따로 등록하지 않아도 서블릿으로 등록된다. (톰캣 7 이상 버전)

 

웹 컨테이너는 @WebServlet 어노테이션이 적용된 클래스를 검색해서 서블릿으로 자동으로 등록한다.

 

ex) chap17/src/example/HelloServlet.java

 

package example;

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")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html; charset=utf-8");
        
        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(urlPatterns = "/hello")

 

/hello 경로로 들어오는 URL 을 HelloServlet이 처리하도록 설정한다.

 

- HelloServlet 클래스를 컴파일한 뒤 톰캣을 재시작한다.

 

  이후 http://localhost:8080/chap17/hello URL 로 HelloServlet 을 실행할 수 있게 된다.

 

 

- 만약 두 개 이상의 URL 패턴을 처리하도록 하고 싶다면 아래와 같이 urlPatterns 속성값으로

  배열을 전달하면 된다.

 

@WebServlet(urlPatterns = {"/hello", "/hello1"} )

 

- @WebServlet 어노테이션 사용 시 고려할 점

 

  서블릿이 범용적으로 사용되는 서블릿인지의 여부

 

  예) MVC 프레임 워크는 어떤 URL을 서블릿이 처리할 지 미리 알 수 없다.

       단지 다양한 요청 URL을 MVC 프레임 워크가 처리할 수 있는 기능을 구현할 수 있을 뿐이다.

 

  따라서 @WebServlet 어노테이션을 사용할 경우, 서블릿이 처리해야 할 URL 패턴이 변경될 때마다,

  소스 코드의 urlPatterns 속성 값을 변경하고 다시 컴파일 해야하는 불편함이 생긴다!!

 

web.xml 을 사용할 경우, URL 경로가 변경될 경우, web.xml 파일만 변경하면 되지만

@WebServlet 을 사용할 경우, 컴파일을 다시해야 한다.

 

따라서 서블릿의 용도에 따라 @WebServlet, web.xml 을 사용할 지를 알맞게 결정해야 한다.

 

 

* @WebServlet 어노테이션이 적용된 서블릿을 web.xml 파일에 등록한다면?? (두 개 동시!!)

 

 이 경우에는 @WebServlet 어노테이션에 적용된 urlPatterns 의 URL 패턴과

 web.xml 파일에 등록된 URL 패턴에 모두 매핑된다.

 

@WebServlet 어노테이션이 적용된 클래스의 객체가 생성되고,

web.xml 파일에서 지정된 클래스의 객체가 생성된다.

 

따라서 서로 다른 두 개의 객체가 생성되고 각각 @WebServlet 어노테이션에서 지정한 

URL 패턴과, web.xml 에 지정한 URL 패턴에 매핑된다.

 

 


5. HTTP 각 전송방식 별 구현 메소드

 

HTTP 는 GET, POST, HEAD, PUT, DELETE 방식을 지원한다.

 

일반적으로 웹과 브라우저에서 사용되는 방식은 GET, POST 방식이다.

 

HttpServlet 클래스는 HTTP 방식에 따라 알맞은 메소드를 이용해서 구현하도록 정의하고 있다.

예) doGet() 메소드는 GET 방식을 처리, doPost() 메소드는 POST 방식을 처리하고 있다.

 

만약 GET, POST 방식을 모두 처리해야하는 경우, 두 메소드를 재정의(Override) 해서 처리한다.

 

GET 방식

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

    throws ServletException, IOException {

        ...  // GET 방식에 대한 처리, 예) 폼 출력하기

}

 

POST 방식

 

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

    throws ServletException, IOException {

        ...  // POST 방식에 대한 처리, 예) 폼 데이터 처리하기

}