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("로그: 서블릿컨테이너(톰캣)의 시작을 감지");
}
}