JSP

day49) 리스너, 필터

code_learner 2022. 3. 12. 03:25

[필터]

: 특정한 상황에서 사용되는 특수한 형태의 Servlet

-> 서블릿과 브라우저 간에 요청이나 응답이 이루어질 때 여러 작업을 미리 처리하는 기능이다.

-> 여러 서블릿에서 반복적으로 수행해야 하는 작업을 공통으로 처리 할 수 있다는 장점

 

ex)

1) 인증, 허가, 인가
2) 로깅처리
3) 국제화(다국어 처리, UTF-8)

 

-필터 동작과정★
정수기 -> [물] ---------------------|------------|----|----> 컵
1) 사용자의 요청정보를 "탈취"해서 작업
-> req, res 객체가 초기화xxx
2) 필터를 부분별로 적용 가능
3) 필터끼리의 우선순위
 : 컨테이너(톰캣) 구동 -> @WebFilter()확인 -> init()수행, Filter 객체 생성됨
 : 이후, 사용자의 요청에 따라 필터가 doFilter()를 수행

 

1. web.xml : ecoding 설정 등록

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">

	<context-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</context-param>

</web-app>

 

2. TestFilter

package test;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;

/**
 * Servlet Filter implementation class TestFilter
 */
@WebFilter("*.jsp")
public class TestFilter extends HttpFilter implements Filter {
	// 인코딩 설정을 위한 필터 클래스★★★
	private String encoding;
       
    /**
     * @see HttpFilter#HttpFilter()
     */
    public TestFilter() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		request.setCharacterEncoding(encoding);
		response.setCharacterEncoding(encoding);
		System.out.println("로그: 필터 수행됨");
		
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		this.encoding=fConfig.getServletContext().getInitParameter("encoding");
		// 하드코딩 -> 유지보수 불리
		// => 초기화 매개변수를 활용하여 하드코딩을 제거
		System.out.println("로그: 필터 생성됨 "+encoding);
	}

}

 

 

 

[리스너]

리스너란 특정 이벤트가 발생하기를 ‘귀 기울여’ 기다리다가 실행되는 메서드나 함수, 혹은 그 메서드를 지닌 객체를 가리킨다.  ex) 컨테이너가 최초 구동될 때, 초기데이터를 설정 할 때 사용

package test;

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

/**
 * Application Lifecycle Listener implementation class TestListener
 *
 */
@WebListener
public class TestListener implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public TestListener() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent sce)  { 
         // TODO Auto-generated method stub
    }

	/**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent sce)  { 
        Product product=new Product("목도리",23000);
        ServletContext sc=sce.getServletContext();
        sc.setAttribute("product", product);
        System.out.println("로그: 서블릿컨테이너(톰캣)의 시작을 감지");
    }
	
}