- 출처 : http://www.4te.co.kr/542 -
ServletConfig는 해당 서블릿에서만 사용할 수 있지만 Web App 내에서 공통적인 내용을 가져다 사용하려면 ServletContext를 사용할 수 있다.
ServletContext는 ServletConfig와 마찬가지로 web.xml을 사용하며, 따라서 바로 사용하려면 String만 사용할 수 있다.
하지만, ServletContextListener를 이용하면 객체 역시 Web App 전역에서 사용할 수 있다.
ServletContextListener는 서블릿이 로딩 되기 전, 컨테이너(ex:톰캣) 차원에서 initialize 하고 destroy 하게 하는 것이다.
따라서 이 속성을 이용해서 컨테이너가 ServletContextListener를 로딩할 때 context-param을 추가한 후, 기타 다른 servlet에서 그 후에 해당 객체를 가져다 쓰는 것이다.
말로 설명하기가 힘든 부분이 있으니 Head First Servlet & JSP에 나와 있는 예제를 살펴보도록 하자.
1. web.xml
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.example.ListenerTester</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenTest.do</url-pattern>
</servlet-mapping>
<context-param>
<param-name>breed</param-name>
<param-value>Great Dane</param-value>
</context-param>
<listener>
<listener-class>
com.example.MyServletContextListener
</listener-class>
</listener>
위 내용에서 볼 수 있듯이 브라우져에서 요청할 url은 http://localhost:8080/ListenTest.do 이며 맵핑 된 com.example.ListenerTester 서블릿을 호출하게 된다.
중용한 것은 위 xml 중에서 listener 부분이다.
컨테이너(톰캣)가 처음 로딩 될 때 com.example.MyServletContextListener 클래스를 호출하게 되며 MyServletContextListener 는 ServletContextListener를 implements 하게 된다.
implements 해야 하는 메소드로는 contextInitialized와 contextDestroyed이다.
MyServletContextListener 의 소스는 아래와 같다.
2. MyServletContextListener 의 소스
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
// TODO Auto-generated method stub
ServletContext sc = event.getServletContext();
String dogBreed = sc.getInitParameter("breed");
Dog d = new Dog(dogBreed);
sc.setAttribute("dog", d);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
// TODO Auto-generated method stub
}
}
contextInitialized 부분에서 setAttribute 메소드를 이용해서 dog라는 param-name에 dog라는 객체를 param-value로 할당하고 있다.
contextInitialized에서 사용된 Dog 클래스의 소스는 다음과 같다.
3. Dog 의 소스
public class Dog {
private String breed;
public Dog(String breed) {
this.breed = breed;
}
public String getBreed() {
return breed;
}
}
이제 브라우져가 호출할 서블릿인 com.example.ListenerTester 클래스 소스를 살펴보자.
4. ListenerTester 소스
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ListenerTester extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("test context attribute set by listener<br>");
out.println("<br>");
Dog dog = (Dog) getServletContext().getAttribute("dog");
out.println("Dog's bread is : " + dog.getBreed());
}
}
위 내용에서 볼 수 있듯이 getServletContext().getAttribute("dog")로 param-name이 dog인 객체 d를 불러와서 형변환을 한 다음 사용하고 있다.