[JSP/Servlet] Listener 및 ServletContext/ServletConfig 예제
- BACKEND/Servlet&JSP
- 2017. 5. 10. 18:43
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>myweb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 초기 파라미터 - 공용(web component-servlet/jsp/filter/listener 들이 같이 사용하는 초기파라미터)-->
<context-param>
<param-name>phone number</param-name>
<param-value>02-111-2222</param-value>
</context-param>
<context-param>
<param-name>admin email</param-name>
<param-value>admin@kosta.or.kr</param-value>
</context-param>
<!-- Listener 클래스 객체 등록 -->
<listener>
<listener-class>servlet.listener.MyListener</listener-class>
</listener>
<!--CounterServlet 등록 -->
<servlet>
<servlet-name>counter</servlet-name>
<servlet-class>servlet.lifecycle.CounterServlet</servlet-class>
<!-- 초기 파라미터 등록 -->
<init-param>
<param-name>filePath</param-name>
<param-value>C:\Java\counter.dat</param-value>
</init-param>
</servlet>
<!-- name:counter 서블릿 요청 URL 등록 -->
<servlet-mapping>
<servlet-name>counter</servlet-name>
<url-pattern>/lifecycle/counter</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>read querystring</servlet-name>
<servlet-class>servlet.requestparam.ReadQueryStringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>read querystring</servlet-name>
<url-pattern>/form/readqs</url-pattern>
</servlet-mapping>
</web-app>
CounterServlet.java
package servlet.lifecycle;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
* 1. public class, HttpServlet 상속, no-argument 생성
* 2. callback 메소드 (lifecycle 메소드) 재정의 - 실행환경(Web Container)이 특정 시점에 호출하는 메소드.
* + init() : 초기화
* + service() => doGet() || doPost() : 사용자 요청을 처리하는 메소드.
* +destroy() : 마무리(객체 소멸 전에 호출)
* 3. web.xml에 등록 => Web Container에게 구현한 Servlet(객체)를 등록.
*/
public class CounterServlet extends HttpServlet{
private int counter;//요청 횟수를 저장할 변수
public CounterServlet(){
System.out.println("CounterServlet 생성자 실행.");
}
public void init(){
//저장할 파일경로
ServletConfig config = getServletConfig(); //init() 메소드 이후에서 ServletConfig사용가능
String filePath = config.getInitParameter("filePath");
//String filePath = getServletconfig().getInitParameter("filePath");
System.out.println("CounterServlet.init() 실행 - 파일("+filePath+")에서 counter 변수값을 조회");
}
public void destroy(){
String filePath = getServletConfig().getInitParameter("filePath");
System.out.println("CounterServlet.destroy() 실행 - counter변수 값을 파일("+filePath+")에 저장");
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
System.out.println("CounterServlet.service() - doGet() 실행");
//counter를 1증가
counter++;
//ServletContext를 이용해 초기 파라미터 조회
ServletContext context = getServletContext();
String phoneNumber = context.getInitParameter("phone number");
String adminEmail = context.getInitParameter("admin email");
//MyListener의 contextInitialized()에서 등록한 "resource" 속성 조회
String resource = (String)context.getAttribute("resource");
//counter의 값을 사용자에게 응답 처리.
//1. 응답 content-type 지정. MIME 타입
response.setContentType("text/html;charset=UTF-8");
//2. 응답하기 위한 출력 Stream 조회
PrintWriter out = response.getWriter();
//3. 응답
out.println("<!doctype html>");
out.println("<html><head><title>카운터</title></head>");
out.printf("<body>당신은 %d 번째 요청자입니다.<br>",counter);
out.println("<a href='/myweb/index.html'>index 페이지</a>");
out.print("<hr>");
out.printf("전화번호 : %s 관리자 이메일 주소 : %s <br>", phoneNumber,adminEmail);
out.printf("Attribute : %s", resource);
out.println("</body></html>");
}
}
MyListener.java
package servlet.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* Application이 시작할때 할 일을 구현할 메소드와 종료할때 할일을 구현할 Event Listener 클래스
* Application 시작/종료시 발생하는 Event : ServletContextEvent
*
* 1. ServletContextListener 인터페이스를 implements (ServletContextEvent의 handler메소드를 선언한 Listener Interface)
*
* 2. handler 메소드 Overriding
*
* 3. web.xml에 등록 => Web Container에 등록
*
*/
public class MyListener implements ServletContextListener{
/**
* Application이 시작되고 호출 되는 event handler 메소드.
*/
public void contextInitialized(ServletContextEvent event){
//ServletContextEvent로 부터 Servletcontext객체 조회
ServletContext context = event.getServletContext();
String resource = "공유데이터"; //여러 web component(servlet/jsp) 들이 사용하는 자원(공통자원)
//ServletContext의 Attribute 저장소에 resource를 속성으로 binding(등록)
context.setAttribute("resource", resource);
System.out.println("MyListener.contextInitialized() 실행");
}
/**
* Application이 종료되고 호출 되는 event handler 메소드.
*/
public void contextDestroyed(ServletContextEvent event) {
System.out.println("MyListener.contextDestroyed() 실행");
}
}
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 전체경로 -->
<a href="http://127.0.0.1:8088/myweb/lifecycle/counter">Counter 서블릿 호출</a><br>
<!-- 절대경로 -->
<a href="/myweb/lifecycle/counter">Counter 서블릿 호출</a><br>
<!-- 상대경로 -->
<a href="lifecycle/counter">Counter 서블릿 호출</a><br>
</body>
</html>
● 결과 화면
'BACKEND > Servlet&JSP' 카테고리의 다른 글
[JSP/Servlet] Cookie 기본 예제 (0) | 2017.05.11 |
---|---|
[JSP/Servlet] Cookie 예제 -숫자 누적처리 (0) | 2017.05.11 |
[JSP/Servlet] Form 예제 (0) | 2017.05.10 |
[JSP/Servlet] Session 관리 (0) | 2017.05.10 |
[Tomcat] 설치 메뉴얼 자료 (0) | 2017.05.10 |