Undergoing

서블릿의 Life Cycle 본문

개발/Web Development

서블릿의 Life Cycle

Halkrine 2012. 5. 14. 09:35

graphics/11fig01.gif




서블릿의 생명 주기

(출처 : http://book.javanb.com/java-server-pages-2nd/0321150791_ch11lev1sec1.html)



웹 컨테이너에서는 다음과 같은 작업이 수행됨

1. 서브릿 클래스 읽음

2. 인스턴스화 되어 서블릿 객체 생성

3. 초기화 작업을 거친 후 서블릿 탄생 => 이 서블릿은 웹 브라우저로부터 호출 처리가 됨

4. 더 이상 사용되지 않는 서블릿은 제거됨


- init : 서블릿의 초기화 작업이 수행될 때 자동으로 호출되는 메서드

=> public void init() throws ServletException(){}

- destroy : 서블릿의 마무리 작업이 수행될 때 자동으로 호출되는 메서드

=> public void destroy(){}



------------------------------------------------- Servlet Part -------------------------------------------------


init 메서드를 이용한 자원 절약 예시(이 소스코드로는 인지하기 힘듦)


 fibonacci.java <= Servlet

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.math.BigInteger;


public class fibonacci extends HttpServlet 

{

private BigInteger arr[];

public void init()

{

arr = new BigInteger[100];

arr[0] = new BigInteger("1");

arr[1] = new BigInteger("1");

for(int cnt = 2 ; cnt < arr.length ; cnt++) arr[cnt] = arr[cnt-2].add(arr[cnt-1]);

}

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException 

{

request.setCharacterEncoding("euc-kr");

response.setCharacterEncoding("euc-kr");


String str = request.getParameter("NUM");

int num = Integer.parseInt(str);

if(num>100) num = 100;

response.setContentType("text/html;charset = euc-kr");

PrintWriter out = response.getWriter();

out.println("<HTML>");

out.println("  <HEAD><TITLE>피보나치 수열</TITLE></HEAD>");

out.println("  <BODY>");

for(int cnt = 0 ; cnt < num ; cnt++) out.println(arr[cnt] + " ");

out.println("  </BODY>");

out.println("</HTML>");

out.flush();

out.close();

}





destroy 메서드를 활용한 이름입력/로그저장 프로그램


 YourName.html

<html>

  <head>

    <title>이름 입력</title>

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="this is my page">

    <meta http-equiv="content-type" content="text/html; charset=EUC-KR">

    

    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->


  </head>

  

  <body>

    <h3>이름을 입력하십시오.</h3>

    <form action = greeting>

     이름 : 

    <input type = text name = NAME>

    <input type = submit value = '확인'>

    </form>

  </body>

</html> 

 GreetingServlet.java <= Servlet

import javax.servlet.http.*;

import javax.servlet.*;

import java.io.*;

import java.util.*;


public class GreetingServlet extends HttpServlet 

{

private PrintWriter logFile;

public void init() throws ServletException

{

try

{

logFile = new PrintWriter(new FileWriter("c:\\exer\\ch6\\data\\log.txt", true));

}

catch(IOException e)

{

throw new ServletException(e);

}

}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

{

String name = request.getParameter("NAME");

String greeting = "안녕하세요, " + name + "님.";

if(logFile != null)

{

GregorianCalendar now = new GregorianCalendar();

logFile.printf("%TF %TT - %s %n", now, now, name);

}

request.setCharacterEncoding("euc-kr");

response.setCharacterEncoding("euc-kr");

response.setContentType("text/html;charset = euc-kr");

PrintWriter out = response.getWriter();

out.println("<HTML>");

out.println("  <HEAD><TITLE>인사하긔</TITLE></HEAD>");

out.println("  <BODY>");

out.println(greeting);

out.println("  </BODY>");

out.println("</HTML>");

out.flush();

out.close();

}

public void destroy()

{

if(logFile != null) logFile.close();

}


지정된 경로에 저장되는 log.txt에는 입력한 날짜와 입력된 값이 저장됨


2012-05-14 10:59:34 - null 

2012-05-14 11:00:12 - null 

2012-05-14 11:00:30 - 김을동 

2012-05-14 11:00:38 - 김을동 

2012-05-14 11:00:58 - 김을동 

2012-05-14 11:01:44 - 김발동 

2012-05-14 11:01:55 - 김발동 





서블릿 초기화 파라미터를 사용하려면 위 코드를 다음과 같이 변경

GreetingServlet.java <= Servlet  

.

.

.

public class GreetingServlet extends HttpServlet 

{

private PrintWriter logFile;

public void init() throws ServletException

{

String filename = getInitParameter("FILE_NAME");

try

{

logFile = new PrintWriter(new FileWriter(filename, true));

}

catch(IOException e)

{

throw new ServletException(e);

}

}

.

.

.


web.xml도 다음과 같이 변경


 <servlet>

    <servlet-name>Greeting-Servlet</servlet-name>

    <servlet-class>GreetingServlet</servlet-class>

    <init-param>

    <param-name>FILE_NAME</param-name>

    <param-value>C:\\exer\\ch6\\data\\greeting_log.txt</param-value>

    </init-param>

  </servlet>



이 경우 파라미터의 값만(param-value) 바꿔주면 원하는 파일 생성 가능

--------------------------------------------------- JSP Part ---------------------------------------------------

- JSP에서는 init이나 destroy 둘 다 throw를 쓰지 않음.
- pubilc void jspInit(){}
- public void jspDestroy(){}

DateTime.jsp 

<%@ page contentType = "text/html; charset = euc-kr;" pageEncoding = "euc-kr"%>

<%@ page import = "java.io.*, java.util.*"%>


<%!

private PrintWriter logFile;

public void jspInit()

{

String filename = "c:\\exer\\ch6\\data\\datetime_log.txt";

try

{

logFile = new PrintWriter(new FileWriter(filename, true));

}

catch(IOException e)

{

System.out.printf("%TT - %s 파일을 열 수 없습니다. %n", new GregorianCalendar(), filename);

}

}

%>


<HTML>

<HEAD>

<TITLE>현재의 날짜와 시각</TITLE>

</HEAD>

<BODY>

<%

GregorianCalendar now = new GregorianCalendar();

String date = String.format("현재 날짜 : %TY년 %Tm월 %Te일", now, now, now);

String time = String.format("현재 시각 : %TI시 %TM분 %TS초", now, now, now);

out.println(date + "<BR>");

out.println(time + "<BR>");

if(logFile != null) logFile.printf("%TF %TT에 호출되었습니다. %n", now, now);

%>

</BODY>

</HTML>


<%!

public void jspDestroy()

{

if(logFile != null) logFile.close();

}

%>



실행하면 지정된 폴더에 있는 datetime_log.txt 파일에 기록됨


단, 이 방법은 앞에 있는 Servlet과 마찬가지로 경로를 수정할 때 소스코드를 뜯어야 하는 부담을 가져야 하므로 초기화 파라미터를 이용해 수정이 용이하게 할 수 있음


<web-app>

<servlet>

<servlet-name>filename-jsp</servlet-name>

<jsp-file>/filename.jsp</jsp-file>   <---- JSP 페이지의 본래 URL 경로명

<init-param>

<param-name>FILE_NAME</param-name>

<param-value>filename_txt</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>filename-jsp</servlet-name>

<url-pattern>/filename</url-pattern>   <---- JSP 페이지의 새로운 URL 경로명

</servlet-mapping>

</web-app> 


호출은 [String filename = getinitParameter("FILE_NAME");]  <--- FILE_NAME은 초기화 파라미터 이름


'개발 > Web Development' 카테고리의 다른 글

Expression Language  (0) 2012.05.18
ServletContext  (0) 2012.05.15
쿠키 입력과 삭제  (0) 2012.05.10
쿠키와 세션  (0) 2012.05.10
JSP 기초  (0) 2012.05.08