티스토리 뷰

수업에 앞서

 

- 서블릿 생명주기를 확인할 수 있는 LifecycleServlet을 작성

- HttpServlet의 3가지 메소드를 오버라이딩

init()

service(request, response)

destroy()

 

 

 

프로젝트 생성(name : lifecycle) -> lifcycle 오른쪽 클릭 -> new -> servlet

 

java pakage: examples

class name : LifecycleServlet

 

-> next

 

URL mappings 그대로

 

-> next

 

doGet(), doPost() 체크해제

init(), destory(), service() 체크

-> 생성

 

아래와 같이 코드 작성

 

LifecycleServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package examples;
 
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("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public LifecycleServlet() {
        System.out.println("LifecycleServlet 생성!!");
        // TODO Auto-generated constructor stub
    }
 
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init 호출!!");
    }
 
    
    public void destroy() {
        System.out.println("destroy 호출!!");
    }
 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("service 호출!!");
    }
 
}
cs

 

실행시키면 콘솔창에

 

LifecycleServlet 생성!!
init 호출!!
service 호출!!

이 출력된다.

 

그 후 새로고침, 다른 브라우저에서 접속하면

service 호출!!

만 호출된다.

 

그리고 inti() 함수의 내용을

1
System.out.println("init 호출!!");
cs

로 수정 후 저장하면

 

잠시후 destroy 호출!! 이 출력된다.

그리고 새로고침 or 브라우저 접속하면

LifecycleServlet 생성!!
init 호출!!
service 호출!!

이 다시 출력된다.

 

 

 

서버가 요청을 받고 url mapping을 확인 한 후 LifecycleServlet으로 이동

LifecycleServlet.java에 있는 메소드들이 메모리에 있는지 확인하고, 없다면 메모리에 생성한다.

 

서블릿은 서버에 서블릿 객체를 여러개 만들지 않는다. 요청이 여러번 들어오면 매번 생성하고 반복하는게 아니라

실제 요청된 객체가 메모리에 있는지 없는지 확인하고 없으면 새로 생성, 있으면 service만 호출한다.

 

즉, 요청이 들어왔을때 응답해야하는 모든 내용들은 서비스에 구현해야한다.

was가 종료되거나 웹 어플리케이션이 새롭게 갱신될 경우 destroy()메소드가 실행된다.

 

 

======================================================================================

 

 

Servlet 생명주기

  • WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인합니다.
  •  if (메모리에 없음) {
     - 해당 서블릿 클래스를 메모리에 올림
     - init() 메소드를 실행
    }
     - service()메소드를 실행
  • was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행됩니다.

 

 

*그럼 앞 시간에 doGet이란 함수는 어떻게 실행된걸까..?

 

service(request, response) 메소드

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

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

 

즉, 내가 service를 구현하지 않았다면 서블릿의 부모클래스인 HttpServlet에 구현된 service 메소드를 호출한다.

 

*실습

Source -> Override/Implements Methods -> doGet(),doPost() 체크 후 확인

Service메소드는 주석처리

 

그리고 아래처럼 작성

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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"); //name 값을 알아내 String name에 담는다
        out.println("<h1> hello " + name + "</h1>"); //결과출력
        out.close();
    }
 
//    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        System.out.println("service 호출!!");
//    }
//    
    
 
}
cs

 

실행 후 소스보기

 

1
2
3
4
5
6
7
8
9
10
11
<html>
<head><title>form</title></head>
<body>
<form method='post' action='/lifecycle/LifecycleServlet'> -> action='/firstweb/LifecycleServlet'로 요청이 들어 갈때, 메소드는 post라는 값으로 넣어주세요(위의 설명 요청이 GET일 경우, Post일 경우)
name : <input type='text' name='name'><br>     
<input type='submit' value='ok'><br>
</form>
</body>
</html>
 
 
cs

 

요청이 post로 들어왔기 때문에 doPost 메서드를 실행시킨다.

 

참고 사이트 : http://www.edwith.org/



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.

' > 부스트코스' 카테고리의 다른 글

[WEB]Element가 배치되는 과정  (0) 2018.05.20
[WEB]Request, Response 객체 이해하기  (1) 2018.05.20
[WEB]Servlet 작성 방법  (0) 2018.05.20
[WEB]Servlet이란?  (0) 2018.05.17
[WEB]HelloWorld 서블릿 컴파일 및 실행하기  (0) 2018.05.17
댓글