서블릿 이벤트
서블릿은 다양한 시점에 발생되는 이벤트와 이벤트를 처리하기 위한 인터페이스를 정의하고 있다.
이들 이벤트와 인터페이스를 이용하면 웹 어플리케이션에서 필요로 하는 데이터의 초기화나 요청 처리 등을 추적할 수 있고, 데이터 저장 영역 ( application, session, request)에 데이터가 들어가고 나가는 (혹은 그 객체가 생성되고 소멸되는) 일련의 작업들에 대해 컨트롤이 가능하다.
이런 이벤트에 대해서 미리 web.xml 파일에 등록해두면 웹 서버는 초기 구동 시에 해당 이벤트를 대기 상태로 두었다가 이벤트 발생 시 자동으로 이벤트를 감지하고 우리가 지정한 클래스 내의 메서드를 실행해준다.
때문에 서블릿에서 이벤트 클래스를 실행되게 하려면 web.xml 파일의 설정이 중요하다.
이러한 이벤트는 외부의 변화보다는 내부의 변화를 처리하는 경우가 많다.
< 이벤트 리스너의 종류 >
1. ServletContextListener
- 웹 어플리케이션의 시작과 종료시 자동으로 발생
2. SevletContextAttributeListener
- ServletContext 객체에 속성이 추가, 삭제, 수정될 때 발생
3. HttpSessionListener
- HttpSession 객체가 생성되거나 소멸될 때 발생
4. HttpSessionAttributeListener
- HttpSession 객체에 속성이 추가, 삭제, 수정될 때 발생
ServletContextListener API
서블릿이 LifeCycle를 가지고 있는 것처럼, 웹 어플리케이션도 LifeCycle를 갖는다.
Tomcat 컨테이너가 시작될 때 웹 어플리케이션도 초기화되고, Tomcat 컨테이너가 종료될 때 웹 어 플리케이션도 제거된다.
웹 어플리케이션이 초기화되고 제거되는 이벤트를 감지하는 ServletContextListener API를 사용하면, 언제 초기화되고 제거 되었는지를 쉽게 알 수 있다.
< 실습 >
1) Listener 클래스 작성
public class ServletContextListenerImpl
implements ServletContextListener { // default 메소드가 들어있음
@Override
public void contextInitialized(ServletContextEvent e) { // 웹어플리케이션에 필요한 자원객체 생성
log.trace("contextInitialized() invoked.");
}//contextInitialized
@Override
public void contextDestroyed(ServletContextEvent e) { // 사용했던 자원객체 해제
log.trace("contextDestroyed() invoked.");
}//contextDestroyed
}//class
2) web.xml에 태그를 사용하여 등록하거나, @WebListener 어노테이션을 사용하여 등록
* web.xml 파일 설정
- <listener> 태그를 사용해 ServletContextListener를 구현한 클래스를 등록.
- 리스너로 등록되면 Tomcat 컨테이너가 시작 및 종료 시에 이벤트를 감지할 수 있음
* @WebListener 어노테이션
- web.xml에 <listener> 태그를 등록하는 대신에, 어노테이션으로 listener 등록이 가능하다.
@WebListener
public class ServletContextListenerImpl
implements ServletContextListener {
}
콘솔창 로그 확인
- 초기화 감지
- 제거 감지
Filter API
클라이언트인 웹 브라우저에서 서블릿으로 요청하면, 웹 컴포넌트인 서블릿이 요청을 받아 서 작업을 처리하고 결과를 HTML 형식으로 작성하여 웹 브라우저에게 응답 처리한다.
이때, 서블릿이 요청 받기 전과 결과를 웹 브라우저에게 응답하기 전에 특정 작업을 수행할 수 있도록 Filter API를 사용할 수 있다.
즉, 웹 컴포넌트가 실행되기 전의 선처리(pre-processing) 작업과 응답되기 전의 후처리(post-processing) 작업을 수행하는 API이다.
다수의 Filter를 체인(Chain)처럼 묶어서 적용시킬 수도 있으며, 선처리 작업의 필터를 요청 필터(Request Filter)라고 하고 후처리 작업의 필터를 응답필터(Response Filter)라고 한다.
- 선 처리 작업의 대표적인 적용 예 - 한글인코딩 및 보안관련 작업 등
- 후처리 작업 - 압축 및 데이터 변환작업 등
< 실습 >
1) Filter 인터페이스를 구현한 클래스를 작성
public class MyFilter
extends HttpFilter implements Filter {
public void init(FilterConfig fConfig) throws ServletException {
log.trace("MyFilter 초기화");
} // init
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
// 1. 요청에 대한 선처리 (Pre-processing or Munging)
log.info("\t+ Pre-processing for request.");
res.setContentType("text/html; charset=utf8");
// 요청(request)에 대한 선처리와 응답(response)에 후처리를 제어하는 호출
chain.doFilter(req, res);
// 2. 응답에 대한 후처리 (Post-processing)
log.info("\t+ Post-processing for request.");
} // doFilter
public void destroy() {
log.trace("MyFilter 제거");
} // destroy
} // end class
2) web.xml에 태그를 사용하여 등록하거나, @WebFilter 어노테이션을 사용하여 등록
- web.xml 설정
- @WebFilter 어노테이션 사용
@WebFilter("/*")
public class MyFilter extends HttpFilter implements Filter {
}
3) 콘솔창 로그를 통해 Filter가 적용되었는지 확인
- 초기화
- Filter 작업 ( 선처리 / 후처리 )
- 제거
'교육과정 기록 > 💻back-end' 카테고리의 다른 글
[7.25] 서블릿 - 파일 업로드 & 다운로드 (0) | 2022.07.25 |
---|---|
[7.21] 서블릿 - 세션 관리 (0) | 2022.07.21 |
[7.15] 서블릿에서 파일 접근 (0) | 2022.07.15 |
[7.14] 서블릿 핵심 클래스 (0) | 2022.07.14 |
[7.13] 서블릿 (맵핑 & API & 파라미터 처리) (0) | 2022.07.14 |