[WEB] 6. 서블릿(Servlet) 라이프 싸이클

gyrud02·2022년 1월 2일
0

이론(THEORY)

목록 보기
17/24

6. 서블릿(Servlet) 라이프 싸이클(생명주기)

1) Servlet 생명주기

servlet

WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인한다.
if (메모리에 없음) {

  • 해당 서블릿 클래스를 메모리에 올림 (객체 생성)
  • init() 메소드를 실행
    }
  • service()메소드를 실행
    was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행된다.

2) 실습코드 - LifecycleServlet.java

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;
       
 	// HttpServlet의 3가지 메소드를 오버라이딩
	// init()
	// service(request, response)
	// destroy()
 
    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 호출!!");		
	}
	
}
  • 처음 Run on Server를 하면 생성자 메소드를 우선으로 생성되고 init, service 메소드를 호출한다.
  • 한 번 생성된 이후 새로고침을 하면 service 메소드만 다시 호출한다.
  • destroy 메소드는 init 메소드의 내용을 수정하고 다시 런했을 경우 호출이 되는 것을 알 수 있다.
  • destroy 메소드를 호출한 후 다시 서블릿 생성, init, service 메소드를 호출한다.

3) 실습코드 - LifecycleServlet.java

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 {
		response.setContentType("text/html");
		PrintWriter out = response.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();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String name = request.getParameter("name");
		out.println("<h1> hello " + name + "</h1>");
		out.close();
	}

//	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//		System.out.println("service 호출!!");
//	}
//	
}

service(request, response) 메소드

HttpServlet의 service메소드는 템플릿 메소드 패턴으로 구현한다.

클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request, response)메소드를 호출
클라이언트의 요청이 Post일 경우에는 자신이 가지고 있는 doPost(request, response)를 호출

LifecycleServlet 수정 실습

Service(request, response)메소드 주석처리
HttpServlet의 doGet(request, response)메소드 오버라이딩
HttpServlet의 doPost(request, response)메소드 오버라이딩

profile
Back-End Engineer

0개의 댓글

관련 채용 정보