Transcript lecture-05

속성 & 리스너
JSP & Servlet
Contents
 학습목표
 클라이언트 요청에 의해 서블릿이 실행될 때에 컨테이너에 의해 제공되
는 내장 객체의 종류와 역할, 그리고 접근 범위 특성 등을 알아본다.
 웹 컴포넌트 사이의 데이터 전달을 위한 내장 객체에서의 속성 설정과
이에 따른 이벤트 처리 방법에 대해 알아본다.
 내용
 서블릿의 초기화 환경을 표현하는 ServletConfig 객체
 웹 애플리케이션의 실행 환경을 표현하는 ServletContext 객체
 세션 정보를 유지하는 HttpSession 객체
 내장 객체에서의 속성 설정
 내장 객체에서의 이벤트 처리
2/39
1. 서블릿 초기화 파라미터 (1)
 서블릿 초기화 파라미터 - 개요
 정의 : 서블릿의 초기화 작업에 필요한 데이터를 의미
 사용 목적 :
• 유지 보수 관점에서 변경 가능한 파라미터를 DD(Deployment Descriptor)에 읽어
들어 사용하도록 함  서블릿 소스 변경 부담을 줄임
• 예: 로그 파일명, DB 테이블명 & 사용자명 등
 전달 방법 :
• 컨테이너가 서블릿 클래스를 로딩할 때에 DD 파일에서 초기화 파라미터를 읽어
ServletConfig 객체를 생성
• 서블릿 초기화 시에 매개변수로 전달
3/38
1. 서블릿 초기화 파라미터 (2)
 서블릿 초기화 파라미터 - 정의 및 접근 방법
4/38
1. 서블릿 초기화 파라미터 (3)
 서블릿 초기화 파라미터 – 로딩
 서블릿 초기화할 때 단 한번만 서블릿 초기화 파라미터를 읽는다
5/38
1. 서블릿 초기화 파라미터 (4)
 서블릿 초기화 파라미터 – 로딩
6/38
1. 서블릿 초기화 파라미터 (5)
 서블릿 초기화 파라미터 – 서블릿에게로 전달
 생성된 ServletConfig 객체를 서블릿의 init() 메소드 호출 시에 매개변수로
제공
7/38
1. 서블릿 초기화 파라미터 (6)
 서블릿 초기화 파라미터 – ServletConfig 인터페이스
 서블릿 초기화 파라미터 사용
 컨텍스트 정보(서블릿 설정 정보) 접근
8/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”); )
9/38
1. 서블릿 초기화 파라미터 (8)
 서블릿 초기화 파라미터 – 예제 (1)
10/38
1. 서블릿 초기화 파라미터 (9)
 서블릿 초기화 파라미터 – 예제 (2)
11/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>
파라미터의 이름
파마미터의
값
서블릿의 초기화 파라미
터
12/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();
}
}
13/38
1. 서블릿 초기화 파라미터 (12)
 서블릿 초기화 파라미터
 하나의 서블릿 클래스를 이용하여 두 개 이상의 서블릿으로 등록 가능
[예제 6-4]를 등록하는
기존의
엘리먼트
[예제 6-4]를 등록하는
새로운
엘리먼트
14/38
2. 컨텍스트 초기화 파라미터 (1)
 컨텍스트 초기화 파라미터 - 개요
 정의 : 웝 애플리케이션의 실행 환경 및 초기화 파라미터 데이터를 의미
 사용 목적 :
• 서블릿 초기화 파라미터와 사용 목적 및 방법은 동일
• 서블릿 초기화 파라미터는 해당 서블릿만 접근 가능
• 컨텍스트 초기화 파라미터는 웹 애플리케이션을 구성하는 모든 컴포턴트가 접근 가능
 전달 방법 :
• 컨테이너가 웹 애플리케이션을 시작할 때에 DD 파일에서 컨텍스트 초기화 파라미터
를 읽어 ServletContext 객체를 생성
 제일 먼저 생성되는 내장 객체
• 서블릿(또는 JSP) 초기화 시에 ServletConfig 객체에 ServletContext 객체의 접근자
가 등록되어 전달
15/38
2. 컨텍스트 초기화 파라미터 (2)
 컨텍스트 초기화 파라미터 – 정의 방법
 DD 파일 내에 <context-param> 엘리먼트를 이용하여 정의
16/38
2. 컨텍스트 초기화 파라미터 (3)
 컨텍스트 초기화 파라미터 – 접근 방법
 ServletContext 객체 접근자 및 메소드를 이용하여 접근
17/38
2. 컨텍스트 초기화 파라미터 (4)
 컨텍스트 초기화 파라미터 – 서블릿 초기화 파라미터와의 비교 (1)
18/38
2. 컨텍스트 초기화 파라미터 (5)
 컨텍스트 초기화 파라미터 – 서블릿 초기화 파라미터와의 비교 (2)
19/38
2. 컨텍스트 초기화 파라미터 (6)
 컨텍스트 초기화 파라미터 – 서블릿 초기화 파라미터와의 비교 (3)
웹 애플리케이션
은 오직 하나의
ServletContext
으로 전체 웹 애
플리케이션에서
정보를 공유
20/38
2. 컨텍스트 초기화 파라미터 (7)
 컨텍스트 초기화 파라미터 – ServletContext 인터페이스
21/38
2. 컨텍스트 초기화 파라미터 (8)
 컨텍스트 초기화 파라미터 – ServletContext 객체 접근
 서블릿에서의 ServletContext 객체 접근
• ServletContext context = getServletConfig().getServletContext();
• ServletContext context = this.getServletContext();
 컨텍스트 초기화 파라미터 접근
• String param = context.getInitParameter(“init_param_name”);
 서블릿 초기화 파라미터 접근 메소드 이름과 동일
 반환되는 파라미터 값은 String 타입
22/38
2. 컨텍스트 초기화 파라미터 (9)
 컨텍스트 초기화 파라미터 – 서블릿 실행 환경 정보 접근 (1)
 동작중인 웹 서버 정보 접근
String str = context.getServerInfo();
웹 서버의 종류를 리턴하는
메서드
 서비스되는 서블릿 규격 버전 정보 접근
int num1 = context.getMajorVersion();
서블릿의 메이저 버전을 가져오는
메서드
int num2 = context.getMinorVersion();
서블릿의 마이너 버전을 가져오는
메서드
23/38
2. 컨텍스트 초기화 파라미터 (10)
 컨텍스트 초기화 파라미터 – 서블릿 실행 환경 정보 접근 (2)
 웹 애플리케이션의 URL 경로명과 실제 배포 경로명 접근
String appPath = context.getContextPath();
웹 애플리케이션의 URL 경
로명을
리턴하는 메서드
String absolutePath = context.getRealPath( “/sub1/Intro.html ”);
웹 애플리케이션 내에서
의
파일 경로명
24/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의 실행 결과
25/38
2. 컨텍스트 초기화 파라미터 (12)
 컨텍스트 초기화 파라미터 – log() 메소드 활용
 ServletContext 인터페이스의 log() 메서드를 이용하면 로그 파일에 메시지를 기
록할 수 있다.
 호출할 시에 파라미터로 로그 메시지를 넘겨주어야 한다.
context.log( “인사하기 JSP 페이지가 호출되었습니다. ”);
로그 메
시지
 톰캣의 설치 디렉터리 아래의 logs라는 이름의 서브디렉터리 안의
localhost.yyyy-mm-dd.log라는 이름의 파일에 로그 메시지를 기록한다.
26/38
3. 컨테이너 제공 객체 (1)
 컨테이너 제공 객체 (1)
 서블릿 실행 시에 컨테이너가 제공하는 이미 만들어진(built-in) 객체들
 서블릿 API 객체 – 서블릿 API를 이용하여 접근 가능한 객체
 5개 종류의 객체
• ServletContext 객체
• ServletConfig 객체
• HttpSession 객체
• HttpServletRequest 객체
• HttpServletResponse 객체
27/38
3. 컨테이너 제공 객체 (2)
 컨테이너 제공 객체 (2)
종류
생성 시기
접근 범위(scope)
특징
ServletContext
웹 애플리케이션
시작(배포) 시점
웹 애플리케이션의
모든 컴포넌트
웹 애플리케이션 실
행 환경 정보 및 초
기화 파라미터 제공
서블릿 클래스
로딩 시점
해당 서블릿
(또는 JSP) 만
서블릿 초기화 파라
미터 제공
HttpSession
연속된 클라이언트
요청의 시작 시점
연속된 클라이언트
요청에 의해 실행되
는 컴포넌트
서블릿 요청에 의해
생성
HttpServletRequest
클라이언트 요청
도착 시점
클라이언트 요청에
의해 실행되는 서블
릿(또는 JSP)
클라이언트 요청 데
이터 접근
HttpServletResponse
클라이언트 요청
도착 시점
클라이언트 요청에
의해 실행되는 서블
릿(또는 JSP)
클라이언트 응답 데
이터 접근
ServletConfig
28/38
4. 속 성(Attribute) (1)
 속 성(Attribute) - 개요
 3 개의 서블릿 API 객체(ServletContext, HttpSession,
HttpServletRequest) 중 하나에 설정해놓은(바이딩binding) 객체
• “게시판의 게시물”과 비교 가능
 “이름(String)/값(Object)”의 쌍으로 저장
 속성의 생존 범위(Scope)에 유의
 클라이언트 요청을 처리하는 컴포넌트 간 또는 웹 애플
리케이션을 구성하는 컴포넌트 간에 데이터 교환을 가
능하게 함.
29/38
4. 속 성(Attribute) (2)
 속 성(Attribute) – 파라미터와 비교
 “속성은 파라미터가 아닙니다!...”
30/38
4. 속 성(Attribute) (3)
 속 성(Attribute) – 세 가지 생존범위(Scope)
 Context, Session, Request Scopes
 Context Scope :
31/38
4. 속 성(Attribute) (4)
 속 성(Attribute) – 세 가지 생존범위(Scope)
 Session Scope :
32/38
4. 속 성(Attribute) (5)
 속 성(Attribute) – 세 가지 생존범위(Scope)
 Request Scope :
33/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()
34/38
4. 속 성(Attribute) (7)
 속 성(Attribute) – API
35/38
4. 속 성(Attribute) (8)
 속 성(Attribute) – 고려 사항 (1)
 속성은 스레드-안전(thread-safe)하지 못한 경우가 있다.
 Context 속성은 스레드 안전하지 못하다.
36/38
4. 속 성(Attribute) (9)
 속 성(Attribute) – 고려 사항 (2)
 Context 생존 범위는 스레드 안전하지 못하다.
37/38
4. 속 성(Attribute) (10)
 속 성(Attribute) – 고려 사항 (3)
 Context 생존 범위는 스레드 안전하지 못하다.
38/38
4. 속 성(Attribute) (11)
 속 성(Attribute) – 고려 사항 (4)
 해결책 #1 : 서블릿 메소드의 동기화
Context 속성의 스레드-안전을 보장못함
39/38
4. 속 성(Attribute) (12)
 속 성(Attribute) – 고려 사항 (5)
 해결책 #1 : 서블릿 메소드의 동기화
40/38
4. 속 성(Attribute) (13)
 속 성(Attribute) – 고려 사항 (6)
 해결책 #2 : Context 객체 동기화(Context 에 Lock을 건다)
Context 속성의 스레드-안전을 보장함
41/38
4. 속 성(Attribute) (14)
 속 성(Attribute) – 고려 사항 (7)
 Session 속성도 스레드 안전하지 못하다
• 동일 클라이언트가 동시에 하나 이상의 요청을 보내는 경우
42/38
4. 속 성(Attribute) (15)
 속 성(Attribute) – 고려 사항 (8)
 해결책 : Session 객체의 동기화
HttpSession에 대한 동기화로 Session 속성
의 스레드-안전을 보장할 수 있음
43/38
4. 속 성(Attribute) (16)
 속 성(Attribute) – 고려 사항 (9)
 Request 속성은 스레드-안전하다
• 클라이언트 요청에 의해 생성된 스레드만이 request 속성을 접근할 수 있기 때문
44/38
4. 속 성(Attribute) (17)
 속 성(Attribute) – Request 디스패칭 (1)
 서블릿에는 다른 컴포넌트에게 Request를 전달하기 위해 RequestDispatcher
를 사용한다.
45/38
4. 속 성(Attribute) (18)
 속 성(Attribute) – Request 디스패칭 (2)
46/38
4. 속 성(Attribute) (19)
 속 성(Attribute) – Request 디스패칭 (3)
 RequestDispatcher 획득 방법
47/38
4. 속 성(Attribute) (20)
 속 성(Attribute) – 정리
48/38
5. 리스너(Listener) (1)
 리스너(Listener) – 개요
 생존범위와 관련된 3개의 개체(ServletContext, HttpSession,
ServletRequest)에서 발생하는 이벤트를 처리하는 클래스
 서블릿과 JSP와 별도의 클래스로 정의  DD 파일에 등록
• 컨테이너가 이벤트가 발생할 때에 리스너를 호출하여 실행.
 관련 이벤트
• 생존 범위 관련 객체의 초기화 및 소멸
• 속성(Attribute) 등록, 수정, 제거
 서블릿 실행과 관련하여 8 종류의 리스너가 존재
49/38
5. 리스너(Listener) (2)
 리스너(Listener) – 종류 (1)
50/38
5. 리스너(Listener) (3)
 리스너(Listener) – 종류 (2)
51/38
5. 리스너(Listener) (4)
 리스너(Listener) – ServletContextListener (1)
웹 애플리케이션이 시작
할 때에 DB Connection
객체를 생성하여 모든 컴
포넌트가 공유할 수 있는
방법이 없을까?
52/38
5. 리스너(Listener) (5)
 리스너(Listener) – ServletContextListener (2)
 컨텍스트 리스너를 이용하여 해결
• 컨텍스트 초기화 시(애플리케이션 배포) 사용
 ServletContext로부터 컨텍스트 초기화 파라미터 로딩
 DB 연결을 위해 초기화 파라미터 검색명( lookup name ) 사용
 DB Connection 객체를 속성(Attribute)에 저장
• 컨텍스트 종료 시(애플리케이션 서비스 종료) 사용
 DB 연결 종료
53/38
5. 리스너(Listener) (6)
 리스너(Listener) – ServletContextListener (3)
 컨텍스트 리스너를 이용하여 해결
DD 파일에 등록하여 컨테이너가 이벤트 발
생 시에 호출할 수 있도록 함
54/38
5. 리스너(Listener) (7)
 리스너 작성 튜토리얼 (1)
 간단한 ServletContextListener를 작성하고 실행시키는 실습
• 리스너가 컨텍스트 초기화 파라미터에서 개의 품종을 읽어와 Dog 클래스의 객체를
생성하고 ServletContext에서 속성으로 묶어 둠으로써 서블릿 등에서 Dog 객체를 접
근하여 사용하도록 함.
 튜토리얼 전체 과정
55/38
5. 리스너(Listener) (8)
 리스너 작성 튜토리얼 (2)
 3개의 클래스 작성
• 속성(Attribute) 클래스 – Dog 클래스 Dog.java
• 컨텍스트 리스너 클래스 – MyServletContextListener.java
• 테스트 서블릿 클래스 – ListenerTester.java
• DD 파일
 DD 파일 등록
• 리스너 클래스와 서블릿 클래스를 DD 파일에 등록
 배포 및 테스트
56/38
5. 리스너(Listener) (9)
 리스너 작성 튜토리얼 (3)
 Dog 클래스 Dog.java
57/38
5. 리스너(Listener) (10)
 리스너 작성 튜토리얼 (4)
 컨텍스트 리스너 클래스 MyServletContextListener.java
58/38
5. 리스너(Listener) (11)
 리스너 작성 튜토리얼 (5)
 서블릿 클래스 ListenerTester.java
59/38
5. 리스너(Listener) (12)
 리스너 작성 튜토리얼 (6)
 배포 기술자(DD 파일) 작성
60/38
5. 리스너(Listener) (13)
 리스너 작성 튜토리얼 (7)
 컴파일, 배포, 테스트
61/38
5. 리스너(Listener) (14)
 리스너 작성 튜토리얼 (8)
 컨텍스 리스너 실행 과정 이해
62/38
5. 리스너(Listener) (15)
 리스너 작성 튜토리얼 (9)
 컨텍스 리스너 실행 과정 이해
63/38
5. 리스너(Listener) (16)
 리스너 작성 튜토리얼 (10)
 컨텍스 리스너 실행 과정 이해
64/38
5. 리스너(Listener) (17)
 리스너 작성 튜토리얼 (11)
 컨텍스 리스너 실행 과정 이해
65/38
JSP & Servlet