[펌글] ServletContext 이용하기

By | 8월 3, 2009

- 출처 : 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>
      <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 의 소스

package com.example;

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 의 소스

package com.example;

public class Dog {
    private String breed;
   
    public Dog(String breed) {
        this.breed = breed;
    }
   
    public String getBreed() {
        return breed;
    }
}

이제 브라우져가 호출할 서블릿인 com.example.ListenerTester 클래스 소스를 살펴보자.

4. ListenerTester 소스

package com.example;

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를 불러와서 형변환을 한 다음 사용하고 있다.

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments