서블릿 리스너
- 웹 애플리케이션에서 발생하는 주요 이벤트를 감지하고 각 이벤트에 특별한 작업이 필요한 경우에 사용할 수 있다.
- 서블릿 컨텍스트 수준의 이벤트
- 컨텍스트 라이프 사이클 이벤트
- 컨텍스트 어트리뷰트 변경 이벤트
- 세션 수준의 이벤트
- 세션 라이프 사이클 이벤트
- 세션 어트리뷰트 변경 이벤트
- 서블릿 컨텍스트 수준의 이벤트
서블릿 필터
- 들어온 요청을 서블릿으로 보내고, 또 서블릿이 작성한 응답을 클라이언트로 보내기 전에 특별한 처리가 필요한 경우 사용.
- 체인 형태의 구조.
서블릿 리스너 동작 확인
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Context Initialized");
sce.getServletContext().setAttribute("name", "dongheon");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Context Destroyed");
}
}
위 리스너를 등록한 후, 아래 서블릿을 실행하면
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("Hello Servlet init");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
resp.getWriter().println("<html>");
resp.getWriter().println("<head>");
resp.getWriter().println("<body>");
resp.getWriter().println("<h1>Hello, " + getName() +"</h1>");
resp.getWriter().println("</body>");
resp.getWriter().println("</head>");
resp.getWriter().println("</html>");
}
private Object getName() {
return getServletContext().getAttribute("name");
}
@Override
public void destroy() {
System.out.println("Hello Servlet destroyed");
}
}
결과는 아래와 같다.
로그를 보면 Context(리스너)가 먼저 초기화 되었고, 이후 서블릿이 초기화 된 걸 알 수 있다.
종료는 반대로, 서블릿이 먼저 종료된 다음 컨텍스트가 종료되는 것을 볼 수 있다.
서블릿 필터 동작 확인
먼저 아래와 같은 필터를 등록한다.
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter Init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("Filter Destroy");
}
}
이후, 실행 결과는 아래와 같다.
Context -> Filter -> Servlet 순으로 초기화 되는 것을 볼 수 있다.
또한 doGet이 호출되기전 doFilter가 먼저 실행되는 것을 유의하자.
'Spring' 카테고리의 다른 글
Database Transaction과 데이터 동기화 -1 (0) | 2021.08.01 |
---|---|
스프링 MVC 구성 요소 (0) | 2020.08.02 |
DispatcherServlet이란 (0) | 2020.08.02 |
서블릿이란 ? (0) | 2020.07.31 |
스프링 MVC 소개 (0) | 2020.07.30 |