참고글
톰캣(서블릿 컨테이너) 시작시 Servlet 초기화 되도록 설정하기
우리가 작성해 놓은
Servlet
이 객체화 되어 생성되는 시점은 사용자로부터 최초의 요청이 발생할 때 입니다. 서블릿은 생성과정에서 init()
메서드가 실행됩니다. 그런데 사용자의 요청 여부에 관계없이 서블릿 컨테이너(톰캣)가 시작됨과 동시에 서블릿의 생성과 초기화를 진행하고 싶을 수 있습니다.이경우
web.xml
에 초기화를 원하는 서블릿에 대해서 <load-on-startup>
태그를 설정해주거나 @WebServlet
어노테이션을 사용하는 경우 loadOnStartUp
속성값을 지정해주면 됩니다.다음은 web.xml에
<load-on-startup>
태그를 사용한 예시입니다. 서블릿 컨테이너가 시작될때 web.xml을 읽게 되고 <load-on-startup>
가 0이상의 정수값으로 설정되어 있는 경우 해당 서블릿의 인스턴스를 생성하고 init()
을 호출합니다. <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>servlet.HelloServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> | cs |
우선순위
만약 여러 서블릿들간에 초기화 우선순위가 필요한 경우
<load-on-startup>
에 할당한 값이 0
에 가까울수록 먼저 초기화가 진행됩니다. 만약 여러 서블릿 사이에 <load-on-startup>
값이 동일한 경우 web.xml
에 먼저 선언된 서블릿이 먼저 초기화됩니다. <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>servlet.HelloServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>HelloServlet2</servlet-name> <servlet-class>servlet.HelloServlet2</servlet-class> <load-on-startup>0</load-on-startup> </servlet> | cs |
실습예제
예제 프로젝트는 다음과 같습니다. 서블릿이 톰캣 시작과 동시에 초기화 되도록 web.xml에 설정하도록 하겠습니다.
HelloServlet2.java
는 HelloServlet.java
를 복사하여 클래스명만 2를 추가한것입니다.
HelloServlet.java, HelloServlet2.java
init()
메서드(초기화)에서 web.xml
에 설정한 초기화 파라미터 greeting
값을 출력하도록 하였습니다. HelloServlet2.java
클래스의 내용은 클래스명만 빼고 모두 동일합니다.package servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //@WebServlet("/HelloServlet") public class HelloServlet extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { String greeting = config.getInitParameter("greeting"); System.out.println(greeting); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<h1>Hello World</h1>"); } } | cs |
web.xml
두개의 서블릿에 각각
<load-on-startup>
태그를 통해 톰캣 시작시 초기화 되도록 하였습니다. HelloServlet2가 HelloServlet보다 먼저 초기화되도록 0
으로 지정해 주었습니다.<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>servlet.HelloServlet</servlet-class> <init-param> <param-name>greeting</param-name> <param-value>안녕하세요 11111</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>HelloServlet2</servlet-name> <servlet-class>servlet.HelloServlet2</servlet-class> <init-param> <param-name>greeting</param-name> <param-value>안녕하세요 22222</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> </web-app> | cs |
테스트
톰캣을 시작하고 console을 보게되면 다음과 같이 두개의 서블릿이 지정해준 우선순위에 따라 초기화 된것을 볼 수 있습니다.
@WebServlet 사용시
만약 서블릿 설정시
@WebServlet
어노테이션을 이용한 경우라면 다음과 같이 loadOnStartUp
속성을 사용하면 됩니다.@WebServlet( name="HelloServlet", urlPatterns="/hello", loadOnStartup = 1) public class HelloServlet extends HttpServlet { | cs |
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] 서블릿 맵핑시 url-pattern 규칙 (0) | 2019.08.02 |
---|---|
[서블릿/JSP] Tomcat 재시작시 세션 유지/제거 설정하기 (0) | 2019.08.01 |
[서블릿/JSP] Tomcat에 war 파일 배포하기 (0) | 2019.07.30 |
[서블릿/JSP] Part를 이용한 파일 업로드시 Unable to process parts as no multi-part configuration has been provided 오류 (0) | 2019.07.27 |
[서블릿/JSP] Servlet 3.0에서 Part API를 통한 파일업로드 구현하기 (2) | 2019.07.26 |