Joslynn의 하루

MSA Full-Stack 개발자 양성 과정 - JSP&Servlet Listener(이벤트 핸들러)_221012 본문

MSA Full-Stack 개발자 양성과정/JSP&Servlet

MSA Full-Stack 개발자 양성 과정 - JSP&Servlet Listener(이벤트 핸들러)_221012

Joslynn 2022. 10. 12. 12:34

Listener

: 어떤 액션(event)이 발생했을 때, 호출되어지는 메소드들이 이미 정의되어 있는 interface를 제공한다.

 

종류

1) ServletContextListener

    : 서버 시작(start) 시 호출되는 메소드와 서버 종료(stop) 시 호출되는 메소드를 가짐

2) HttpSessionListener

    : 브라우저(session) 시작 시 호출되는 메소드 & 브라우저 종료 시 호출되는 메소드

3) ServletRequestListener

    : 요청 시 호출 메소드 & 요청 종료 시 호출 메소드

 

사용 방법

public class A implements XxxListener {
     //메소드 재정의
}

 

: event가 일어날 때 메소드가 호출되기 위해서 Xxx 구현체를 생성

1) web.xml 문서에 등록

<listener>
	<listener-class>클래스 이름</listener-class>
</listener>

 

: 이벤트 발생 시 자동 호출되므로, mapping 작업이 필요하지 않음

2) @Annotation 설정

@WebListener
public class A implements XxxListener {
	//이벤트 발생 시 자동 호출되므로 url-pattern이 필요 없음
}

 

**참고사항 - Tomcat

: 프로젝트를 tomcat에 올릴 때,

: tomcat은 server.xml 문서를 읽어서 프로젝트(contextPath)를 구성 → 각각의 프로젝트가 가진 web.xml 문서를 읽어 프로젝트별 servlet, filter, listener를 구성

 


ServletContextListener 메소드

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class AppListener implements ServletContextListener {

	public AppListener() {
		System.out.println("AppListener 생성자 호출...");
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("AppListener contextDestroyed call....");
	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("AppListener contextInitialized call....");
	}

}

 

 

HttpSessionListener 메소드

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class SessionListener implements HttpSessionListener {

	public SessionListener() {
		System.out.println("SessionListener Constructor call...");
	}

	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("SessionListener sessionCreated call...");
	}

	/** 세션이 종료될 때 호출
	 * */
	public void sessionDestroyed(HttpSessionEvent se) {
		System.out.println("SessionListener sessionDestroyed call...");
	}

}

**주의사항

sessionDestroyed()메소드 호출

: 세션이 종료될 때 호출

: 브라우저 또는 탭의 x를 클릭 시 호출되지 않음
1) session.invalidate();
2) session timeout 되었을 때,

    ex) session이 1분 후 만료(web.xml에서 설정)

 

 

**브라우저 접속자 수 출력 예제

: 모든 유저들이 사용하게 될 접속자 변수가 필요 - ServletContext 영역..

: 접속되면, 기존의 접속자 변수를 조회해서 1을 증가

: 접속이 끊기면, 기존의 접속사 변수를 조회해서 1을 감소

 **동기화 처리가 이미 완료된  AtomicInteger 사용

import java.util.concurrent.atomic.AtomicInteger;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class UserAccessCounterListener implements ServletContextListener, HttpSessionListener {
	private ServletContext application;

	public UserAccessCounterListener() {
		System.out.println("UserAccessCounterListener 생성자 call...");
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("UserAccessCounterListener contextDestroyed() call...");
	}

	/**
	 * 서버가 시작될 때...
	 */
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		application = sce.getServletContext();
		application.setAttribute("count", new AtomicInteger()); // 뷰에서 {applicationScope.count}로 접근 가능
	}

	/**
	 * 세션이 시작될 때 count 증가
	 */
	@Override
	public void sessionCreated(HttpSessionEvent se) {
		AtomicInteger at = (AtomicInteger) application.getAttribute("count");
		int nowCount = at.incrementAndGet();
		System.out.println("증가한 후(현재 접속자 수): " + nowCount + "명");
	}

	/**
	 * 세션이 종료될 때 count 감소
	 */
	@Override
	public void sessionDestroyed(HttpSessionEvent se) {
		AtomicInteger at = (AtomicInteger) application.getAttribute("count");
		int nowCount = at.decrementAndGet();
		System.out.println("감소한 후(현재 접속자 수): " + nowCount + "명");
	}
}

 

 

ServletRequestListener 예제

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class TimerRequestListener implements ServletRequestListener {
	long start, end;

	public TimerRequestListener() {
		System.out.println("TimerRequestListener Constructor call...");
	}

	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("TimerRequestListener requestDestroyed call....");
		start = System.currentTimeMillis();
	}

	public void requestInitialized(ServletRequestEvent sre) {
		System.out.println("TimerRequestListener requestInitialized call....");
		end = System.currentTimeMillis();
		System.out.println("총 소요 ms: " + (end - start) + "ms");
	}
}
Comments