개요

  • 웹 페이지를 동적으로 생성하기 위한 자바EE의 기능.
  • Servlet은 Server Applet의 줄임말
  • 동적으로 요청을 처리한다는 점에서 JSP와 비슷하지만, JSP는 HTML 코드안에 자바 코드를 포함하는 반면에 서블릿은 자바 코드 안에 HTML을 포함한다는 점에서 차이가 있다.
  • 사실상 JSP도 Servlet으로 컴파일되기 때문에 근본적으로 둘은 동일.

서블릿 컨테이너

  • 요청을 적절한 서블릿에 전달해주는 역할을 하는 서블릿을 서블릿 컨테이너라고 한다.
  • 서블릿 3.0부터는 web.xml 없이 annotation 기반으로 서블릿을 작성할 수 있게 되었다.

Sequence

  1. 클라이언트로부터 요청을 받으면 요청을 처리하기 위한 HttpServletRequest, HttpServletResponse 객체를 생성하고, 이를 처리하기 위한 서블릿에 두 객체를 전달한다.
  2. 서블릿의 service 메소드를 호출하면, service 메소드 내에서 메소드에 따라 doGet, doPost를 호출한다. service를 override한 경우는 직접 처리를 하거나 부모 메서드를 직접 호출해저야 한다.
  3. 해당 메서드 내에서 동적 페이지를 렌더링한 뒤 HttpServletResponse 객체에 전달하면 서블릿 컨테이는 해당 클라이언트에게 응답을 전달한다.

HelloWorld

WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <description>Hello World Servlet</description>
        <display-name>Hello World</display-name>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>example.HelloWorld</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

HelloWorld.java

package example;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }

    //이 경우 doGet, doPost는 동작하지 않는다. 
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("hello");
    }

    @Override
    public void destroy() {
        getServletContext().log("destroy() called");
    }

}