삶 가운데 남긴 기록 AACII.TISTORY.COM
리스너 Listener 본문
리스너
리스너는 특정 이벤트가 발생했을 때 수행되는 메소드를 제공하는 객체입니다.
웹에서는 ServletContext와 HttpSession, HttpServletRequest 가 이벤트가 발생하는 곳입니다.
그래서 각각 이벤트를 처리할 수 있는 이벤트 리스너를 제공합니다.
ServletContext는 서버 시작 시점, HttpSession은 클라이언트 접속시, 그리고 HttpServletRequest는 클라이언트가 서비스를 요청시를 의미합니다.
특정 이벤트가 발생했을 때 실행되기 원하는 내용을 해당 이벤트 핸들러 객체를 상속받아 구현한다음, 개발된 리스너를 WAS(컨테이너)가 인식 하도록 web.xml에 등록해주어야 합니다.
HttpServletRequest 객체 생성/삭제 이벤트 리스너 구현 예제
TestRequestListener.java
package net.aacii.test;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class TestRequestListener implements ServletRequestListener{
public TestRequestListener() {
System.out.println("TestRequestListener 객체 생성");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("HttpServletRequest 객체 해제");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("HttpServletRequest 객체 초기화");
}
}
위에서 구현한 리스너를 web.xml에 등록합니다.
이전에 작업했던 <filter>와 <filter-mapping> 태그들은 모두 주석 처리하고 아래 리스너 태그를 추가합니다.
<listener>
<listener-class>net.aacii.test.TestRequestListener</listener-class>
</listener>
WAS를 재시작 하면 리스너가 호출되었음을 알수있습니다
브라우저에서 http://localhost:8080/jsp/second
를 수행하면 콘솔창에 아래처럼 리스너가 호출됨을 알 수 있습니다.
HttpSession 리스너 예제
세션 객체는 언제 생성되어서 언제 종료되는지 예제를 통해 확인해봅시다.
TestSessionListener.java
package net.aacii.test;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class TestSessionListener implements HttpSessionListener{
public TestSessionListener() {
System.out.println("TestSessionListener 객체 생성");
}
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("세션 객체 생성");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("세션 객체 해제");
}
}
이어서 HttpSessionAttributeListener.java 도 작성합니다.
package net.aacii.test;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class TestSessionAttributeListener implements HttpSessionAttributeListener {
public TestSessionAttributeListener() {
System.out.println("TestSessionAttributeListener 객체 생성");
}
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("세션 객체에 속성 추가");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("세션 객체에 속성 삭제");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("세션 객체에 속성 대체");
}
}
web.xml은 기존 리스너 태그를 주석 처리하고 새로 추가합니다.
<!-- <listener>
<listener-class>net.aacii.test.TestRequestListener</listener-class>
</listener> -->
<listener>
<listener-class>net.aacii.test.TestSessionListener</listener-class>
</listener>
<listener>
<listener-class>net.aacii.test.TestSessionAttributeListener</listener-class>
</listener>
서버를 재시작 후
http://localhost:8080/edu/sessionTest?p=create
http://localhost:8080/edu/sessionTest?p=delete
http://localhost:8080/edu/sessionTest?p=add
http://localhost:8080/edu/sessionTest?p=replace
http://localhost:8080/edu/sessionTest?p=remove
를 각각 실행시켜 테스트 해보시기 바랍니다.
ServletContext 객체 리스너
servletContext 는 WAS가 실행될 때 생성되고 중지될 때 삭제됩니다.
TestServletContextListener.java를 작성합니다.
package net.aacii.test;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TestServletContextListener implements ServletContextListener{
public TestServletContextListener() {
System.out.println("TestServletContextListener 객체 생성");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("ServletContext 객체 초기화");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("ServletContext 객체 해제");
}
}
web.xml에는 기존 등록했던 리스너들을 다 주석 처리하고 바로 위에서 작성한 리스너를 등록합니다.
<!-- <listener>
<listener-class>net.aacii.test.TestRequestListener</listener-class>
</listener>
<listener>
<listener-class>net.aacii.test.TestSessionListener</listener-class>
</listener>
<listener>
<listener-class>net.aacii.test.TestSessionAttributeListener</listener-class>
</listener>
-->
<listener>
<listener-class>net.aacii.test.TestServletContextListener</listener-class>
</listener>
WAS를 시작하면 콘솔창에 리스너가 실행되었음을 확인 할 수 있습니다.
@WebListener 어노테이션
서블릿 3.0 부터 WebListener 어노테이션을 사용해서 web.xml대신 리스너를 등록할 수 있습니다.
방금 위에서 등록했던 web.xml의 TestServletContextListener 리스너를 주석 처리하고 TestServletContextListener.java 파일 클래스 이름 위에 어노테이션을 추가한 뒤 테스트를 해봅시다.
package net.aacii.test;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class TestServletContextListener implements ServletContextListener{
public TestServletContextListener() {
System.out.println("TestServletContextListener 객체 생성");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("ServletContext 객체 초기화");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("ServletContext 객체 해제");
}
}
'DEV&OPS > Java' 카테고리의 다른 글
JSP (0) | 2022.06.20 |
---|---|
web.xml 서블릿 오류 처리 (0) | 2022.06.20 |
필터 Filter (0) | 2022.06.15 |
request 상태 정보 유지 (0) | 2022.06.15 |
세션을 이용한 로그인 (0) | 2022.06.14 |