Listener와 Filter
- 향상된 클래스이다.
- 서블릿을 상속받아서 만들어진 클래스이다.
- Servlet보다는 우선 실행된다.
Filter
- 서블릿 실행 전, 먼저 동작하여 서블릿의 사전 처리 작업을 수행한다.
- 서블릿 실행 후, 응답 메시지가 브라우저에 전송되기 전에 사후 처리 작업을 수행한다.
- 서블릿 컨테이너가 구동되는 시점에 생성된다.
생성
- 클래스명 지정
- ~Filter
- url맵핑 지정
- ex)*.do, *.jsp
효과
- 공통 부분을 분리함으로써 경합도를 낮추고 응집도를 높일 수 있다.
WebFilter어노테이션
- {}는 맵핑을 복수 지정 해서 생긴다.
- new역할을 한다.
- 서블릿 컨테이너(톰캣)가 싱글톤 유지 + 제때에 메서드를 수행
- 컨테이너의 역할은 객체를 생성(new) 및 관리(싱글톤 유지) 및 수행(.메서드()를 수행)
destroy
- disconnect()....
doFilter
- chain.doFilter(request, response)
- 다음 필터가 존재한다면, 그곳으로 이동한다.
- 더 이상 수행할 필터가 없다면, 원래 수행하던 요청으로 돌아간다.
init
- 최초에 단 한번 실행되는 메서드 : 유사 생성자
- 생성자와 달리 외부에서 설정을 가져올 수 있다.
- init의 값이 변할 경우 반영하기 위해서는 컴파일을 다시 해야한다. == 서버를 껏다 켜야한다.
- 그러므로 값 설정을 xml파일에서 해준다.
예제
@WebFilter({ "*.do", "*.jsp" })
// new 가 미리 작성되어있음
// 서블릿 컨테이너(톰캣)가 싱글톤 유지 + 제때에 메서드를 수행시켜줌
// ★ 컨테이너의 역할 == 객체를 생성(new 를 대신해줌) 및 관리(싱글톤 유지) 및 수행(.메서드() 를 해줌) ★
public class EncFilter extends HttpFilter implements Filter {
private String encoding; // 로직부분에 하드코딩을 없애기위해 존재하는 멤버변수
public EncFilter() {
super();
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if(request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding); // 하드코딩 : 유지보수 용이성을 망가뜨리는 주범ㅠ
}
System.out.println(" [로그] 필터 서블릿 클래스에서 작성한 로그");
chain.doFilter(request, response);
// 다음 필터가 존재한다면, 그곳으로 이동해라.
// 더이상 수행할 필터가 없다면, 원래 수행하던 요청으로 돌아가라.
}
public void init(FilterConfig fConfig) throws ServletException {
// 최초에 단한번 실행되는 메서드 : 유사 생성자
this.encoding=fConfig.getServletContext().getInitParameter("encoding");
// 컴파일을 다시해야함 == 서버를 OFF->ON 해야함
// 결국 이 모습도 하드코딩...
}
}
// 인코딩 설정을 분리함으로써
// 1) 결합도를 낮추고
// 2) 응집도를 높일수있음
// => 유지보수 용이해짐
Listener
- 외부의 요청, 자극, 수행, 액션 등을 항상 모니터링하는 것을 말한다.
- 해당 리스너가 언제 반응할지 설정하며 생성한다.
생성
- 클래스명 지정
- ~Filter
- url맵핑 지정
- ex)*.do, *.jsp
- Servlet context events
- Lifecycle
- 서블릿 컨테이너가 시작될 때 반응한다. == 톰캣이 시작될 때 반응한다.
- Changes to attribute
- 서블릿 컨테이너 에 변화가 생겼을 때 반응한다.
- Lifecycle
CrawlingListener
contextDestroyed
- 종료되기 직전에 자동으로 호출된다.
contextInitialized
- 서블릿 컨테이너가 생성되는 순간 호출된다.
- 여기에 크롤링 관련 코드를 작성하면 처음에 단 한번 실행된다.
예제
@WebListener
public class CrawlingListener implements ServletContextListener {
public CrawlingListener() {
}
public void contextDestroyed(ServletContextEvent sce) {
}
public void contextInitialized(ServletContextEvent sce) {
///// 여기에 크롤링 관련 코드를 작성
ServletContext sc=sce.getServletContext();
sc.setAttribute("teemo","작은 티모");
// sc == application
System.out.println(" [로그] 리스너 서블릿 클래스에서 작성한 로그");
// "서블릿 컨테이너의 시작"에 반응한다는것을 확인!!!
}
}
'웹 > JAVA' 카테고리의 다른 글
[JAVA] HandlerMapping (1) | 2024.01.19 |
---|---|
[JAVA] web.xml (0) | 2024.01.18 |
[JAVA] 동적 크롤링 (0) | 2024.01.15 |
[JAVA] <Servlet> sendRedirect와 forward (0) | 2024.01.08 |
[웹] 파비콘 (0) | 2023.12.27 |