=======================
서블릿 라이프 사이클
=======================
- 서버는 서블릿을 적재하면 서버의 모든 요청을 다루기 위한 단일 인스턴스를 생성한다.
- 단일 인스턴스를 생성하므로 글로벌 변수를 생성시 요청에 의해 다시 초기화 되지
않는다. 그러므로 요청에 대한 변수의 동기화 문제 발생.
- 글로벌 변수로 선언한 경우 요청에 대한 쓰레드가 각각의 변수 접근은 에러의
발생요소가 된다. 따라서 동기화가 필수.
- 서블릿이 초기화 될 때 동적으로 로드 된 자바 서블릿들에 대한 생성자는 인수를
받아들이지 않는다. 따라서 새로운 서블릿에게 동적으로 로드됨과 동시에
초기화를 시켜주는 init( )이라는 메소드가 존재한다.
- 기본적으로 서버는 서블릿이 로드 될 때 init()메소드를 호출하고, 로드를
해제할 때 destory() 메소드를 호출한다.
- Init() 메소드는 결국 서블릿의 초기화를 위해 사용된다. 즉 새로운 서블릿에게
서버는 그 자체의 주요 정보를 제공하기 위해 Init() 메소드를 호출하며,
ServletConfig 인터페이스를 구현한 객체를 함께 전달한다.
- ServletConfig 객체는 Client에서 보내는 파라미터에 대한 정보와 Servlet의
상태 정보를 가지고 있는 ServletContext의 Instance를 갖고있다
(예 : JavaWebserver인 경우 init parameter를 등록과정에서 설정한다)
-------------------------------------
예제(서블릿을 이용한 파일 Counter
--------------------------------------
[myCounter.java]
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class myCounter extends HttpServlet {
int count;
public void init(ServletConfig config) throws ServletException {
super.init(config);
try {
FileReader fr = new FileReader("myCounter.dat");
BufferedReader br = new BufferedReader(fr);
String initial = br.readLine();
count = Integer.parseInt(initial);
return;
}
catch (FileNotFoundException ignored) {}
catch (IOException ignored) {}
catch (NumberFormatException ignored) {}
String initial = getInitParameter("initial");
try {
count = Integer.parseInt(initial);
return;
}
catch (NumberFormatException ignored) { }
count=0;
}
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
count++;
out.println("count ----> "+count);
}
public void destroy() {
saveState();
}
public void saveState() {
try {
FileWriter fw = new FileWriter("myCounter.dat");
String initial = Integer.toString(count);
fw.write(initial, 0, initial.length());
fw.close();
return;
}
catch (IOException e) {}
}
}