2013년 9월 7일 토요일

[Head First]Servlets & JSP 내용정리-5장

Chapter.05 서블릿은 독불장군이 아니다.

서블릿 초기화 파라미터
  • 관련 클래스 javax.servlet.SevrletConfig
  • 서블릿 하나 마다 한개 생성됨.
  • 컨테이너를 DD에서 초기화 파라미터 정보를 읽어서 ServletConfig에게 넘기고 서블릿을 초기화 할때 init() 메소드에 넘김
  • 초기화 할때 단 한번만 서블릿 파라미터를 읽는다. (그러므로 변경을 하고 적용할때 컨테이너를 재구동해야 함.)
  • JSP에서 서블릿 파라미터 접근방법
    • request에 속성을 추가하여 전달 방식
서블릿 초기화 파라미터 web.xml (DD) 설정 예
<web-app ...>
 <servlet>
 -----------
 컨테이너가 관리하는 서블릿 클래스에 대한 정보를 알수 있음.
   <servlet-name>Chapter1 Servlet</servlet-name>
   <servlet-class>Ch1Servlet</servlet-class>
   <init-param>
   -------------
   서블릿 하위에 존재한다는 것에 주의 (getServletConfig() 메소드와 관련)
      <param-name>adminEmail</param-name>
      -----------------------------------
      파라미터 이름 (getServletConfig().getInitParameter(“adminEmail”))
      <param-value>cosmoslight.huni@gmail.com</param-value>
      -----------------------------------------------------
      파리미터 값
   </init-param>
 </servlet>
</web-app>

컨텍스트 초기화 파라미터
  • 관련 클래스 javax.servlet.ServletContext
  • 모든 웹 에플리케이션에서 이용할 수 있음.
  • 관련 메소드 getServletContext().getInitParameter(“$para_name”);
  • 웹 애플리케이션 당 하나
  • 동적으로 설정 불가능
  • 배포시 정해진 상수
  • JSP에서 내장된(implicit) 형태로 접근
  • ServletContext 얻는 방법
    1. getServletConfig().getServletContext();
    2. this.getServletContext();
  • ServletContext Interface (javax.servlet) :
    • 초기화 파라미터 및 속성 관련 메소드
      • getInitParameter(String)
      • getInitParameterNames()
      • getAttribute(String)
      • getAttributeNames()
      • setAttribute(String , Object)
      • removeAttribute(String)
    • 서버/컨테이너 정보
      • getServerInfo()
      • getMajorVersion()
    • 기타
      • getRealPath()
      • getResourceAsString(String)
      • getRequestDispatcher(String)
      • log(String)
컨텍스트 초기화 파라미터 web.xml (DD) 설정 예
<web-app ...>
 <context-param>
 ---------------
    <param-name>adminEmail</param-name>
    -----------------------------------
    파라미터 이름 (getServletContext().getInitParameter(“adminEmail”))
    <param-value>cosmoslight.huni@gmail.com</param-value>
    -----------------------------------------------------
    파리미터 값
 </context-param>
</web-app>

ServletContextListener
  • 역할 : ServletContext 생성(초기화)과 소멸 이벤트를 받을 수 있다.
  • 패키지명 : javax.servlet
  • 용도 : 켄텍스트 전체에 대한 초기화작업을 하거나 종료시 작업을 수행 할 수 있다.

컨텍스트 리스너 설정 web.xml (DD) 설정 예
<web-app ...>
 <listener>
   <listener-class>
     com.example.MyServletContextListener
   </listener-class>
 </listener>
</web-app>

리스너 8 종
시나리오
리스너 인터페이스
이벤트 타입
웹 애플리케이션 컨텍스에 속성을 추가/제거/수정 했는지 알고 싶을때
javax.servlet
ServletContextAttributeListener
  • attributeAdded
  • attributeRemoved
  • attributeReplaced
ServletContextAttributeEvent
얼마나 많은 사용자가 동시에 접속하고 있는지 알고 싶을 때  즉 현재 Active된 Session 정보를 알고 싶을 때
javax.servlet.http
HttpSessionListener
  • sessionCreated
  • sessionDestroyed
HttpSessionEvent
요청이 들어올 때마다 이 사실을 알 수 있을까?
javax.servlet
ServletRequestListener
  • requestInitialized
  • requestDestroyed
ServletRequestEvent
Request 속성(attribute)이
추가/제거/수정 되었는지 알고 싶을때
javax.servlet
ServletRequestAttributeListener
  • attributeAdded
  • attributeRemoved
  • attributeReplaced
ServletRequestAttributeEvent
속성 객체가 하난 있는데, 이 타입의 객체가 세션에 바인딩 되었는지 아니면 제거됐는지 알고 싶을 때
javax.servlet.http
HttpSessionBindingListener
  • valueBound
  • valueUnbound
HttpSessionBindingEvent
세션 속성이 추가/제거/수정 되었는지 알고 싶을 때
javax.servlet.http
HttpSessionAttributeListener
  • attributeAdded
  • attributeRemoved
  • attributeReplaced
HttpSessionBindingEvent
컨텍스트가 생성/소멸 되었는지 알고 싶을 때
javax.servlet
ServletContextListener
  • contextCreated
  • contextDestroyed
ServletContextEvent
속성 객체가 세션에 바인딩한 이 타입의 객체가 다른 JVM으로 옮겨 갔는지
javax.servlet.http
HttpSessionActivationListener
  • sessionDidActive
  • sessionWillPassivate
HttpSessionEvent

속성이란
3개의 서블릿 API 객체(ServletContext,HttpServletRequest(또는 ServletRequest),httpSession 객체 중 하나에 설정해놓는(바인딩) 객체를 말합니다. 저장형태는 Map(K,V) 라고 생각해도 무방

속성과 파라미터의 차이(표)
항목
속성
파라미터
타입
Application/context
Request
Session
Application/context 초기화 파라미터
Request 파라미터
Servlet 초기화 파라미터
설정 메소드
setAttribute(String name,Object value)
애플리케이션/서블릿 초기화 파라미터 값은 런타임 시 설정 불가. 오직 DD에서만 가능
Request 파라미터는 Query String을 설정할 수 있음.
리턴 타입
Object
String
참조 메소드
getAttribute(String name)
getInitParameter(String name)

속성의 생존 범위
인터페이스 종류
접근
생존범위
가장 적 당한곳
Context
스레드-안전(X)
웹 애플리케이션에 있는 것은 어떤 것이든. 서블릿, JSP,
ServletContextListener
ServletContextAttributeListener
ServletContext의 생존기간은 애플리케이션과 동일함.
서버나 애플리케이션이 내려가면 컨텍스트도 소멸됨.
전체 애플리케이션에서 공유하고자 하는 자원. DB Connection. JNDI 검색명, 이메일 주소
HttpSession
스레드-안전(x)
특정 세션에 접근할 수 있는 어떤 서블릿이나 JSP 모두.세션은 여러 개의 요청에 대하여 정보를 간직할 수 있습니다. 한 서블릿뿐만 아니라 여러 서블릿에 대해서도 가능합니다.
세션의 생존시간. 세션을 프로그램적으로 소멸시킬 수 있으며 간단히 시간이 만료될수도 있습니다.
하나의 Request에만 관련된것이 아니라 클라이언트 세션에 관련 데이터와 자원.
클라이언트와 지속적인 대화를 유지 하고 싶은 것들. 장바구니
Request
스레드-안전(O)
애플리케이션 내에서 Request객체에 직접 접근이 가능한 것모두. RequestDispatcher를 사용하여 요청을 처리할 수 있는 서블릿이나 JSP를 대부분 의미. 물론 Request 관련 리스너도 포함함.
Request의 생존 시간. 서블릿의 서비스 메소드가 끝날때 까지 입니다.
즉 스레드(스택)가 Request를 핸들링할 때 까지만 살아 있는 것 입니다.
모델 정보를 컨트롤러에서 뷰로 넘길때.. 또는 특정 요청에만 관련된 데이터등.

속성 API
  • Object getAttribute(String name)
  • setAttribute(String name,Object value)
  • removeAttribute(String name)
  • enumeration getAttributeNames()

스레드에 안전하게 하기 위해서(컨텍스트 속성을 보호하기 위해서)

  • 서비스 메소드(doGet 혹은 doPost)에 락을 걸면 느려지고 스레드가 보호되지 않는다.
  • 컨텍스트에 대한 락을 걸어야 합니다.
    public void doGet(HttpServletRequest request....){
     …
     synchronized(getServletContext()){
       getServletContext().setAttribute(“foo”,”22”);
       
       out.println(getServletContext().getAttribute(“foo”));
     }  
    }

    HttpSession 동기화로 세션 속성 보호하기
    public void doGet(HttpServletRequest request....){
     …
     HttpSession session = request.getSession();
     synchronized(session){
       .. 관련코드
     }  
    }

    서블릿에서 정보를 공유하기
    • 변수를 인스턴스 변수가 아닌 서비스 메소드의 지역 변수로 선언한다.
    • Context,Session,Request 중에서 가장 적당한 속성의 생존범위를 사용한다.

    RequestDispatcher에 대해서
    • forward(),include()를 가지고 있음.
    • forward()는 처리요청을 넘길때 주로 사용됨.
    • ServletRequest로 부터 RequestDispatcher를 리턴받는 경우
    • 경로가 ‘/’로 시작하지 않으면 상대경로 임. (그러나 현재 웝애플리케이션을 벗어나지 못함)
    • ServletContext로 부터 RequestDispatcher를 리턴받는 경우
    • 상대경로는 사용하지 못하고 절대 경로만 사용가능 하다.
    • include() : 처리하고 다시 서블릿으로 오도록 한다는 기능임.
    • 주의 : os.flush()와 같은 메소드를 forward()호출하기 전에 호출하됨. 모두 끝...

댓글 없음: