# Table of Contents
# Servlet
Servlet
은 Java를 사용하여 웹 페이지를 동적으로 생성하는 서버측 컴포넌트다. 모든 Servlet은 HttpServlet
클래스를 상속한다.
// Controller.java
package com.yologger.app.controller;
import javax.servlet.http.HttpServlet;
public class Controller extends HttpServlet {
// ..
}
# Servlet URL Mapping
Servlet은 두 가지 방법으로 URL Mapping을 할 수 있다.
# @WebServlet 어노테이션
package com.yologger.app.controller;
import javax.servlet.http.HttpServlet;
import javax.servlet.annotation.WebServlet;
@WebServlet("/Controller")
public class Controller extends HttpServlet {
// ..
}
# 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"
id="WebApp_ID" version="3.1">
<!-- ... -->
<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>com.yologger.app.controller.Controller</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>/controller</url-pattern>
</servlet-mapping>
</web-app>
# Servlet의 동작 순서
- Client로 부터 요청이 들어오면 WAS는 Web Container와 Context를 생성한다.
- Web Container는 요청에 대한 HttpServletRequest, HttpServletResponse를 생성한다.
- Web Container는 web.xml의 Servlet 매핑 정보를 확인하여 어떤 Servlet을 생성할지 결정한다.
- Web Container는 Servlet이 한 번도 실행된 적이 없으면 Servlet의 인스턴스를 생성한다. 실행된 적이 있으면 Servlet을 재사용한다.
- Web Container는 요청을 처리하기 위한 Thread를 생성한다.
- Servlet의
doGet()
,doPost()
,service()
가 호출되며 인자로 HttpServletRequest, HttpServletResponse 객체가 전달된다. - 로직이 수행되면 HttpServletRequest, HttpServletResponse 객체를 소멸시키고 Thread를 종료한다.
# Servlet의 생명주기
Web Container는 Client의 요청에 따라 Servlet을 생성, 관리, 소멸한다. 이때 Servlet 클래스에 정의된 생명주기 함수가 호출된다.
Constructor
: Servlet 인스턴스가 생성될 때 최초 한 번 호출되는 생성자init()
: Servlet 인스턴스가 생성될 때 최초 한 번 호출되는 생명주기 함수doGet()
,doPost()
,service()
: Client에서 요청할 때 마다 호출되는 생명주기 함수doGet()
: HTTP GET 방식으로 요청할 때 호출doPost()
: HTTP POST 방식으로 요청할 때 호출service()
:doGet()
과doPost()
가 정의되지 않았을 때 호출
destroy()
: Servlet 인스턴스가 소멸될 때 한번 호출
package com.yologger.com;
import java.io.IOException;
import javax.servlet.ServletConfig;
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("/Controller")
public class Controller extends HttpServlet {
public Controller() {
// ..
}
@Override
public void init() throws ServletException {
// ..
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ..
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ..
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ..
}
@Override
public void destroy() {
// ..
}
}
# Servlet 선처리, 후처리
@PostConstruct
, @PreDestroy
어노테이션을 임의의 메서드에 추가하여 선처리, 후처리를 할 수 있다.
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@WebServlet("/Controller")
public class Controller extends HttpServlet {
@PostConstruct
public void postConstruct() {
// ...
}
@PreDestroy
public void preDestroy() {
// ...
}
}
# doGet()
HTTP GET 방식으로 요청을 하면 doGet()
메소드가 호출된다.
@WebServlet("/Controller")
public class Controller extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("Welcome.");
}
}
# doPost()
HTTP POST 방식으로 요청하면 doPost()
메소드가 호출된다.
// index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<body>
<form action="Controller" method="post">
<div>email: <input type="text" name="email"></div>
<div>password: <input type="text" name="password"></div>
<div>
hobbies:
<input type="checkbox" name="hobby" value="soccer"/>Soccer
<input type="checkbox" name="hobby" value="baseball"/>Baseball
<input type="checkbox" name="hobby" value="basketball"/>Basketball
</div>
<div>
sex:
<input type="radio" name="sex" value="man" checked/>Man
<input type="radio" name="sex" value="woman"/>Woman
</div>
<div>
nation:
<select name="nation">
<option value="Korea" selected>Korea</option>
<option value="Japan">Japan</option>
<option value="China">China</option>
</select>
</div>
<div>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</div>
</form>
</body>
</body>
</html>
@WebServlet("/Controller")
public class Controller extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String email = request.getParameter("email");
System.out.println("email: " + email);
String password = request.getParameter("password");
System.out.println("password: " + password);
String sex = request.getParameter("sex");
System.out.println("sex: " + sex);
String nation = request.getParameter("nation");
System.out.println("nation: " + nation);
String[] hobby = request.getParameterValues("hobby");
for (int i=0; i<hobby.length; i++) {
System.out.println(hobby[i]);
}
}
}