Recent Posts
Recent Comments
Link
11-17 02:31
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

리스너 Listener 본문

DEV&OPS/Java

리스너 Listener

ALEPH.GEM 2022. 6. 20. 10:12

리스너

리스너는 특정 이벤트가 발생했을 때 수행되는 메소드를 제공하는 객체입니다.

웹에서는 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 객체 해제");
	}

}

 

 

 

 

 

 

 

 

 

728x90

'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