1. 기본 개념
Javaweb의 리스너는 관찰자 설계 패턴을 통해 구현됩니다. 관찰자 모드와 관련하여 여기에 너무 많은 소개를하지 않으므로 그 의미에 대해 대략 이야기 할 것입니다.
관찰자 모드를 게시 구독 모드 또는 리스너 모드라고도합니다. 이 모드에는 관찰자와 관찰자 (일반적으로 주제라고도 함)의 두 문자가 있습니다. 관찰자는이 주제에 관심있는 사건을 등록합니다. 이 이벤트가 발생하면 주제는 콜백 인터페이스를 통해 관찰자에게 알립니다.
인생의 모범을 보여 드리겠습니다. 신문에 가입하십시오. 모든 가족이나 개인은 신문으로 신문을 구독 할 수 있습니다. 여기서 신문은 "테마"이고 가족은 "관찰자"입니다. 예를 들어, 가족이 내일 아침 신문을 구독해야한다면 이것은 "이벤트"입니다. 다음날 아침, 신문은 제작되었으며 이것은 "이벤트"였습니다. 사건이 발생하면 신문은 신문을 "콜백 인터페이스"인 홈 사서함으로 보냅니다.
Javaweb의 리스너의 경우 서블릿 사양은 청취자 인터페이스 클래스의 일부 열을 정의하여 인터페이스 클래스를 통해 응용 프로그램에 이벤트를 노출시킵니다. 응용 프로그램이 관심있는 이벤트를 듣기를 원한다면 해당 이벤트를 직접 등록 할 필요가 없습니다. 대신, 해당 인터페이스 클래스를 구현하기 위해 자체 리스너를 작성하고 자체 청취자를 서블릿 컨테이너에 등록합니다. 프로그램에 관심이있는 이벤트가 발생하면 서블릿 컨테이너는 리스너에게 알리고 리스너의 메소드를 다시 호출합니다. 여기에 맞춤형 청취자는 관찰자이며 서블릿 컨테이너가 테마입니다.
2. 샘플 분석
위에서 언급했듯이 서블릿 컨테이너는 리스너 인터페이스 클래스를 통해 이벤트를 응용 프로그램에 노출시킵니다. 따라서 우리는 이벤트 등록에 관한 것이 아니라 오히려 청취자 등록에 관한 것입니다. 해당 프로그래밍 단계는 다음과 같습니다. 1. 자신의 리스너를 작성하고 특정 리스너 인터페이스를 구현하십시오. 2. 리스너를 web.xml에 등록하십시오. 다음은 가장 간단한 리스너 인터페이스 ServletContextListener의 예입니다.
1.testlistener.java
Public Class TestListener는 servletcontextListener {public testListener () {} public void contextInitialized (servletContexTevent scce) {system.out.println ( "servletcontextListener.contextInitialized");} public void contextroyed (servletcontexteoded (servletcontextlister.contextinitialized); {system.out.println ( "servletcontextListener.contextDestroyed");}}2.web.xml
<Leater> <Leater-Class> com.nantang.listener.testlistener </Leater-Class> </laiseer>
컨테이너가 시작되면 "ServletContextListener.contextInitialized"가 로그에 출력되고 컨테이너가 닫히면 "ServletContextListener.contextDestroyed"가 출력됩니다. 자세한 설명은 나중에 추가로 분석 될 것입니다.
여기서는 IDE (Eclipse, ST 등)에서 위의 예를 보여 주면 서버를 시작할 때 콘솔에서 "ServletContextListener.contextInitialized"를 볼 수 있으며 서버를 닫을 때 "ServletContextListener.contextDestroyed"를 볼 수 없습니다. 이것은 ContextDestroyed 메소드가 실행되지 않고 IDE가 완벽하게 구현되지 않는다는 것입니다. ContextDestroyed가 실제로 호출되는지 확인하려면 ContextDestroyed에서 코드를 작성하여 파일을 콘솔에 출력하는 대신 파일의 내용을 출력 할 수 있습니다.
3. 소스 코드 분석
이제 서블릿 사양이 우리를 위해 정의하는 이벤트를 분석 해 봅시다. 더 정확하게는 어떤 청취 인터페이스가 정의됩니다. 다음 소개는 Servlet 3.0 사양을 기반으로합니다.
Servlet3.0은 8 개의 리스너 인터페이스를 제공합니다.이 인터페이스는 범위에 따라 세 가지 범주로 나눌 수 있습니다.
1. ServletContextListener 및 ServletContextTattributeListener를 포함한 Servlet Context 관련 청취 인터페이스.
2. httpsessionListener, httpsessionActivationListener, httpsessionAttributeListener 및 httpsessionBindingListener를 포함한 HTTP 세션 관련 청취 인터페이스.
3. ServletRequestListener 및 ServletRequestAttributeListener를 포함하여 Servlet Request와 관련된 청취 인터페이스.
실제로, 인터페이스의 명명을 통해 기본 기능을 추측 할 수 있어야합니다. 아래 카테고리별로 설명해 봅시다.
1. 서비스 컨텍스트 관련 청취 인터페이스
서블릿을 도입 할 때 웹 응용 프로그램이 서블릿 컨텍스트에 해당한다고 설명했습니다. 따라서 ServletContextListener와 ServletContextTattributeListener가 듣는 이벤트의 수명 범위는 전체 웹 응용 프로그램을 통해 실행됩니다. 아래는이 두 인터페이스 사이의 클래스 다이어그램 계층 관계입니다.
1.1 EventListener
EventListener는 태그 인터페이스이며 모든 이벤트 리스너는이 인터페이스를 상속해야합니다. 이것은 서블릿 사양이며 설명이 없습니다.
1.2 EventObject
EventListener와 유사하게 EventObject는 이벤트 레벨 클래스이며 모든 특정 이벤트 클래스는 EventObject를 상속해야합니다.
공개 클래스 eventObject는 java.io.serializable {보호 된 과도 객체 소스; public eventObject (객체 소스) {if (source == null) {null source "); this.source = source;} public object getSource () {return source;} public string () {return +"getname () getclass () getclass (). "]";}}이 수업은 매우 간단하고 본질은 한 가지 일뿐입니다. 소스입니다. 클래스 이름 EventObject 및 속성 이름 소스를 통해이 클래스가 "이벤트 소스 객체"를 보유하는 한 가지를 수행한다는 것을 알 수 있습니다.
1.3 servletcontextevent
공개 클래스 ServletContexTevent java.util.eventObject {public servletcontextevent (servletcontext source) {super (source);} public servletcontext getservletcontext () {return (servletcontext) super.getSource ()서블릿 컨텍스트 이벤트 이벤트 클래스는 EventObject의 간단한 상속입니다. ServletContext 인스턴스는 생성자의 이벤트 소스로 제공됩니다. 이벤트 소스는 서블릿 컨텍스트이므로 ServletContext 인스턴스를 얻기 위해 GetServletContext가 제공됩니다.
향후 다른 이벤트 클래스를 설명 할 때 모두 같은 곰팡이입니다. 각 이벤트 클래스는 해당 구성 방법을 제공하고 해당 이벤트 소스 개체를 전달하며 이벤트 소스를 얻는 추가 방법을 제공합니다. 따라서 EventObject는 기본 이벤트 소스입니다. 모든 이벤트 서브 클래스의 본질은 한 가지를 수행하고 특정 이벤트 소스 개체를 결정합니다.
그래서 우리가 사건을 설명 할 곳은 나중에지나갑니다.
1.4 ServletContextListener
Public Interface ServletContextListener 확장 EventListener {public void ContextInitialized (ServletContexTevent SCE); Public Void ContextDestroyed (ServletContexTevent SCE);}서블릿 컨텍스트 리스너 인터페이스는 서블릿 컨텍스트 초기화 이벤트와 서블릿 컨텍스트 종료 이벤트의 두 가지 이벤트에 해당합니다.
웹 응용 프로그램이 초기화되면 서블릿 컨테이너는 ServletContexTeven 인스턴스를 구성하고 ContextInitialize 메소드를 다시 호출합니다.
서블릿 컨텍스트가 닫히려는 경우, 일반적으로 서버를 닫기 전에 서블릿 컨테이너는 ServletContexTeven 인스턴스를 구성하고 ContextDestroyed 메소드를 다시 호출합니다. 여기서는 모든 서블릿과 필터가 파괴 방법을 완료 한 후 ContextDestroyed 메소드의 실행이 수행 될 것이라는 점에 유의해야합니다.
따라서 응용 프로그램이 시작되거나 닫힐 때 무언가를하고 싶다면 인터페이스를 구현하기 위해 자신의 리스너를 작성합니다.
모든 이벤트 리스너도 같은 모델입니다. 해당 이벤트 콜백 인터페이스 메소드는 서블릿 사양에 따라 정의됩니다. 메소드 입력 매개 변수는 해당 이벤트 소스 인스턴스입니다. 그래서 우리는 나중에 모니터를 설명 할 곳을 지나갈 것입니다.
1.5 ServletContextAttributeevent
공공 클래스 ServletContextAttributeevent는 servletcontexTevent {private String 이름; 개인 객체 값; public servletcontext 소스, 문자열 이름, 객체 값) {super (source); this.name = name; value = value;} public string getName () {return this.name (return this.name) {value get this.name () }}ServletContextAttriptributeevent는 서블릿 컨텍스트 속성과 관련된 이벤트를 나타냅니다. 일반적으로 속성이 변경되면 이벤트가 트리거됩니다. 이 클래스는 ServletContexTeven을 상속하고 이벤트 소스는 ServletContext 인스턴스입니다. 속성 이름 및 속성 값을 얻는 추가 방법이 제공됩니다.
1.6 ServletContextAttRiptipListener
Public Interface ServletContextAttributeListener는 eventListener를 확장합니다.
서블릿의 위의 속성이 추가, 삭제 또는 수정되면 Servlet 컨테이너는 ServletContextAttritBireTeevent 이벤트 객체를 구성하고 각각 Eartributeadded, AttributerMoved 및 AgarterEperePlaced 메소드를 호출합니다.
여기에 주목해야 할 것은 속성 값이 바뀔 때 다시 호출되는 AquributeEplaced 메소드입니다. 현재 ServletContextAttributeeevent.getValue () 메소드를 호출하면 리턴은 이전 속성 값을 대체하는 것입니다.
2 HTTP 세션 관련 청취 인터페이스
2.1 httpsessionevent
public class httpsessionevent는 java.util.eventobject {public httpsessionevent (httpsession source) {super (source);} public httpsession getsession () {return (httpsession) super.getSource ();}}를 확장합니다.HTTP 세션 관련 이벤트. 세션이 변경 될 때 트리거됩니다. 이벤트 소스는 httpsession 인스턴스이며 추가 httpsession 획득 방법을 제공합니다.
2.2 httpsessionListener
public interface httpsessionListener 확장 eventListener {public void sessioncreated (httpssessionEvent se); public void SessionDestroyed (httpsessionevent se);}세션이 생성되고 파괴되면 서블릿 컨테이너는 httpsessionEvent 이벤트 객체를 구성하고 세션 크리팅 및 세션에서 파괴 된 메소드를 다시 호출합니다.
2.3 httpsessionActivationListener
public interface httpsessionActivationListener는 EventListener를 확장합니다. public void sessionDidActivate (httpssessionEvent se);}
세션이 유동화되거나 활성화 될 때, 서블릿 컨테이너는 httpsessionEvent 이벤트 객체를 구성하고, 콜백 세션은 실패하고 SessionDidActivate 메소드를 구성합니다.
패시베이션 및 활성화는 여기에 설명되어 있습니다. 패시베이션은 서버의 메모리가 불충분하거나 세션의 활동 시간 초과가 도착했으며 최근 비활성 세션이 디스크로 직렬화됩니다. 활성화는 수동 세션에 다시 액세스하여 세션을 디스크에서 메모리로 삼아야 함을 의미합니다.
여기서는 수로와 활성화를 위해서는 세션이 먼저 직렬화되고 사형화되어야한다는 것을 알 수 있습니다. 동시에 프로그래밍 과정에서 가능한 한 String 및 Integer와 같은 간단한 개체를 사용하고 목록 및지도와 같은 컬렉션을 사용하지 않으려 고 노력합니다.
2.4 httpsessionBindingEvent
Public Class httpsessionBindingEvent는 httpsessionEvent {private String name; private 객체 값; public httpssessionbindingevent (httpsession session, string) {sever (session); this.name = name;} public httpsessionBindingEvent (httpsession 세션, 문자열 이름, 개체 값) {this.name =; this.name =; value;} public httpsession getsession () {return super.getSession ();} public String getName () {return name;} public object getValue () {return this.Value; }}HTTP 세션 속성과 관련된 이벤트는 세션 속성이 변경 될 때 트리거됩니다. 이벤트 소스는 httpsession 인스턴스이며 httpsession, 속성 이름 및 속성 값을 얻는 추가 방법을 제공합니다.
2.5 httpsessionattripteListener
public interface httpsessionattributeListener는 eventListener를 확장합니다.
세션 속성이 추가, 삭제 또는 수정되면 서블릿 컨테이너는 httpsessionBindingEvent 이벤트 객체를 구성하고 각각 Eartributeadded, AttributerMoved 및 AttributeRePlaced 메소드를 호출합니다.
여기에 주목해야 할 것은 속성 값이 바뀔 때 다시 호출되는 AquributeEplaced 메소드입니다. 현재 ServletContextAttributeeevent.getValue () 메소드를 호출하면 리턴은 이전 속성 값을 대체하는 것입니다.
세션의 무효화 메소드가 호출되거나 세션이 실패하면 Attributermed 메소드도 다시 호출됩니다.
2.6 httpsessionbindingListener
public interface httpsessionBindingListener는 EventListener {public void valueBound (httpssessionBindingEvent); public void valueUnbound (httpssessionBindingEvent 이벤트);} 확장됩니다.이 리스너는 또한 세션 속성의 변경 사항을 듣습니다. 세션 속성이 추가 및 삭제 될 때, 즉 속성 값이 바인딩되고 속성 값이 미확인되면 서블릿 컨테이너는 httpsessionBindingEvent 이벤트 객체를 구성하고 valueBound 및 ValueUnbound 메소드를 각각 호출합니다.
httpsessionattributeListener와 다르지 않지만 그렇지 않습니다. 이 둘의 필수 차이점은 이벤트 트리거 조건입니다.
세션 속성에 변경 사항이 있으면 서블릿 컨테이너는 httpsessionattritipelistener에 알립니다. 그러나 httpsessionBindingListener의 경우, 바인딩 또는 비핀 속성 값이 리스너의 인스턴스 인 경우에만 서블릿 컨테이너가 알립니다. 예를 들어:
Public Class TestListener는 httpsessionBindingListener {@overridepublic void valueBound (httpssessionBindingEvent) {system.out.println ( "httpsessionBindingListener.ValueBound");}@attrementpublic valueUnbound (httpsessionbent evintevent 이벤트)를 구현합니다. {System.out.println ( "httpsessionBindingListener.ValueUnbound";}}HttpsessionBindingListener를 구현하기 위해 Listener TestListener를 사용자 정의합니다. 코드에서 다음 세션 속성을 설정하겠습니다.
httpsession session = request.getSession (); testListener testListener = new TestListener (); session.setAttribute ( "Listener", TestListener); session.removeattribute ( "Listener");
여기서 세션의 속성 값은 리스너 TestListener 인스턴스입니다. 따라서이 코드가 실행되면 Servlet 컨테이너는 TestListener에 알리고 ValueBound 및 ValueUnbound 메소드를 다시 호출합니다.
여기서는 세션의 무효화 메소드가 호출되거나 세션이 실패하면 valueUnbound 메소드도 다시 호출됩니다.
3 서블릿 요청 관련 청취 인터페이스
3.1 ServletRequestEvent
공공 클래스 ServletRequestevent는 java.util.eventObject {private servletrequest 요청; 공공 servletrequestevent (servletContext sc, servletrequest request) {super (sc); this.request = recight;} public servletcontext (repord this.request; (servletcontext) super.getSource ();}}요청이 변경되면 서틀 요청과 관련된 이벤트가 트리거됩니다. 이벤트 소스는 ServletContext 인스턴스이며 ServletContext 및 ServletRequest 메소드의 추가 페치를 제공합니다.
3.2 ServletRequestListener
공개 인터페이스 ServletRequestListener 확장 EventListener {public void requestDestroyed (servletRequestevent SRE); public void requestInitialized (servletRequestevent SRE);}요청이 초기화되거나 파괴되면 클라이언트는 웹 애플리케이션 (서블릿 또는 첫 번째 필터를 입력)을 입력하도록 요청하거나 웹 응용 프로그램은 클라이언트에 대한 응답을 반환합니다 (서블릿 또는 첫 번째 필터를 종료). Servlet 컨테이너는 ServletRequestEvent 인스턴스를 구성하고 요청 시설 화 및 요청 파괴 메소드를 다시 호출합니다.
3.3 ServletRequestattributeevent
공공 클래스 ServletRequestattreeTeevent는 servletrequestevent를 확장합니다. {private String 이름; 개인 객체 값; 공공 servletrequestattributeevent (servletcontext sc, servletrequest 요청, 문자열 이름, 객체 값) {super (sc, request); this.name = name; this.value = value; this.value; }}서블릿과 관련된 이벤트는 속성을 요청하며, 요청 속성이 변경 될 때 트리거됩니다. 이벤트 소스는 ServletContext 인스턴스이며 속성 이름 및 속성 값을 얻는 추가 메소드를 제공합니다.
3.4 ServletRequestAttriptireListener
Public Interface ServletRequestattributeListener는 EventListener를 확장합니다.
요청 된 속성이 추가, 삭제 또는 수정되면 Servlet 컨테이너는 ServletRequestAttributeevent 이벤트 객체를 구성하고 각각 Eartributeadded, AttributerMoved 및 AttributeReplaced 메소드를 호출합니다.
여기에 주목해야 할 것은 속성 값이 바뀔 때 다시 호출되는 AquributeEplaced 메소드입니다. 현재 ServletRequestattributeeevent.getValue () 메소드를 호출하면 리턴은 이전 속성 값을 대체하는 것입니다.
4. 요약
이 시점에서 청취자는 말을 마쳤습니다. 우리는 리스너, 서블릿 및 필터가 공통점이 있다는 것을 알 수 있습니다. 둘 다 컨테이너로 예약되어 있습니다. 우리는 우리가 관심을 갖고 등록하는 리스너 인터페이스를 구현하기 위해 자신의 리스너를 작성하면됩니다. 나머지 직업은 우리 자신의 청취자에게 비즈니스 로직을 작성하는 것입니다.
이 블로그 게시물에 소개 된 리스너는 Servlet 3.0 사양에 의해 공식화됩니다. 3.1은 일부 이벤트 리스너 인터페이스를 추가했으며 원칙은 비슷합니다. 독자는 스스로 이해할 수 있습니다.