2014년 4월 6일 일요일

[Servlet/Jsp] headFirst - Ch5 - listener, attribute


0. 환경

macbook-pro 13” 2012 mid / 10GB
tomcat7
교재: Head First Servlet/Jsp, 한빛미디어, 2012


1. 학습목표

1) ServletContext 초기화 파라미터
2) 서블릿 속성 생존범위
3) 웹 컨테이너 요청 처리 모델
4) 웹 컨테이너 생명주기 이벤트 모델
5) ResquestDispacher 매커니즘


2. 서블릿 초기화 파라미터

  • 서블릿도 초기화 파라미터가 존재
  • Container가 서블릿을 초기화할 때 단 한번만 초기화 파라미터를 읽음
  • 이름/값 쌍이 ServletConfig안에 기록시 서블릿이 다시 배포되지 않는 한 DD를 수정해도 바뀌지 않음

실행 흐름

  1. Container는 DD를 읽음
  2. Container는 새로운 ServletConfig 인스턴스 생성 (서블릿당 하나씩)
    • 서블릿 생성자에서는 이 메소드를 호출할 수 없음
  3. Container는 init-param에 있는 값들을 이름-값 쌍으로 읽음
  4. Conatiner는 ServletConfig 객체에 이름-값으로 된 초기화 파라미터 설정
  5. Container는 XXXServlet.class 인스턴스 생성
  6. Container는 ServletConfig의 참조를 인자로 Servlet의 init() 메소드 호출

ServletConfig

초기화 파라미터에 접근할 수 있는 능력

javax.servlet.ServletConfig

public abstract interface ServletConfig {

    // context정보 (Servlet 설정정보)를 담고 있는 ServletContext를 반환
    public abstract ServletContext getServletContext();
    public abstract String getInitParameter(String);
    public abstract Enumeration getInitParameterNames();
    public abstract String getServletName();
}

DD (Web.xml)

<servlet>
    <servlet-name>Tests</servlet-name>
    <servlet-class>TestInitParams</servlet-class>

    <!-- DD의 <servlet>항목 안에 <init-param>으로 작성 -->
    <init-param>
        <param-name>adminEmail</param-name>
        <param-value>dec7@abc.com</param-value>
    </init-param>
</servlet>

Servlet 코드

// ServletConfig getServletConfig ();
// 모든 servlet은 상속받은 getServletConfig() 메소드를 가짐
out.println(getServletConfig().getInitParameter("adminEmail"));

3. 컨텍스트 초기화 파라미터

모든 웹 어플리케이션에서 이용할 수 있음 (JSP, Servlet)
ServletContext와 ServletConfig는 다른 객체로 다른 이름공간을 이용

실행흐름

  1. Container는 DD를 읽음
  2. 항목을 읽고 각각의 이름-값 쌍을 만듦
  3. Container는 ServletContext 객체를 생성
  4. Container는 생성한 컨텍스트 초기화 파라미터 이름-값에 대한 참조를 init() 인자로 전달
  5. Web Application에 있는 모든 Servlet과 JSP는 ServletContext에 접근 가능

ServletContext

javax.servlet.ServletContext

public abstract interface jServletContext {
  public static final String TEMPDIR = "javax.servlet.context.tempdir";
  public static final String ORDERED_LIBS = "javax.servlet.context.orderedLibs";

  public abstract String getContextPath();
  public abstract jServletContext getContext(String);
  public abstract int getMajorVersion();
  public abstract int getMinorVersion();
  public abstract int getEffectiveMajorVersion();
  public abstract int getEffectiveMinorVersion();
  public abstract String getMimeType(String);
  public abstract Set getResourcePaths(String);
  public abstract URL getResource(String) throws MalformedURLException;
  public abstract InputStream getResourceAsStream(String);
  public abstract RequestDispatcher getRequestDispatcher(String);
  public abstract RequestDispatcher getNamedDispatcher(String);
  public abstract jServlet getServlet(String) throws jServletException;
  public abstract Enumeration getServlets();
  public abstract Enumeration getServletNames();
  public abstract void log(String);
  public abstract void log(Exception, String);
  public abstract void log(String, Throwable);
  public abstract String getRealPath(String);
  public abstract String getServerInfo();
  public abstract String getInitParameter(String);
  public abstract Enumeration getInitParameterNames();
  public abstract boolean setInitParameter(String, String);
  public abstract Object getAttribute(String);
  public abstract Enumeration getAttributeNames();
  public abstract void setAttribute(String, Object);
  public abstract void removeAttribute(String);
  public abstract String getServletContextName();
  public abstract jServletRegistration.Dynamic addServlet(String, String);
  public abstract jServletRegistration.Dynamic addServlet(String, jServlet);
  public abstract jServletRegistration.Dynamic addServlet(String, Class);
  public abstract jServlet createServlet(Class) throws jServletException;
  public abstract jServletRegistration getServletRegistration(String);
  public abstract Map getServletRegistrations();
  public abstract FilterRegistration.Dynamic addFilter(String, String);
  public abstract FilterRegistration.Dynamic addFilter(String, Filter);
  public abstract FilterRegistration.Dynamic addFilter(String, Class);
  public abstract Filter createFilter(Class) throws jServletException;
  public abstract FilterRegistration getFilterRegistration(String);
  public abstract Map getFilterRegistrations();
  public abstract SessionCookieConfig getSessionCookieConfig();
  public abstract void setSessionTrackingModes(Set);
  public abstract Set getDefaultSessionTrackingModes();
  public abstract Set getEffectiveSessionTrackingModes();
  public abstract void addListener(String);
  public abstract void addListener(EventListener);
  public abstract void addListener(Class);
  public abstract EventListener createListener(Class) throws jServletException;
  public abstract descriptor.JspConfigDescriptor getJspConfigDescriptor();
  public abstract ClassLoader getClassLoader();
  public abstract void declareRoles(String...);
  public abstract String getVirtualServerName();
}

DD (Web.xml)

<servlet>
    <servlet-name>Tests</servlet-name>
    <servlet-class>TestInitParams</servlet-class>
</servlet>

<!-- 전체 어플리케이션을 위한 항목 / <web-app> 항목에 포함 -->
<context-param>
    <param-name>adminEmail</param-name>
    <param-value>dec7@abc.com</param-value>
</context-param>

Servlet Code

out.println ( getServletContext().getInitParameter("adminEmail") );

4. Listener

컨텍스트 초기화가 이루어질 때 파라미터를 읽은 뒤 특정 코드를 실행시키고 싶을 때

실행흐름

  1. Container는 DD를 읽음
    • context-param, listen
  2. Container는 Application에 공유할 ServletContext 객체 생성
  3. Container는 컨텍스트 초기화 파라미터의 이름-값 String쌍을 만듦
  4. Container는 String쌍을 ServletContext객체에 설정
  5. Container는 ServletContextListener를 상속받아 만든 Class를 인스턴스화 시킴
  6. Container는 contextInitialized()메소드를 호출하고 인자로 ServletContextEvent를 전달
    • ServletContextEvent 객체를 이용하여 ServletContext에 접근
    • ServletContext로 컨텍스트 초기화 파라미터 값을 읽음
  7. Listener가 ServletContextEvent에게 ServletContext에 대한 참조를 요청
  8. Listener가 ServletContext에게 초기화 파라미터의 값을 요청
  9. Listener는 초기화 파라미터를 이용해 객체를 생성
  10. Listener는 ServletContext.setAttribute(“newObj”, obj)를 이용하여 생성된 객체를 설정
  11. Container는 새로운 Servlet을 생성
    1. 초기화 파라미터로 ServletConfig 생성
    2. ServletContext에 대한 참조를 설정
    3. Servlet init() 메소드 호출
  12. Servlet은 요청을 받고 ServletContext에게

Written with Dec7.

댓글 없음:

댓글 쓰기