일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Java Programming
- edwith
- java
- 데이터베이스 모델링
- 객체지향
- Compute Science
- 이진법
- 알고리즘
- Computer Science
- til
- CS기초지식
- CS50
- ERD
- w3schools
- CS 기초지식
- 삼성청년SW아카데미
- 관계형 데이터베이스
- 예외처리
- 기초프로그래밍
- 모두를 위한 컴퓨터 과학
- 상속
- SSAFY 9기
- WebProgramming
- 모두를 위한 컴퓨터 과학(CS50)
- 부스트코스
- ssafy
- exception
- 면접을 위한 CS 전공지식 노트
- SW
- CS 기초
- Today
- Total
Joslynn의 하루
MSA Full-Stack 개발자 양성 과정 - JSP&Servlet Listener(이벤트 핸들러)_221012 본문
MSA Full-Stack 개발자 양성 과정 - JSP&Servlet Listener(이벤트 핸들러)_221012
Joslynn 2022. 10. 12. 12:34Listener
: 어떤 액션(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");
}
}
'MSA Full-Stack 개발자 양성과정 > JSP&Servlet' 카테고리의 다른 글
MSA Full-Stack 개발자 양성 과정 - JSP&Servlet MVC 구조 Refactoring_221014 (0) | 2022.10.14 |
---|---|
MSA Full-Stack 개발자 양성 과정 - JSP&Servlet 자료 Up-Download_221012 (0) | 2022.10.12 |
MSA Full-Stack 개발자 양성 과정 - JSP&Servlet Filter(필터), log 기록_221011 (1) | 2022.10.11 |
[Servlet] annotation과 xml 설정 (0) | 2022.10.11 |
MSA Full-Stack 개발자 양성 과정 - JSP 표현언어(EL)&JSTL_221006 (0) | 2022.10.06 |