속성 & 리스너 JSP & Servlet
2/39 Contents 학습목표 클라이언트요청에의해서블릿이실행될때에컨테이너에의해제공되는내장객체의종류와역할, 그리고접근범위특성등을알아본다. 웹컴포넌트사이의데이터전달을위한내장객체에서의속성설정과이에따른이벤트처리방법에대해알아본다. 내용 서블릿의초기화환경을표현하는 ServletConfig 객체 웹애플리케이션의실행환경을표현하는 ServletContext 객체 세션정보를유지하는 HttpSession 객체 내장객체에서의속성설정 내장객체에서의이벤트처리
3/38 1. 서블릿초기화파라미터 (1) 서블릿초기화파라미터 - 개요 정의 : 서블릿의초기화작업에필요한데이터를의미 사용목적 : 유지보수관점에서변경가능한파라미터를 DD(Deployment Descriptor) 에읽어들어사용하도록함 서블릿소스변경부담을줄임 예 : 로그파일명, DB 테이블명 & 사용자명등 전달방법 : 컨테이너가서블릿클래스를로딩할때에 DD 파일에서초기화파라미터를읽어 ServletConfig 객체를생성 서블릿초기화시에매개변수로전달
4/38 1. 서블릿초기화파라미터 (2) 서블릿초기화파라미터 - 정의및접근방법
5/38 1. 서블릿초기화파라미터 (3) 서블릿초기화파라미터 로딩 서블릿초기화할때단한번만서블릿초기화파라미터를읽는다
6/38 1. 서블릿초기화파라미터 (4) 서블릿초기화파라미터 로딩
7/38 1. 서블릿초기화파라미터 (5) 서블릿초기화파라미터 서블릿에게로전달 생성된 ServletConfig 객체를서블릿의 init() 메소드호출시에매개변수 로제공
8/38 1. 서블릿초기화파라미터 (6) 서블릿초기화파라미터 ServletConfig 인터페이스 서블릿초기화파라미터사용 컨텍스트정보 ( 서블릿설정정보 ) 접근
9/38 1. 서블릿초기화파라미터 (7) 서블릿초기화파라미터 가져오기 서블릿에서초기화파라미터가져오기 ServletConfig config = getservletconfig(); String email = config.getinitparameter( admemail ); String email = getservletconfig().getinitparameter( admemail ); HttpServletRequest 메소드 String email = getinitparameter( admemail ); (or String email = this.getinitparameter( admemail ); )
10/38 1. 서블릿초기화파라미터 (8) 서블릿초기화파라미터 예제 (1)
11/38 1. 서블릿초기화파라미터 (9) 서블릿초기화파라미터 예제 (2)
12/38 1. 서블릿초기화파라미터 (10) 서블릿초기화파라미터 예제 (3) <servlet> <servlet-name>agreement-servlet</servlet-name> <servlet-class>agreementservlet</servlet-class> <init-param> <param-name>file_name</param-name> <param-value>agreement.txt</param-value> </init-param> </servlet> 서블릿의초기화파라미터 파라미터의이름 파마미터의값
13/38 1. 서블릿초기화파라미터 (11) 서블릿초기화파라미터 예제 (4) [ 예제 6-4] 인사말을출력하는서블릿클래스 서블릿의초기화파라미터사용 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; import java.util.*; public class GreetingServlet extends HttpServlet { private PrintWriter logfile; public void init() throws ServletException { String filename = getinitparameter( FILE_NAME ); try { logfile = new PrintWriter(new FileWriter(filename, true)); } catch (IOException e) { throw new ServletException(e); } } public void doget(httpservletrequest request, HttpServletResponse response) throws IOException, ServletException { String name = request.getparameter( NAME ); String greeting = 안녕하세요, + name + 님. ; if (logfile!= null) { GregorianCalendar now = new GregorianCalendar(); logfile.printf( %TF %TT - %s %n, now, now, name); } response.setcontenttype( text/html;charset=euc-kr ); PrintWriter out = response.getwriter(); out.println( <HEAD><TITLE> 인사하기 </TITLE></HEAD> ); } out.println( <BODY> ); out.println(greeting); out.println( </BODY> ); out.println( </HTML> ); } public void destroy() { if (logfile!= null) logfile.close(); }
14/38 1. 서블릿초기화파라미터 (12) 서블릿초기화파라미터 하나의서블릿클래스를이용하여두개이상의서블릿으로등록가능 [ 예제 6-4] 를등록하는기존의엘리먼트 [ 예제 6-4] 를등록하는새로운엘리먼트
15/38 2. 컨텍스트초기화파라미터 (1) 컨텍스트초기화파라미터 - 개요 정의 : 웝애플리케이션의실행환경및초기화파라미터데이터를의미 사용목적 : 서블릿초기화파라미터와사용목적및방법은동일 서블릿초기화파라미터는해당서블릿만접근가능 컨텍스트초기화파라미터는웹애플리케이션을구성하는모든컴포턴트가접근가능 전달방법 : 컨테이너가웹애플리케이션을시작할때에 DD 파일에서컨텍스트초기화파라미터를읽어 ServletContext 객체를생성 제일먼저생성되는내장객체 서블릿 ( 또는 JSP) 초기화시에 ServletConfig 객체에 ServletContext 객체의접근자가등록되어전달
16/38 2. 컨텍스트초기화파라미터 (2) 컨텍스트초기화파라미터 정의방법 DD 파일내에 <context-param> 엘리먼트를이용하여정의
17/38 2. 컨텍스트초기화파라미터 (3) 컨텍스트초기화파라미터 접근방법 ServletContext 객체접근자및메소드를이용하여접근
18/38 2. 컨텍스트초기화파라미터 (4) 컨텍스트초기화파라미터 서블릿초기화파라미터와의비교 (1)
19/38 2. 컨텍스트초기화파라미터 (5) 컨텍스트초기화파라미터 서블릿초기화파라미터와의비교 (2)
20/38 2. 컨텍스트초기화파라미터 (6) 컨텍스트초기화파라미터 서블릿초기화파라미터와의비교 (3) 웹애플리케이션은오직하나의 ServletContext 으로전체웹애플리케이션에서정보를공유
21/38 2. 컨텍스트초기화파라미터 (7) 컨텍스트초기화파라미터 ServletContext 인터페이스
22/38 2. 컨텍스트초기화파라미터 (8) 컨텍스트초기화파라미터 ServletContext 객체접근 서블릿에서의 ServletContext 객체접근 ServletContext context = getservletconfig().getservletcontext(); ServletContext context = this.getservletcontext(); 컨텍스트초기화파라미터접근 String param = context.getinitparameter( init_param_name ); 서블릿초기화파라미터접근메소드이름과동일 반환되는파라미터값은 String 타입
23/38 2. 컨텍스트초기화파라미터 (9) 컨텍스트초기화파라미터 서블릿실행환경정보접근 (1) 동작중인웹서버정보접근 String str = context.getserverinfo(); 웹서버의종류를리턴하는메서드 서비스되는서블릿규격버전정보접근 int num1 = context.getmajorversion(); 서블릿의메이저버전을가져오는메서드 int num2 = context.getminorversion(); 서블릿의마이너버전을가져오는메서드
24/38 2. 컨텍스트초기화파라미터 (10) 컨텍스트초기화파라미터 서블릿실행환경정보접근 (2) 웹애플리케이션의 URL 경로명과실제배포경로명접근 String apppath = context.getcontextpath(); 웹애플리케이션의 URL 경로명을리턴하는메서드 String absolutepath = context.getrealpath( /sub1/intro.html ); 웹애플리케이션내에서의파일경로명
25/38 2. 컨텍스트초기화파라미터 (11) 컨텍스트초기화파라미터 컨텍스초기화파라미터설정및접근 JSP 에서의컨텍스트초기화파라미터접근 [ 예제 6-9] 웹애플리케이션의초기화파라미터를읽는 JSP 페이지 <%@page contenttype= text/html; charset=euc-kr %> <HTML> <HEAD><TITLE> 웹애플리케이션의초기화파라미터 </TITLE></HEAD> <BODY> 데이터베이스이름 : <%= application.getinitparameter( DB_NAME ) %> <BR> </BODY> </HTML> [ 그림 6-22] 웹애플리케이션의초기화파라미터지정방법 [ 그림 6-23] 예제 6-9 의실행결과
26/38 2. 컨텍스트초기화파라미터 (12) 컨텍스트초기화파라미터 log() 메소드활용 ServletContext 인터페이스의 log() 메서드를이용하면로그파일에메시지를기록할수있다. 호출할시에파라미터로로그메시지를넘겨주어야한다. context.log( 인사하기 JSP 페이지가호출되었습니다. ); 로그메시지 톰캣의설치디렉터리아래의 logs라는이름의서브디렉터리안의 localhost.yyyy-mm-dd.log라는이름의파일에로그메시지를기록한다.
27/38 3. 컨테이너제공객체 (1) 컨테이너제공객체 (1) 서블릿실행시에컨테이너가제공하는이미만들어진 (built-in) 객체들 서블릿 API 객체 서블릿 API를이용하여접근가능한객체 5개종류의객체 ServletContext 객체 ServletConfig 객체 HttpSession 객체 HttpServletRequest 객체 HttpServletResponse 객체
28/38 3. 컨테이너제공객체 (2) 컨테이너제공객체 (2) 종류생성시기접근범위 (scope) 특징 ServletContext 웹애플리케이션시작 ( 배포 ) 시점 웹애플리케이션의모든컴포넌트 웹애플리케이션실행환경정보및초기화파라미터제공 ServletConfig 서블릿클래스로딩시점 해당서블릿 ( 또는 JSP) 만 서블릿초기화파라미터제공 HttpSession 연속된클라이언트요청의시작시점 연속된클라이언트요청에의해실행되는컴포넌트 서블릿요청에의해생성 HttpServletRequest 클라이언트요청도착시점 클라이언트요청에의해실행되는서블릿 ( 또는 JSP) 클라이언트요청데이터접근 HttpServletResponse 클라이언트요청도착시점 클라이언트요청에의해실행되는서블릿 ( 또는 JSP) 클라이언트응답데이터접근
29/38 4. 속성 (Attribute) (1) 속성 (Attribute) - 개요 3 개의서블릿 API 객체 (ServletContext, HttpSession, HttpServletRequest) 중하나에설정해놓은 ( 바이딩- binding) 객체 게시판의게시물 과비교가능 이름 (String)/ 값 (Object) 의쌍으로저장 속성의생존범위 (Scope) 에유의 클라이언트요청을처리하는컴포넌트간또는웹애플리케이션을구성하는컴포넌트간에데이터교환을가능하게함.
30/38 4. 속성 (Attribute) (2) 속성 (Attribute) 파라미터와비교 속성은파라미터가아닙니다!...
31/38 4. 속성 (Attribute) (3) 속성 (Attribute) 세가지생존범위 (Scope) Context, Session, Request Scopes Context Scope :
32/38 4. 속성 (Attribute) (4) 속성 (Attribute) 세가지생존범위 (Scope) Session Scope :
33/38 4. 속성 (Attribute) (5) 속성 (Attribute) 세가지생존범위 (Scope) Request Scope :
34/38 4. 속성 (Attribute) (6) 속성 (Attribute) API ServletContext, HttpSession HttpServletRequest 인터페이스에속성관련메소드를제공 Object getattribute(string name) void setattribute(string name, Object value) void removeattribute(string name) Enumeration getattributenames()
35/38 4. 속성 (Attribute) (7) 속성 (Attribute) API
36/38 4. 속성 (Attribute) (8) 속성 (Attribute) 고려사항 (1) 속성은스레드 - 안전 (thread-safe) 하지못한경우가있다. Context 속성은스레드안전하지못하다.
37/38 4. 속성 (Attribute) (9) 속성 (Attribute) 고려사항 (2) Context 생존범위는스레드안전하지못하다.
38/38 4. 속성 (Attribute) (10) 속성 (Attribute) 고려사항 (3) Context 생존범위는스레드안전하지못하다.
39/38 4. 속성 (Attribute) (11) 속성 (Attribute) 고려사항 (4) 해결책 #1 : 서블릿메소드의동기화 Context 속성의스레드 - 안전을보장못함
40/38 4. 속성 (Attribute) (12) 속성 (Attribute) 고려사항 (5) 해결책 #1 : 서블릿메소드의동기화
41/38 4. 속성 (Attribute) (13) 속성 (Attribute) 고려사항 (6) 해결책 #2 : Context 객체동기화 (Context 에 Lock 을건다 ) Context 속성의스레드 - 안전을보장함
42/38 4. 속성 (Attribute) (14) 속성 (Attribute) 고려사항 (7) Session 속성도스레드안전하지못하다 동일클라이언트가동시에하나이상의요청을보내는경우
43/38 4. 속성 (Attribute) (15) 속성 (Attribute) 고려사항 (8) 해결책 : Session 객체의동기화 HttpSession 에대한동기화로 Session 속성의스레드 - 안전을보장할수있음
44/38 4. 속성 (Attribute) (16) 속성 (Attribute) 고려사항 (9) Request 속성은스레드 - 안전하다 클라이언트요청에의해생성된스레드만이 request 속성을접근할수있기때문
45/38 4. 속성 (Attribute) (17) 속성 (Attribute) Request 디스패칭 (1) 서블릿에는다른컴포넌트에게 Request 를전달하기위해 RequestDispatcher 를사용한다.
46/38 4. 속성 (Attribute) (18) 속성 (Attribute) Request 디스패칭 (2)
47/38 4. 속성 (Attribute) (19) 속성 (Attribute) Request 디스패칭 (3) RequestDispatcher 획득방법
48/38 4. 속성 (Attribute) (20) 속성 (Attribute) 정리
49/38 5. 리스너 (Listener) (1) 리스너 (Listener) 개요 생존범위와관련된 3 개의개체 (ServletContext, HttpSession, ServletRequest) 에서발생하는이벤트를처리하는클래스 서블릿과 JSP 와별도의클래스로정의 DD 파일에등록 컨테이너가이벤트가발생할때에리스너를호출하여실행. 관련이벤트 생존범위관련객체의초기화및소멸 속성 (Attribute) 등록, 수정, 제거 서블릿실행과관련하여 8 종류의리스너가존재
50/38 5. 리스너 (Listener) (2) 리스너 (Listener) 종류 (1)
51/38 5. 리스너 (Listener) (3) 리스너 (Listener) 종류 (2)
52/38 5. 리스너 (Listener) (4) 리스너 (Listener) ServletContextListener (1) 웹애플리케이션이시작할때에 DB Connection 객체를생성하여모든컴포넌트가공유할수있는방법이없을까?
53/38 5. 리스너 (Listener) (5) 리스너 (Listener) ServletContextListener (2) 컨텍스트리스너를이용하여해결 컨텍스트초기화시 ( 애플리케이션배포 ) 사용 ServletContext 로부터컨텍스트초기화파라미터로딩 DB 연결을위해초기화파라미터검색명 ( lookup name ) 사용 DB Connection 객체를속성 (Attribute) 에저장 컨텍스트종료시 ( 애플리케이션서비스종료 ) 사용 DB 연결종료
54/38 5. 리스너 (Listener) (6) 리스너 (Listener) ServletContextListener (3) 컨텍스트리스너를이용하여해결 DD 파일에등록하여컨테이너가이벤트발생시에호출할수있도록함
55/38 5. 리스너 (Listener) (7) 리스너작성튜토리얼 (1) 간단한 ServletContextListener 를작성하고실행시키는실습 리스너가컨텍스트초기화파라미터에서개의품종을읽어와 Dog 클래스의객체를생성하고 ServletContext 에서속성으로묶어둠으로써서블릿등에서 Dog 객체를접근하여사용하도록함. 튜토리얼전체과정
56/38 5. 리스너 (Listener) (8) 리스너작성튜토리얼 (2) 3 개의클래스작성 속성 (Attribute) 클래스 Dog 클래스 Dog.java 컨텍스트리스너클래스 MyServletContextListener.java 테스트서블릿클래스 ListenerTester.java DD 파일 DD 파일등록 리스너클래스와서블릿클래스를 DD 파일에등록 배포및테스트
57/38 5. 리스너 (Listener) (9) 리스너작성튜토리얼 (3) Dog 클래스 Dog.java
58/38 5. 리스너 (Listener) (10) 리스너작성튜토리얼 (4) 컨텍스트리스너클래스 MyServletContextListener.java
59/38 5. 리스너 (Listener) (11) 리스너작성튜토리얼 (5) 서블릿클래스 ListenerTester.java
60/38 5. 리스너 (Listener) (12) 리스너작성튜토리얼 (6) 배포기술자 (DD 파일 ) 작성
61/38 5. 리스너 (Listener) (13) 리스너작성튜토리얼 (7) 컴파일, 배포, 테스트
62/38 5. 리스너 (Listener) (14) 리스너작성튜토리얼 (8) 컨텍스리스너실행과정이해
63/38 5. 리스너 (Listener) (15) 리스너작성튜토리얼 (9) 컨텍스리스너실행과정이해
64/38 5. 리스너 (Listener) (16) 리스너작성튜토리얼 (10) 컨텍스리스너실행과정이해
65/38 5. 리스너 (Listener) (17) 리스너작성튜토리얼 (11) 컨텍스리스너실행과정이해
JSP & Servlet