Chapter.05 서블릿은 독불장군이 아니다.
서블릿 초기화 파라미터
관련 클래스 javax.servlet.SevrletConfig
서블릿 하나 마다 한개 생성됨.
컨테이너를 DD에서 초기화 파라미터 정보를 읽어서 ServletConfig에게 넘기고 서블릿을 초기화 할때 init() 메소드에 넘김
초기화 할때 단 한번만 서블릿 파라미터를 읽는다. (그러므로 변경을 하고 적용할때 컨테이너를 재구동해야 함.)
JSP에서 서블릿 파라미터 접근방법
서블릿 초기화 파라미터 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”))
-----------------------------------------------------
파리미터 값
</init-param>
</servlet>
</web-app>
|
컨텍스트 초기화 파라미터
관련 클래스 javax.servlet.ServletContext
모든 웹 에플리케이션에서 이용할 수 있음.
관련 메소드 getServletContext().getInitParameter(“$para_name”);
웹 애플리케이션 당 하나
동적으로 설정 불가능
배포시 정해진 상수
JSP에서 내장된(implicit) 형태로 접근
ServletContext 얻는 방법
getServletConfig().getServletContext();
this.getServletContext();
컨텍스트 초기화 파라미터 web.xml (DD) 설정 예
<web-app ...>
<context-param>
---------------
<param-name>adminEmail</param-name>
-----------------------------------
파라미터 이름 (getServletContext().getInitParameter(“adminEmail”))
-----------------------------------------------------
파리미터 값
</context-param>
</web-app>
|
ServletContextListener
컨텍스트 리스너 설정 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
|
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()호출하기 전에 호출하됨. 모두 끝...