간단한 서블릿 구조와 예제
개요
- 웹 페이지를 동적으로 생성하기 위한 자바EE의 기능.
- Servlet은 Server Applet의 줄임말
- 동적으로 요청을 처리한다는 점에서 JSP와 비슷하지만, JSP는 HTML 코드안에 자바 코드를 포함하는 반면에 서블릿은 자바 코드 안에 HTML을 포함한다는 점에서 차이가 있다.
- 사실상 JSP도 Servlet으로 컴파일되기 때문에 근본적으로 둘은 동일.
서블릿 컨테이너
- 요청을 적절한 서블릿에 전달해주는 역할을 하는 서블릿을 서블릿 컨테이너라고 한다.
- 서블릿 3.0부터는 web.xml 없이 annotation 기반으로 서블릿을 작성할 수 있게 되었다.
Sequence
- 클라이언트로부터 요청을 받으면 요청을 처리하기 위한 HttpServletRequest, HttpServletResponse 객체를 생성하고, 이를 처리하기 위한 서블릿에 두 객체를 전달한다.
- 서블릿의 service 메소드를 호출하면, service 메소드 내에서 메소드에 따라 doGet, doPost를 호출한다. service를 override한 경우는 직접 처리를 하거나 부모 메서드를 직접 호출해저야 한다.
- 해당 메서드 내에서 동적 페이지를 렌더링한 뒤 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");
}
}