JavaWeb之监听器
1. 介绍
监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
2. 监听器分类
(1)ServletContextListener监听器,监听ServletContext的初始化和销毁。
- contextInitialized:初始化contextInitialized的时候出发。
- contextDestroyed:销毁ServletContextde的时候触发。
(2)ServletContextAttributeListener监听器,监听ServletContext属性的操作。
- attributeAdded:新增ServletContext属性的时候触发。
- attributeRemoved:删除ServletContext属性的时候触发。
- attributeReplaced:改写ServletContext属性的时候触发。
(3)HttpSessionListener监听器,监听HttpSession的初始化和销毁。
- sessionCreated:初始化HttpSession的时候触发。
- sessionDestroyed:销毁HttpSession的时候触发。
(4)HttpSessionAttributeListener监听器,监听HttpSession属性的操作。
- attributeAdded:新增HttpSession属性的时候触发。
- attributeRemoved:删除HttpSession属性的时候触发。
- attributeReplaced:改写HttpSession属性的时候触发。
(5)ServletRequestListener监听器,监听ServletRequest的初始化和销毁。
- requestInitialized:初始化ServletRequest的时候触发。
- requestDestroyed:销毁ServletRequest的时候触发。
(6)ServletRequestAttributeListener监听器,监听ServletRequest属性的操作。
- attributeAdded:新增ServletRequest属性的时候触发。
- attributeRemoved:删除ServletRequest属性的时候触发。
- attributeReplaced:改写ServletRequest属性的时候触发。
3. 测试监听器触发时机
首先,我们要新建一个Web Project。然后分别建立这六种监听器,并加上输出到控制台的代码:
ServletContextListener
package com.servlet.listener; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class MyContextListener implements ServletContextListener{ @Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("--------------ContextListener Destoryed");
} @Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("--------------ContextListener Initialized");
} }
ServletContextAttributeListener
package com.servlet.listener; import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener; public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("--------------ServletContextAttributeEvent Add "+arg0.getValue().toString());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("--------------ServletContextAttributeEvent Remove "+arg0.getValue().toString());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("--------------ServletContextAttributeEvent Replace "+arg0.getValue().toString());
}
}
HttpSessionListener
package com.servlet.listener; import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class MyHttpSessionListener implements HttpSessionListener{ @Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("--------------HttpSessionListener Created");
} @Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("--------------HttpSessionListener Destoryed");
} }
HttpSessionAttributeListener
package com.servlet.listener; import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent; public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener { @Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("--------------HttpSessionAttributeListener Add "+arg0.getValue().toString());
} @Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("--------------HttpSessionAttributeListener Remove "+arg0.getValue().toString());
} @Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("--------------HttpSessionAttributeListener Replace "+arg0.getValue().toString());
}
}
ServletRequestListener
package com.servlet.listener; import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; public class MyServletRequestLister implements ServletRequestListener{ @Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("--------------ServletRequestLister Destoryed"); } @Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("--------------ServletRequestLister Initialized"); }
}
ServletRequestAttributeListener
package com.servlet.listener; import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener; public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("--------------ServletRequestAttributeEvent Add "+arg0.getValue().toString());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("--------------ServletRequestAttributeEvent Remove "+arg0.getValue().toString());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("--------------ServletRequestAttributeEvent Replace "+arg0.getValue().toString());
}
}
然后我们为程序加上要访问的Servlet:
package com.servlet.action; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class HelloServlet extends HttpServlet { private static final long serialVersionUID = -5826456046908414493L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("--------------HelloServlet get param "+req.getParameter("userName")); System.out.println("--------------Before HelloServlet add session attribute ");
req.getSession().setAttribute("userName", "userName1");
System.out.println("--------------After HelloServlet add session attribute "); System.out.println("--------------Before HelloServlet replace session attribute ");
req.getSession().setAttribute("userName", "userName2");
System.out.println("--------------After HelloServlet replace session attribute "); System.out.println("--------------Before HelloServlet remove session attribute ");
req.getSession().removeAttribute("userName");
System.out.println("--------------After HelloServlet remove session attribute ");
} @Override
public void destroy() {
System.out.println("--------------HelloServlet Destory");
} @Override
public void init() throws ServletException {
System.out.println("--------------HelloServlet Init");
super.init();
}
}
然后我们在web.xml中做如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<listener>
<listener-class>com.servlet.listener.MyContextListener</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyHttpSessionListener</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyServletRequestLister</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyServletContextAttributeListener</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyHttpSessionAttributeListener</listener-class>
</listener>
<listener>
<listener-class>com.servlet.listener.MyServletRequestAttributeListener</listener-class>
</listener> <servlet>
<!-- 名称可以随意更换,但是必须和<servlet-mapping>中<servlet-name>保持一致 -->
<servlet-name>Hello</servlet-name>
<!-- 对应的实现了servlet接口的类的全名 -->
<servlet-class>com.servlet.action.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 名称可以随意更换,但是必须和<servlet>中<servlet-name>保持一致 -->
<servlet-name>Hello</servlet-name>
<!-- 要访问的URL -->
<url-pattern>/Hello</url-pattern>
</servlet-mapping> <session-config>
<session-timeout>1</session-timeout>
</session-config>
</web-app>
最后将我们的程序部署到tomcat中,启动tomcat,访问:http://127.0.0.1:8080/MyServletWeb/Hello?userName=LYC。可以看到打印结果为:
三月 17, 2016 9:03:46 下午 org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
三月 17, 2016 9:03:46 下午 org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.62
三月 17, 2016 9:03:46 下午 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory D:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\MyServletWeb
--------------ContextListener Initialized
--------------ServletContextAttributeEvent Add org.apache.jasper.compiler.TldLocationsCache@170ed6ab
三月 17, 2016 9:03:46 下午 org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory D:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\MyServletWeb has finished in 828 ms
三月 17, 2016 9:03:46 下午 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
三月 17, 2016 9:03:47 下午 org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
三月 17, 2016 9:03:47 下午 org.apache.catalina.startup.Catalina start
INFO: Server startup in 888 ms
--------------ServletRequestLister Initialized
--------------HelloServlet Init
--------------ServletRequestAttributeEvent Replace true
--------------HelloServlet get param LYC
--------------Before HelloServlet add session attribute
--------------HttpSessionAttributeListener Add userName1
--------------After HelloServlet add session attribute
--------------Before HelloServlet replace session attribute
--------------HttpSessionAttributeListener Replace userName1
--------------After HelloServlet replace session attribute
--------------Before HelloServlet remove session attribute
--------------HttpSessionAttributeListener Remove userName2
--------------After HelloServlet remove session attribute
--------------ServletRequestLister Destoryed
三月 17, 2016 9:03:59 下午 org.apache.catalina.core.StandardServer await
INFO: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
三月 17, 2016 9:03:59 下午 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-bio-8080"]
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["ajp-bio-8009"]
三月 17, 2016 9:04:00 下午 org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
--------------HelloServlet Destory
--------------ContextListener Destoryed
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["http-bio-8080"]
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol stop
INFO: Stopping ProtocolHandler ["ajp-bio-8009"]
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["http-bio-8080"]
三月 17, 2016 9:04:00 下午 org.apache.coyote.AbstractProtocol destroy
INFO: Destroying ProtocolHandler ["ajp-bio-8009"]
JavaWeb之监听器的更多相关文章
- JavaWeb中监听器+过滤器+拦截器区别、配置和实际应用
JavaWeb中监听器+过滤器+拦截器区别.配置和实际应用 1.前沿上一篇文章提到在web.xml中各个元素的执行顺序是这样的,context-param-->listener-->fil ...
- JavaWeb基础—监听器Listener
javaWeb三大组件: servlet listener(用的不多) filter 什么叫监听器: 初次相见:AWT 二次相见:SAX(XML解析时)Bundle 绑定 监听器是一个接口,内容由我们 ...
- JavaWeb中监听器
一.事件源:三大域! ServletContext 生命周期监听:ServletContextListener,它有两个方法,一个在创建时调用,一个在销毁时调用: void contextIniti ...
- JavaWeb 之监听器
1. JavaWeb 监听器概述 在 JavaWeb 被监听的事件源为: ServletContext, HttpSession, ServletRequest, 即三大域对象. 监听域对象" ...
- Javaweb基础--->监听器listener(转发)
JavaWeb中的监听器 1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 Servl ...
- IT兄弟连 JavaWeb教程 监听器1
1 基本概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序 ...
- 深入分析JavaWeb Item38 -- 监听器(Listener)高速学习
一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其它对象身上发生的事件或状态改变进行监听和对应处理的对象,当被监视的对象发生情况时,马上採取对应的行动.监听器事实上就是一个实现特定接口的普 ...
- 深入分析JavaWeb Item39 -- 监听器(Listener)学习进阶
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- javaweb之监听器详解
在servlet中定义了多种类型的监听器,他们用于监听事件源分别是servletContext,httpsession,servletrequest 这三个域对象. servlet中监听器主要有三类: ...
- JavaWeb -- sevlet 监听器
1.三个域对象的监听(创建和销毁) servletContext, session, request 监听器 ServletContext监听器: public class MyServletCon ...
随机推荐
- 解决Google浏览器不能打开kubernetes dashboard方法【转】
在这片文章中,我将展示如何在Google Chrome上打开kubernetes dashboard.本文不叙述如何安装搭建docker和kubernetes,有关详情请上网查阅! 很多小伙伴们在自己 ...
- 挖洞经验 | 绕过WAF限制利用php:方法实现OOB-XXE漏洞利用
几个星期以前,作者在某个OOB-XXE漏洞测试中遇到过这样一种场景:目标应用后端系统WAF防火墙阻挡了包含DNS解析在内的所有出站请求(Outgoing Request),但最终,通过利用php:// ...
- mysql8 my.ini
[mysqld] ; 设置3306端口 port= ; 设置mysql的安装目录 basedir=D:/wamp64/bin/mysql/mysql8.0.11 ; 设置mysql数据库的数据的存放目 ...
- 云服务器:西部数码VS阿里云
公司因为业务的需要,申请了两个云服务器.一个是西部数码的,一个是阿里云香港的.其中西部数码的配置高一些,一年4500元左右:香港的则便宜些,一年2200左右.因为备案问题,主业务放在成都的西部数码服务 ...
- Java 将数据写入磁盘并读取磁盘上的文件
package test; import java.io.BufferedReader;import java.io.FileReader;import java.io.FileWriter;impo ...
- C++ 语言程序设计(清华大学)1
1.回文数字判断方法(逆过来数值相等):y=y*10+x%10; x /= 10; return(x==y) 2.int rand(void)函数,所需头文件<cstdlib> ,功能是求 ...
- jquery实现常用UI布局
tab html <div class="tab"> <ul class="tab-title"> <li class=" ...
- JavaScript 对象所有API解析【2020版】
JavaScript 对象所有API解析[2020版] 写于 2019年08月20日,虽然是2019年写的文章,但现在2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromE ...
- Bulma CSS框架教程
Bulma是一个轻量级的现代CSS框架,基于flex,跟bootstrap不一样纯CSS没有JS,与vuejs.reactjs这样JavaScript框架可以很好地集成. 为降低学习难度,让初学者可以 ...
- hdu 1277 全文检索 (字典树应用)
全文检索 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...