-
JSP - 리스너(listener)JSP 2020. 6. 26. 17:07
리스너(listener)
- 특정 이벤트(특정 사건)가 발생하기를 기다리다가 실행되는 컴포넌트(메서드나 함수)를 말한다.
- 리스너는 이벤트가 발생함과 동시에 특정 메서드나 함수를 실행하는데 이것을 이벤트 핸들링 이라고 한다.
따라서, 리스너를 이벤트 핸들러라고 부르기도 한다.
* 이벤트는 발생한 특정 사건을 말하는데 예로 마우스가 클릭되거나, 키보드가 입력되거나 등이 이에 해당합니다.
* 꼭 입출력과 관련된 것만이 이벤트는 아니며 Servlet / JSP의 리스너와 같이 웹 애플리케이션의 시작이나 종료,
특정 객체의 생성, 소멸과 같은 것도 이벤트라고 말할 수있다.
추가적으로, 이벤트 소스라는 것이 있는데 이벤트 소스는 이벤트가 발생한 대상(이벤트 발생원)을 말한다.
키보드 클릭이라는 이벤트의 이벤스 소스는 키보드입니다.
정리.
- 이벤트 - 발생한 특정 사건(마우스 클릭, 키보드 입력, 클라이언트로부터의 HTTP 요청, 웹 어플리케이션 시작, )
- 이벤트 소스 - 이벤트가 발생한 대상(근원지)으로 마우스, 키보드 웹 애플리케이션(ServletContext) 등
- 리스너, 핸들러 - 이벤트가 발생되기를 기다렸다가 발생시 실행되는 메서드나 함수, 또는 메서드를 가진 객체
java에서 리스너는 객체가 되고, 특정 이벤트가 발생했을 때 실행되는 이벤트를 처리할 메서드를 가지고 있다.
Servlet / JSP 이벤트소스와 리스너 종류
이벤트 소스 이벤트 리스너 발생 이벤트 객체 설명 ServletContext ServletContextListener ServletContextEvent 웹 애플리케이션의 시작,
종료, 이벤트에 대한
이벤트 리스너.
핸들러 메서드에서는
ServletContext에 대한 참조를 얻을 수 있다.ServletContextAttributeListener ServletContextAttributeEvent ServletContext에 setAttribute, removeAttribute 했을때
이벤트 리스너.
핸들러 메서드에서는
추가하거나, 제거, 수정된
attribute 정보를
얻을 수 있다.HttpSession HttpSessionListener HttpSessionEvent Http 세션의 시작, 종료 이벤트에 대한 이벤트 리스너.
핸들러 메서드에서는
현재 세션 객체를 얻을 수
있다.HttpSessionAttributeListener HttpSessionBindingEvent HttpSession에 attribute를
추가하거나, 제거, 수정됐을
때에 이벤트 리스너.
핸들러 메서드에는 추가,
제거, 수정된 attribute를
얻을 수 있다.ServletRequest ServletRequestListener ServletRequestEvent 클라이언트로부터의
요청으로 인한 ServletRequest 생성과
응답 이후 servletRequest
제거시에 대한 이벤트 리스너
핸들러 메서드에서는 요청에
관련된 정보와 ServletContext에 대한 참조
가능ServletRequestAttributeListener ServletRequestAttributeEvent ServletRequest에 attribute를
추가하거나, 제거, 수정했을때에 대한 이벤트 리스너.
핸들러 메서드에서는
추가 하거나, 제거, 수정된
attribute 정보를 얻을 수
있다.
예제.
선행조건 -> web.xml에 사용할 listener 등록.
[web.xml]
<listener> <listener-class>kr.or.ddit.listener.Log4jInitializeListener</listener-class> </listener> <listener> <listener-class>kr.or.ddit.listener.CustomServletRequestListener</listener-class> </listener> <listener> <listener-class>kr.or.ddit.listener.SessionManager</listener-class> </listener>
예제1
- log4j.properties의 default 위치는 소스폴더 바로 아래인데 패키지 생성해서 위치 바꾸기
[Log4jInitializeListener.java]
package kr.or.ddit.listener; import javax.servlet.ServletContext; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import kr.or.ddit.utiles.Log4jInitialize; public class Log4jInitializeListener implements ServletContextAttributeListener, ServletContextListener { @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("Application(ServletContext) 최초 인스턴스 시 전파되는 이벤트 청취자 리스너"); Log4jInitialize.init(); } @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("Application(ServletContext) GC되기 직전 전파되는 이벤트 청취자 리스너"); } @Override public void attributeAdded(ServletContextAttributeEvent event) { System.out.println("Application.setAttribute(키, 값) 저장시 전파되는 이벤트 청취자 리스너"); ServletContext application = event.getServletContext(); //application.setAttributer(키,값) String key = event.getName(); Object value = event.getValue(); } @Override public void attributeRemoved(ServletContextAttributeEvent arg0) { System.out.println("application.removeAttribute(키) 삭제시 전파되는 이벤트 청취자 리스너"); } @Override public void attributeReplaced(ServletContextAttributeEvent arg0) { System.out.println("application.removeAttribute(기존 동일키, 상이값) 갱신시 전파되는 이벤트 청취자 리스너"); } }
예제2
- 세션정보를 리스너를 이용해서 사용
[SessionManager.java]
package kr.or.ddit.listener; import java.util.Enumeration; import java.util.Hashtable; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import kr.or.ddit.vo.MemberVO; public class SessionManager implements HttpSessionAttributeListener, HttpSessionListener { // 마지막 요청 30분 마다 갱신되기 때문에 Session이 새로 만들어짐 public static SessionManager sessionManager = null; // 생성된 모든 세션(모든 클라이언트)들을 저장하기 위한 public static Hashtable<String, Object> sessionMonitor; // Object 에는 세션 자체를 넣는다. public SessionManager(){ if(sessionMonitor == null){ sessionMonitor = new Hashtable<String, Object>(); } } public static synchronized SessionManager getInstance(){ if(sessionManager == null){ sessionManager = new SessionManager(); } return sessionManager; // 로그인.jsp 에서 쓸거임 } @Override public void sessionCreated(HttpSessionEvent event) { // 취득 정보 HttpSession newSession = event.getSession(); synchronized (sessionMonitor) { sessionMonitor.put(newSession.getId(), newSession); } } @Override public void sessionDestroyed(HttpSessionEvent event) { // 금번 삭제되는 세션 취득 HttpSession removeSession = event.getSession(); synchronized (sessionMonitor) { sessionMonitor.remove(removeSession.getId()); } } // 메소드 만듬 public boolean loginDuplcationCheck(String sessionID, String mem_id){ boolean flag = false; Enumeration<Object> sessions = sessionMonitor.elements(); while (sessions.hasMoreElements()) { HttpSession session = (HttpSession) sessions.nextElement(); // 로그인한 회원정보 취득 MemberVO loginedMemberInfo = (MemberVO) session.getAttribute("LOGIN_MEMBERINFO"); if(loginedMemberInfo != null) { // 해당 메서드에 전달된 mem_id 값은 금번 신규 로그인한 회원의 아이디. // loginedMemberInfo.getMem_id() 값은 기존 로그인한 회원의 아이디. if (mem_id.intern() == loginedMemberInfo.getMem_id().intern() && // 전자는 신규, 뒤는 이미 로그인 되어있다면 sessionID.intern() != session.getId().intern()) { // 세션이 다르면 // 삭제할거임 session.invalidate(); // 기존에 로그인된 세션이 삭제 된 것임 flag = true; } } } return flag; } @Override public void attributeAdded(HttpSessionBindingEvent arg0) { } @Override public void attributeRemoved(HttpSessionBindingEvent arg0) { } @Override public void attributeReplaced(HttpSessionBindingEvent arg0) { } }
'JSP' 카테고리의 다른 글
Maven 프로젝트 설정하기 (0) 2020.07.07 Filter (javax.servlet) (0) 2020.06.26 jsp 패스 (0) 2020.06.24 JSP- 파일 업로드(fileupload) 패키지 FileItem 클래스 (0) 2020.06.24 JSP - 파일 업로드(file upload) 루트 패스 설정 (0) 2020.06.24