1. Основные понятия
Слушатель в Javaweb реализуется с помощью шаблона дизайна наблюдателя. Что касается режима наблюдателя, я не буду здесь много вводить, поэтому я грубо расскажу о том, что это значит.
Режим наблюдателя также называется режимом подписки Publish или в режиме прослушивателя. В этом режиме есть два символа: наблюдатель и наблюдатель (обычно также называют субъектом). Наблюдатель регистрирует событие интереса к этой теме. Когда это событие произойдет, тема уведомит наблюдателя через интерфейс обратного вызова.
Позвольте мне привести вам пример в жизни: подписаться на газеты. Любая семья или человек может подписаться на газеты с газетой. Здесь газета - это «тема», а семья - «наблюдатель». Например, если семья должна подписаться на газету завтра утром, это «событие». На следующее утро газета была выпущена, и это было «событие». Когда происходит инцидент, газета отправляет газету в домашний почтовый ящик, который является «интерфейсом обратного вызова».
Для слушателей в Javaweb спецификация сервлета определяет некоторые столбцы классов интерфейса слушателя, разоблачая события для приложения через классы интерфейса. Если приложение хочет выслушать интересующие события, оно не должно напрямую регистрировать соответствующее событие. Вместо этого он пишет своего собственного слушателя для реализации соответствующего класса интерфейса и регистрирует своего собственного слушателя в контейнер сервлета. Когда происходит событие, о котором заботится программа, контейнер сервлета уведомит слушателя и вызовет методы у слушателя. Индивидуальный слушатель здесь - наблюдатель, а контейнер сервлета является темой.
2. Анализ образцов
Как упомянуто выше, контейнер сервлета разоблачает события в приложение через класс интерфейса слушателя. Таким образом, мы не столько о регистрации событий, а скорее регистрируем слушателей. Соответствующие шаги программирования: 1. Напишите свой собственный слушатель и реализуйте конкретный интерфейс слушателя. 2. Зарегистрируйте слушателя в web.xml. Вот пример простейшего интерфейса прослушивателя ServletContextListener:
1.testlistener.java
Общедоступный класс TestListener реализует ServletContextListener {public TestListener () {} public void ContextInitialized (ServletContexTevent Scce) {System.out.println ("ServletContextListener.contextInitialized");} public void ContextDestroyed (ServletContextevent.contextInitialized ");} public void contextDestroyed (ServletContextevent Scce) {System.out.println ("ServletContextListener.contextDestroyed");}}2.Web.xml
<Learser> <lloader-class> com.nantang.listener.testlistener </stirlicer-class> </sluster>
Когда контейнер запускается, «ServletContextListener.ContextInitialized» будет выводиться в журнал, а когда контейнер будет закрыт », будет выведен контейнер». Подробное объяснение будет дополнительно проанализировано позже.
Здесь следует отметить, что если вы продемонстрируете приведенный выше пример в IDE (Eclipse, STS и т. Д.), При запуске сервера вы можете увидеть «ServletContextListener.ContextInitialized» в консоли, а при закрытии сервера вы не можете увидеть «servletContextListener.ContextDestroyed». Это не то, что метод контекста не выполняется, а в том, что IDE не реализует его идеально. Чтобы убедиться, что контекст -эфир действительно называется, вы можете написать кусок кода в контексте, чтобы вывести содержимое файла, а не выводить его в консоли.
3. Анализ исходного кода
Теперь давайте проанализируем, какие события определяет спецификация сервлета для нас. Точнее, какие прослушивающие интерфейсы определены. Следующие введения основаны на спецификации Сервлета 3.0.
Servlet3.0 предоставляет нам 8 интерфейсов слушателя, которые можно разделить на три категории в соответствии с их сферой:
1. Сервант, связанные с контекстом, интерфейсы прослушивания, включая: ServletContextListener и ServletContextAttributeListener.
2. HTTP-сеанс, связанные с прослушиванием, в том числе: httpsessionListener, httpsessionActivitylistener, httpsessionattributeListener и httpsessionBindingListener.
3. Интерфейс прослушивания, связанный с запросом сервлета, в том числе: ServletRequestListener и ServletRequestatTributeListener.
Фактически, от именования интерфейса, вы сможете угадать его основные функции. Давайте объясним это по категории ниже.
1. Связь с контекстом, связанный с контекстом, интерфейс прослушивания
При введении сервлетов ранее мы объяснили, что веб -приложение соответствует контексту сервлета. Таким образом, срок службы событий, прослушиваемых ServletContextListener и ServletContextAttributeListener, проходит через все веб -приложение. Ниже приведена взаимосвязь иерархии классов между этими двумя интерфейсами.
1.1 EventListener
EventListener - это интерфейс тегов, и все слушатели событий должны наследовать этот интерфейс. Это спецификация сервлета, и нет никакого объяснения.
1.2 EventObject
Подобно EventListener, EventObject-это класс на уровне событий, и все конкретные классы событий должны наследовать EventObject.
Общественный класс EventObject реализует java.io.serializable {защищенный источник переходного объекта; public EventObject (Object Source) {if (Source == null). "]";}}Этот класс очень прост, его сущность - только одна вещь: источник. Через имя класса EventObject и источник имени свойства вы можете видеть, что этот класс делает одну вещь, удерживая «объект источника события».
1.3 ServletContextevent
Общедоступный класс ServletContexTevent Extends java.Util.eventObject {public servletContexTexTent (ServletContext Source) {Super (Source);} public servletContext getServletContext () {return (servletContext) super.getSource ();}}Событие контекста сервлета, этот класс событий является простым наследством EventObject. Экземпляр ServletContext предоставляется в качестве источника события в конструкторе. Поскольку источник события является контекстом сервлета, для получения экземпляра ServletContext предоставляется getservletContext.
Когда мы объясним другие занятия событиями в будущем, они все одинакова. Каждый класс событий предоставляет соответствующий метод строительства, проходит в соответствующем объекте источника события и предоставляет дополнительные методы для получения источника события. Поэтому EventObject является базовым классом источника событий. Суть всех подклассов событий делает одну вещь, определяйте конкретный объект источника события.
Таким образом, место, где мы объясним, что инцидент проходит позже.
1.4 ServletContextListener
Общедоступный интерфейс ServletContextListener Eventlestslistener {public void ContextInitialized (ServletContextevent SCE); public void contextDestroyed (ServletContexTevent SCE);}Интерфейс слушателя контекста сервлета соответствует двум событиям: событие инициализации контекста сервлета и событие закрытия контекста сервлета.
Когда веб -приложение будет инициализировано, контейнер сервлета будет построить экземпляр ServletContextexteven и вызовать метод контекста.
Когда контекст сервлета собирается быть закрытым, обычно перед закрытием сервера, контейнер сервлета будет построить экземпляр ServletContextexteven и вызовать метод контекста. Здесь следует отметить, что выполнение контекстного метода будет выполнено после того, как все сервлеты и фильтры завершили метод уничтожения.
Поэтому, если мы хотим что -то сделать, когда приложение запустится или закрывается, мы напишем нашего собственного слушателя, чтобы реализовать интерфейс.
Все слушатели событий также являются одной и той же моделью. Соответствующий метод интерфейса обратного вызова событий определяется в соответствии со спецификацией сервлета. Параметр ввода метода является соответствующим экземпляром источника события. Таким образом, мы также пройдем мимо места, где мы объясним монитор позже.
1.5 ServletContextattributeVent
открытый класс ServletContextAttribitevent extends servletContexTextent {private String name; значение частного объекта; }}ServletContextAttributevent представляет событие, связанное с атрибутом контекста сервлета. Как правило, событие будет вызвано при изменении атрибута. Этот класс наследует ServletContextexteven, а источник события также является экземпляром ServletContext. Дополнительные методы получения имен атрибутов и значений атрибутов предоставляются.
1.6 ServletContextattributeListener
Общедоступный интерфейс ServletContextAttribiteListener Eventends EventListener {public void attributeAdded (ServletContextAtTtributevent Scab); public void attributerEmoved (ServletContextAtTtributevent scab);Когда приведенные выше атрибуты сервлета добавляются, удаляются или модифицированы, контейнер сервлета конструирует объект события ServletContextAtTributevent и вызывает методы AttributeAded, AttributeRemoved и AttributeReeRepere, соответственно.
Здесь нужно отметить метод AttributeReeRepered, который вызывает обратно, когда значение атрибута заменяется. В настоящее время, если вы называете метод ServletContextAttribitevent.getValue (), возврат должен заменить предыдущее значение атрибута.
2 интерфейс прослушивания, связанный с сеансом HTTP
2.1 httpsessionEvent
открытый класс httpsessionEvent расширяет java.util.eventobject {public httpsessionEvent (httpsession source) {super (source);} public httpsession getsession () {return (httpsession) super.getSource ();}}Связанное с сеансом HTTP событие, которое будет вызвано при изменении сеанса. Источник события является экземпляром HTTPSession и предоставляет дополнительные методы сбора HTTPSession.
2.2 httpsessionListener
Публичный интерфейс httpsessionlistener extends eventlistener {public void sessionCreated (httpsessionEvent se); public void sessionDestroyed (httpsessionEvent se);}Когда сеанс создан и уничтожен, контейнер сервлета строит объект события httpsessionEvent и вызывает методы сеанса и сеанса.
2.3 httpsessionActivationlistener
Публичный интерфейс httpsessionActivationlistener extends eventlistener {public void sessionwillpassivate (httpsessionEvent se); public void sessionDidactivate (httpsessionEvent se);}Когда сеанс собирается пассивировать или активирован, контейнер сервлетов конструирует объект события httpsessionEvent, методы Callback SessionWillSivate и SessionDiDAtivate.
Пассивация и активация объясняются здесь: пассивация относится к памяти сервера недостаточна, или время ожидания активности сеанса появилась, а недавно неактивный сеанс сериализован на диск. Активация означает, что пассивный сеанс снова доступен, опустошенный, десериализуя сеанс от диска в память.
Здесь можно увидеть, что для того, чтобы пассивировать и активировать, сеанс должен быть сериализован и опустошен сначала. В то же время, во время процесса программирования, мы стараемся использовать такие простые объекты, как строка и целое число, и стараемся не использовать такие коллекции, как список и карта.
2.4 httpsessionbindingevent
открытый класс httpsessionBindingEvent extends httpsessionEvent {private String name; значение частного объекта; public httpsessionBindingevent (сеанс httpsession, string name) {super (session); this.name = name;} public httpsessionBindingEvent (httpsessionSession Session, String название, объектное значение) {super (Super (Session); value;} public httpsession getSession () {return super.getSession ();} public String getName () {return name;} public объект getValue () {return this.value; }}Событие, связанное с атрибутом сеанса HTTP, запускается при изменении атрибута сеанса. Источник события является экземпляром HTTPSession и предоставляет дополнительные методы для получения HTTPSession, имени атрибута и значения атрибута.
2.5 httpsessionattributeListener
Общедоступный интерфейс httpsessionattribitelistener extends eventlistener {public void attributeadded (httpsessionbindingevent se); public void attributeremoved (httpsessionbindingevent se); public void attributeredpled (httpsessionbindingevent se);};Когда атрибут сеанса добавляется, удаляется или модифицирован, контейнер сервлетов конструирует объект события httpsessionBindingEvent и вызывает обратно методы атрибута, атрибута и атрибута соответственно.
Здесь нужно отметить метод AttributeReeRepered, который вызывает обратно, когда значение атрибута заменяется. В настоящее время, если вы называете метод ServletContextAttribitevent.getValue (), возврат должен заменить предыдущее значение атрибута.
Когда метод недействительной сеанса вызван или снят сеанс, метод атрибута также будет вызван обратно.
2.6 httpsessionbindinglistener
Публичный интерфейс httpsessionbindinglistener extends eventlistener {public void valuebound (httpsessionbindingevent событие); public void valueUnbound (httpsessionBindingEvent событие);}Этот слушатель также слушает изменения в атрибуте сеанса. Когда атрибут сеанса добавляется и удаляется, то есть, когда значение атрибута связано, а значение атрибута является неосведомленным, контейнер сервлета конструирует объект события httpsessionBindingEvent и вызывает методы, основанные на значении и соответственно.
Это выглядит ничем не отличается от httpsessionattributeListener, но это не так. Одним из важнейших различий между ними является условие запуска событий.
При каком -либо изменении в свойстве сеанса контейнер сервлета уведомит httpsessionAttributeListener. Но для httpsessionBindingListener контейнер сервлета будет уведомлять только в том случае, если связанное или необоснованное значение свойства является экземпляром слушателя. Например:
Общественный класс TestListener реализует httpsessionBindinglistener {@OverridePublic void valuebound (httpsessionBindingevent event) {System.out.println ("httpsessionBindingListener.valueBound");}@overpublic valueUnbound (httpsessionBindingEvent ");}@voipublic valueUnbound (httpsessionBindingEvent"); {System.out.println ("httpsessionbindinglistener.valueunbound");}}Мы настраиваем Testlistener прослушивателя для реализации httpsessionBindingListener. Давайте установим атрибут следующего сеанса в коде:
Httpsession session = request.getsession (); testlistener testlistener = new TestListener (); Session.SetAttribute («Слушатель», TestListener); Session.RemoVeatTribute («Прослушитель»);
Здесь значением атрибута сеанса является наш экземпляр Testlister прослушивателя. Таким образом, когда этот код будет выполнен, контейнер сервлета уведомит лист тестирования и вызовет методы, основанные на значении и значения.
Здесь следует отметить, что, когда метод недействительной сеанса вызван или снят сеанс, метод значения также будет вызван обратно.
3 Интерфейс прослушивания, связанный с запросом сервлета
3.1 ServletRequestevent
public class ServletRequestEvent extends java.util.EventObject { private ServletRequest request;public ServletRequestEvent(ServletContext sc, ServletRequest request) {super(sc);this.request = request;}public ServletRequest getServletRequest () { return this.request;}public ServletContext getServletContext () { return (ServletContext) super.getSource ();}}Событие, связанное с запросом Сервлета, будет вызвано при изменении запроса. Источник событий является экземпляром ServletContext и обеспечивает дополнительное получение методов ServletContext и ServletRequest.
3.2 ServletRequestListener
Общедоступный интерфейс ServletRequestListener EventLestslistener {public void requestDestroyed (ServletRequestevent SRE); public void requestInitialialialize (ServletRequestevent SRE);}Когда запрос инициализируется или уничтожен, клиент просит ввести веб -приложение (введите сервлет или первый фильтр), или веб -приложение возвращает ответ клиенту (выйти из сервлета или первого фильтра). Контейнер сервлетов конструирует экземпляр ServletRequestevent и вызывает обратно инициализированные и запросовые методы.
3.3 ServletRequestattributeVent
Общедоступный класс ServletRequestatttribitevent Extends ServletRequestevent {private String name; значение частного объекта; public servletRequestattributevent (servletContext sc, revletRequest, имя строки, значение объекта) {super (sc, request); this.name = name; это. это. }}Событие, связанное с сервлетом, запрашивает атрибут, который будет инициирован при изменении атрибута запроса. Источник события является экземпляром ServletContext и предоставляет дополнительные методы для получения имен атрибутов и значений атрибутов.
3.4 ServletRequestattributeListener
Общедоступный интерфейс ServletRequestattribiteListener EventLester {public void attributeAdded (servletRequestattributevent srae); public void attributeremoved (ServletRequestattributevent srae); public void attributeRepreced (ServletRequestTtribetevent vrae);};};};};};};};Когда запрашиваемые атрибуты добавляются, удаляются или изменяются, контейнер сервлетов конструирует объект события сервлета и вызывает атрибут, атрибут -атрибут и атрибут, соответственно.
Здесь нужно отметить метод AttributeReeRepered, который вызывает обратно, когда значение атрибута заменяется. В настоящее время, если вы называете метод ServletRequestattribitevent.getValue (), возврат должен заменить предыдущее значение атрибута.
4. Резюме
На данный момент слушатель закончил говорить. Мы можем обнаружить, что у слушателя, сервлета и фильтра есть одна общая черта, оба запланированы контейнерами. Нам просто нужно написать нашего собственного слушателя, чтобы реализовать интерфейс слушателя, который мы заботимся, и зарегистрироваться. Остальная часть работы - написать бизнес -логику в нашем собственном слушателе.
Слушатель, представленный в этом сообщении в блоге, сформулирован спецификацией Сервлета 3.0. 3.1 добавил некоторые интерфейсы слушателя событий, и принципы схожи, читатели могут самостоятельно понимать их.