웹 컨테이너가 관리하는 라이프 사이클 사이에서 발생하는 이벤트를 감지해서 이벤트가 발생하면 해당 이벤트에 대한 로직을 처리하는 인터페이스를 말한다.
보통 Context가 초기화되는 경우, Session이 생기거나 소멸되는 경우, 요청 정보의 속성이 바뀌는 경우, 속성 값이 추가, 삭제, 수정되는 경우 사용한다.
Listener는 등록만 해두면 event가 발생 시 알아서 실행하기 때문에 listener 인터페이스를 상속 받는 클래스를 구현만 해주면 된다.
web.xml 파일에서 listener를 설정할 수 있다. <listener>
태그 안에 listener를 설정할 클래스 파일의 경로를 <listener-class>
태그에 작성해주면 된다.
<listener>
<listener-class>com.filtertest.common.listener.ContextListenerTest</listener-class>
</listener>
package com.filtertest.common.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
//ServletContextListner 인터페이스를 상속받는 클래스
public class ContextListenerTest implements ServletContextListener{
//톰캣 실행 시 context객체가 생성되고 종료 시 소멸된다.
@Override
public void contextDestroyed(ServletContextEvent sce) {
//Tomcat에서 context객체가 소멸될 때 실행(톰캣 종료시)
System.out.println("서버 종료");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
//Tomcat에서 context객체가 생성될 때 실행(톰캣 실행시)
System.out.println("서버 실행");
}
}
listener 인터페이스를 구현한 클래스에 @WebListener 어노테이션을 사용해서 listener로 사용할 수 있다.
package com.filtertest.common.listener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
@WebListener
public class RequestListenerTest implements ServletRequestListener,
ServletRequestAttributeListener {
//request가 올 때 실행됨
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("요청이 왔다");
String uri=((HttpServletRequest)sre.getServletRequest()).getRequestURI();
System.out.println(uri);
}
//setAttribute() 메소드를 실행할 때 실행됨
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("setAttribute()메소드로 데이터 추가");
String key=srae.getName();
Object value=srae.getValue();
System.out.println(key+" "+value);
}
}
ServletContextListener는 웹 어플리케이션의 ServletContext의 생성과 종료 시에 실행되는 리스너로 생성 주기가 기준이 된다. ServletContxtAttributeListener는 Context에 속성이 추가, 삭제, 수정 시에 발생한다.
HttpSessionListener는 HttpSession 객체가 생성되고 제거될 때 HttpSessionEvent가 발생하는데 이 이벤트를 처리하는 리스너이다. Session이 생성 되고 제거 되는 Session의 생성 주기를 다룰 수 있게 되므로 동시 접속자 등을 구하는데 사용할 수 있다.
HttpSessionAttributeListenr는 HttpSession에 속성 값이 추가, 삭제, 수정될 때 발생한다.
HttpSession 속성의 객체에 setAttribute()
메서드를 통해 바인딩되거나 removeAttribute()
메서드를 통해 언바인딩될 때에 대한 이벤트를 처리할 수 있도록 하는 리스너이다. 해당 인터페이스 내부에 HttpSessionBindingEvent 객체가 매개변수로 넘어오기 때문에 객체가 갖는 메소드를 활용할 수 있다.
ServletRequestListener는 request(요청)이 발생하면 실행되는 리스너고, ServletRequestAttributeListener는 HttpRequest 객체에 속성이 추가, 삭제, 수정될 때 발생하는 리스너이다.
//ServletRequestAttributeListener 메소드들
public void attributeAdded(ServletRequestAttributeEvent srae); //속성 추가
public void attributeRemoved(ServletRequestAttributeEvent srae); //속성 삭제
public void attributeReplaced(ServletRequestAttributeEvent srae); //속성 수정