[스프링 웹 MVC] 서블릿 리스너와 서블릿 필터
2022. 3. 20. 21:21ㆍJAVA/Spring Framework
728x90
반응형
SMALL
서블릿 리스너
웹 애플리케이션에서 발생하는 주요 이벤트를 감지하고, 각 이벤트에 특별한 작업이 필요한 경우에 사용
- 서블릿 컨텍스트 수준의 이벤트
- 컨텍스트 라이프사이클 이벤트
- 컨텍스트 애트리뷰트 변경 이벤트
- 세션 수준의 이벤트
- 세션 라이프사이클 이벤트
- 세션 애트리뷰트 변경 이벤트
서블릿 필터
- 들어온 요청을 서블릿으로 보내고, 또 서블릿이 작성한 응답을 클라이언트로 보내기 전에 특별한 처리가 필요한 경우에 사용
- 체인 형태의 구조
먼저 리스너를 등록해볼게요!
package com.example;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Context Initialized");
sce.getServletContext().setAttribute("name", "Servlet");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Context Destroyed");
}
}
ServletContextListener를 구현하는 MyListener입니다.
리스너가 제대로 등록됐는지 확인하기 위해 name이라는 애트리뷰트를 설정해줄게요!
package com.example;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("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("destroy");
}
}
리스너에서 등록한 name을 출력하도록 HelloServlet의 doGet 을 이렇게 수정해주겠습니다.
그리고 web.xml에 리스너를 등록해줘야 합니다.
이제 서버를 실행시켜 볼까요!?
리스너에서 name으로 등록한 Servlet이 출력되는 것을 확인할 수 있어요!
그리고 서블릿이 생성되기 전에 먼저 생성되고, 가장 마지막에 destroy 되는 것을 확인할 수 있습니다. 🤓
이제 필터 차례입니다.
앞서 말씀 드렸듯, 필터는 서블릿으로 요청을 보내고 응답을 받기 전 특별한 역할을 수행해줄 수 있습니다.
package com.example;
import javax.servlet.*;
import java.io.IOException;
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("Filter");
filterChain.doFilter(servletRequest, servletResponse); // Hello Servlet의 doGet으로 연결해주는 역할
}
@Override
public void destroy() {
System.out.println("Filter Destroy");
}
}
doFilter에서 필터 체인을 통해 HelloServlet과 연결해주었습니다.
그리고 서버를 실행시키면, 아까와 동작 상 차이는 없지만 라이프사이클이 아래와 같음을 확인할 수 있습니다.
728x90
반응형
LIST
'JAVA > Spring Framework' 카테고리의 다른 글
[스프링 웹 MVC] 서블릿 애플리케이션 개발 (0) | 2022.03.16 |
---|---|
[스프링 웹 MVC] 스프링 MVC 소개 (0) | 2022.03.14 |
스프링 웹 MVC (0) | 2022.03.14 |