Context Listener

jinkyung·2021년 1월 21일
0

JSP

목록 보기
12/20

connection 객체를 서블릿마다 실행하는 것이 아니라
멤버 dao 객체로 만들어서 공유하도록 하는 것이 나을 것 같다

AppInitServelt을 사용하지 않고 Listener를 사용하도록 수정

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>_12_JDBCServlet_ServletInitParam</display-name>
  
  
  <!-- 컨텍스트 초기화 매개변수(모든 서블릿에서 공유가능) -->

  	<context-param>
  		<param-name>driver</param-name>
  		<param-value>com.mysql.cj.jdbc.Driver</param-value>
  	</context-param>
  	<context-param>
  		<param-name>url</param-name>
  		<param-value>jdbc:mysql://localhost/studydb?serverTimezone=UTC</param-value>
  	</context-param>
  	<context-param>
  		<param-name>username</param-name>
  		<param-value>study</param-value>
  	</context-param>
  	<context-param>
  		<param-name>password</param-name>
  		<param-value>study</param-value>
  	</context-param>
  	
  	
  	<!-- 서블릿 선언 주소와 매핑하지 않는다. 외부에 의해서 호출되지 않고 시작하자마자 실행되는 서블릿이기 때문이다.  -->
  <!-- 	주소와 매핑을 안해서 브라우저 요청에 의해서 호출되는 것이 아니라 
  	웹어플리케이션이 시작하면 최초로 실행되는 서블릿이다. -->
<!--   	<servlet>
  		<servlet-name>AppInitServlet</servlet-name>
  		<servlet-class>spms.servlets.AppInitServlet</servlet-class>
  		
  		시작하면 1순위로 올려라. 1순위가 여러개면 위에서부터 아래 순서대로 호출 
  		<load-on-startup>1</load-on-startup>
  	</servlet>
 -->
 
<!-- 웹 어플리케이션 시작/종료 이벤트 리스너  -->

<listener>
	<listener-class>spms.listeners.ContextLoaderListener</listener-class>
</listener>


<!-- Servlet 2.4이전에는 '컨텍스트 초기화 매개변수' 다음에 위치해야 한다 
			 2.4 이상부터는 순서에 관계 없다  -->
  <!--  필터 설정  -->
  <filter>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<filter-class>spms.filters.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
 
 
 <!-- 모든 주소에 필터를 적용 --> 
  <filter-mapping>
  	<filter-name>CharacterEncodingFilter</filter-name>
  	<!-- 들어오는 모든 것에 이 필터를 적용 (특정 주소만 주면 그 주소만 ) -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
  
  
  <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-app>

ContextLoaderListener

package spms.listeners;

import java.sql.Connection;
import java.sql.DriverManager;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import spms.dao.MemberDao;

public class ContextLoaderListener implements ServletContextListener {	
	Connection conn;
	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		try {
			System.out.println("contextDestroyed");
		}catch(Exception e) {
			e.printStackTrace();
		}

	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		try {
			System.out.println("contextInitialized");
			ServletContext sc = sce.getServletContext();
			Class.forName(sc.getInitParameter("driver"));
			
			conn = DriverManager.getConnection(
					sc.getInitParameter("url"),
					sc.getInitParameter("username"),
					sc.getInitParameter("password"));
			
			MemberDao memberDao = new MemberDao();
			memberDao.setConnection(conn);
			
			//conn객체 대신 memberDao 객체를 공유 
			sc.setAttribute("memberDao", memberDao);
											
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		
		
	}

}

모든 servlet 코드를 다음처럼 변경

package spms.servlets;

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import spms.dao.MemberDao;

@SuppressWarnings("serial")
@WebServlet("/member/delete")
public class MemberDeleteServlet extends HttpServlet {

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			ServletContext sc = this.getServletContext();
			MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");

			memberDao.delete(Integer.parseInt(request.getParameter("no")));

			response.sendRedirect("list");

		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("error", e);
			RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
			rd.forward(request, response);

		} 

	}
}

0개의 댓글