load-on-startup1/load-on-startup에 대한 내용
알프레드
지금 부터 쓰는 내용은 질문겸 강좌? 도 될듯 합니다. 틀린점이 있으면 지적 받고 싶기때문입니다.
load-on-startup 에 대해 확실한 계념이 없기때문에 이렇게 올립니다. 맞는 내용일수도 있고 틀린내용일수도 있습니다.
핑크 수다님께는 이자리에 올리는점 양해 부탁드립니다.
서블릿의 생명주기 는
1) init() 메소드로 서블릿을 초기화 하게되어있습니다. (딱한번호출)
2)그리고 service() 메소드를 통해 요청에 대한 처리를 하게 되어있구요
3)톰캣 서버가 종료될때 destory() 메소드가 호출되게 되어 있습니다.
그러면 우리는 init() 메소드를 사용자가 호출한적이 있느냐에 대한 생각을 해보아야 합니다.
정답은 없다 입니다.
그럼 init()메소드는 누가 호출하느냐 에 대한 답은 서블릿 컨테이너(톰캣서버)가 알아서 호출해주게 되는것이지요
그럼 init() 메소드는 딱 한번 호출 된다고 했는데 자바문법의 생성자와 똑같다는것을 생각할수 있습니다.
그렇다면 이런 가정을 할수 있습니다. 서버는 해당 서블릿클래스에 대한 요청이 왔을때 저 init() 메소드를 한번만 호출하게 되어있습니 다. 그다음부터는 service() 메소드를 호출해서 계속 서비스를 하게 되어 있지요.서론이 길었는데요..
본론은 load-on-startup 태그의 역활은 무엇이냐 하는건데요...
저건 해당 서블릿의 초기화(init()메소드의 호출)를 언제해라 라는 의미가 되는것입니다. 저값이 음수이면 처음 처음으로 해당 서블릿에 요청이 왔을때... 이구요
정수일 경우는 숫자가 낮을수록 빨리 실행하게 되는것입니다. (아마도 0 은 젤 마지막인거 같습니다.)
load-on-startup1/load-on-startup // test서블릿
load-on-startup2/load-on-startup//test2 서블릿
이런식으로 되어 있다면 test서블릿의 init() 메소드가 먼저 호출되게 되는것이죠.. 호출되는 시점은 톰캣 기동시에 호출 되게 됩니다.
자! 이제 부터 증명에 들어가보죠...
========================test.java============================================
package action;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.servletexception;
import javax.servlet.servletconfig;
import javax.servlet.servletcontext;
import java.io.*;
public class test extends httpservlet{
public void init()throws servletexception{
system.out.println(터스트 서블릿실행합니다.);
}
public void doget(httpservletrequest request,httpservletresponse response)
throws servletexception,ioexception{
response.sendredirect(http://daum.net);
}
public void destroy(){
system.out.println(테스트 서블릿 종료합니다.);
}}
=======================test2.java===============================================
package action;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.servletexception;
import javax.servlet.servletconfig;
import javax.servlet.servletcontext;
import java.io.*;
public class test2 extends httpservlet{
public void init()throws servletexception{
system.out.println(터스트2 서블릿실행합니다.);
}
public void doget(httpservletrequest request,httpservletresponse response)
throws servletexception,ioexception{
response.sendredirect(http://naver.com);
}
public void destroy(){
system.out.println(테스트2 서블릿 종료합니다.);
}}
============================web.xml============================================
servletservlet-nametest/servlet-name
servlet-classaction.test/servlet-class
load-on-startup1/load-on-startup
/servlet
servlet
servlet-nametest2/servlet-name
servlet-classaction.test2/servlet-class
load-on-startup2/load-on-startup
/servlet
servlet-mapping
servlet-nametest/servlet-name
url-pattern*.test/url-pattern
/servlet-mapping
servlet-mapping
servlet-nametest2/servlet-name
url-pattern*.test2/url-pattern
/servlet-mapping
===============파일은 이렇게 설정되어 있습니다.=================================
이렇게 해놓고 실행을 해보면 터스트2 서블릿실행합니다 라는 문자열이 톰캣의 콘솔창에 찍힌후에
터스트 서블릿실행합니다 라는 문자열이 찍히는걸 확인 할수 있을겁니다.
load-on-startup /load-on-startup 태그안의 숫자를 서로 바꿔보시면 출력되는 순서가 바뀌는것을
확인 할수 있을겁니다.
즉 load-on-startup 태그는 해당 서블릿의 init() 메소드가 호출되는 시기와 순서를 정한다고 생각 하면 될듯합니다.
틀린점있으면 지적해주시기 바랍니다.
긴글 읽어 주셔서 감사합니다.
-
엘핀
흠.. 셋팅되어 있는 환경에서만 작업을 해봐서 몰랐는데 이렇게 간결하게 정리르 해주시다니 감사합니다.
-
그림자
맞습니다. 서블릿 사이의 초기화 순서도 중요하겠지만, load-on-startup을 사용하는 목적도 중요하겠지요.