▷ WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인한다.
▷ if (메모리에 없음) {
└ 해당 서블릿 클래스를 메모리에 올림 : 객체 생성 작업
└ init() 메소드를 실행 }
└ service() 메소드를 실행
▷ was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행된다.
package examples;
import java.io.IOException;
import java.io.PrintWriter;
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("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LifecycleServlet() {
System.out.println("LifecycleServlet 생성");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init test 호출");
}
public void destroy() {
System.out.println("destroy 호출");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
System.out.println("service호출");
}
}
▷ 실행하면 메모리에 없는 객체를 파악. 첫 실행이므로 destroy 메소드를 제외한 모든 서블릿 클래스를 메모리에 올리면서 메세지가 출력된다. : 'LifecycleServlet 생성' → 'init test 호출' → 'service 호출' 순으로 출력.
▷ 두 번째 실행에서는 'service 호출'만 출력. 첫 번째 실행에서 생성된 LifecycleServlet과 init 메소드는 실행되지 않는다.
▷ HttpServlet의 service 메소드는 템플릿 메소드 패턴으로 구현
└ 클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request response) 메소드를 호출.
└ 클라이언트의 요청이 POST일 경우에는 자신이 가지고 있는 doPost(request response) 메소드를 호출.
간단히 말하자면, URL 주소를 직접 입력하거나 링크를 클릭하는 것이 GET 방식(정적 웹페이지).
같은 코드가 실행되어도 사용자 요청에 따라 응답 결과가 달라지는 것이 POST 방식(동적 웹페이지).
package examples;
import java.io.IOException;
import java.io.PrintWriter;
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("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LifecycleServlet() {
System.out.println("LifecyleServlet 생성");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init 호출");
}
public void destroy() {
System.out.println("destroy 호출");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
out.println("<form method='post' action='/firstweb/LifecycleServlet'>");
out.println("name : <input type='text' name='name'><br>");
out.println("<input type='submit' value='ok'><br>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String name = req.getParameter("name");
out.println("<h1> hello " + name + "</h1>");
out.close();
}
}
▷ URL 주소창에 Servlet url이 입력되면서 GET 메소드가 호출된 결과.
<html>
<head><title>form</title></head>
<body>
<form method='post' action='/firstweb/LifecycleServlet'>
name : <input type='text' name='name'><br>
<input type='submit' value='ok'><br>
</form>
</body>
</html>
▷ Input 상자의 type은 text, 이름은 name이다. submit이라는 버튼의 값은 ok다.
▷ submit 버튼이 눌리면 action을 실행(해당 주소로 요청). 메소드는 'post'라는 값으로 넣어달라는 의미.
▷ URL에서 직접 요청을 하면 메소드 값이 GET으로 넘어가지만, 메소드를 post 값으로 넣어달라고 했기에 doGET()이 아닌 doPost() 메소드가 실행된다.