initservletlistener技术中的listener有什么具体作用

JAVA Web开发之Servlet-20.Listener
#################################################
Listener 简介 –Linstener 是用来监听web工程状态改变的一种实现机制,例如:
? 用来监听整个web工程状态改变的ServletContextListener 和ServletContextAttributeListener ? 监听Session范围状态改变的HttpSessionListenter和HttpSessionAttributeListener ? 监听requst范围状态改变的ServletRequestListener和ServletRequestAttributeListenter
Listenter 分类 –和ServletContext相关的 ? ServletContextListener
当WEB工程启动时调用contextInitialed,停止WEB工程时调用contextDestroyed。
&& ? ServletContextAttributeListener
–和HttpSession相关的 ? HttpSessionListener
? HttpSessionAttributeListener
&–和ServletRequest相关的 ? ServletRequestListener
? ServletRequestAttributeListener
Listener 实例 –用户在线计数
############################################
分享到朋友圈
喜欢我的文章,请分享到朋友圈web.xml中listener的作用及使用(转)
一.WebContextLoaderListener 监听类
它能捕捉到服务器的启动和停止,在启动和停止触发里面的方法做相应的操作!
它必须在web.xml 中配置才能使用,是配置监听类的
二.下面是搜集的一些listener方面的知识
监听用户上线与退出,显示在线用户
1、登陆页面 Login.jsp
&%@page pageEncoding="gb2312"
contentType="text/ charset=gb2312" %&
session=request.getSession(false);
if(session!=null)session.invalidate();
&head&&title&&/title&&/head&
&form action="isOnline.jsp"
method="post"&
用户名:&input type="text"
name="uName"/&
&input type="submit"
value="上线"&
2、控制页面(只是为了说明监听器问题,所以简单了点...) isOnline.jsp
&%@page pageEncoding="gb2312"
contentType="text/ charset=gb2312" %&
&head&&title&&/title&&/head&
session=request.getSession();
session.setAttribute("userName",request.getParameter("uName"));
response.sendRedirect("showOnline.jsp");
3、显示页面 showOnline.jsp
&%@page pageEncoding="gb2312"
contentType="text/ charset=gb2312"
import="java.util.ArrayList" %&
&head&&title&&/title&&/head&
showList=(ArrayList)(getServletContext().getAttribute("list"));
out.print("在线人数
"+showList.size()+"&br&");
for(int i=0;i&showList.size();i++){
out.print(showList.get(i)+"在线"+"&br&");
href="Login.jsp"&退出&/a&
4、配置页面 web.xml
&?xml version="1.0"
encoding="gb2312"?&
&!DOCTYPE web-app
&&& PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application
"/dtd/web-app_2_3.dtd"&
&listener&
&listener-class&org.xiosu.listener.onlineListener&/listener-class&
&/listener&
&/web-app&
5、监听器 onlineListener.java
package org.xiosu.
import java.util.ArrayL
import javax.servlet.ServletC
import javax.servlet.http.HttpSessionAttributeList
import javax.servlet.http.HttpSessionBindingE
import javax.servlet.http.HttpSessionE
import javax.servlet.http.HttpSessionL
public class onlineListener implements HttpSessionListener,
HttpSessionAttributeListener {
ArrayList list = new ArrayList();
// 新建一个session时触发此操作
public void sessionCreated(HttpSessionEvent se) {
sc=se.getSession().getServletContext();
System.out.println("新建一个session");
// 销毁一个session时触发此操作
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁一个session");
if (!list.isEmpty()) {
&& list.remove((String)
se.getSession().getAttribute("userName"));
&& sc.setAttribute("list",
// 在session中添加对象时触发此操作,在list中添加一个对象
public void attributeAdded(HttpSessionBindingEvent sbe) {
list.add((String) sbe.getValue());
sc.setAttribute("list", list);
// 修改、删除session中添加对象时触发此操作
public void attributeRemoved(HttpSessionBindingEvent arg0) {
public void attributeReplaced(HttpSessionBindingEvent arg0) {
说明:本例只为简单介绍监听器,并未进行安全方面设置。
监听器也叫Listener,是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用
户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent&&
se)方法,这样
就可以给在线人数加1。常用的监听接口有以下几个:
ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。
ServletContextListener监听ServletContext。当创建ServletContext时,激发
contextInitialized(ServletContextEvent&&
sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent&&
sce)方法。
HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session&&
Created(HttpSessionEvent&&
se)方法;当销毁一个Session时,激发sessionDestroyed&&
(HttpSessionEvent&& se)方法。
HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发
attributeAdded(HttpSessionBindingEvent&&
方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent&&
se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent&&
se)&& 方法。
example:随服务器启动
<web-app>
com.tb.listener.CountStartListener
package com.tb.
import javax.servlet.ServletContextE
import javax.servlet.ServletContextL
import javax.servlet.http.HttpS
import com.tb.timertask.DoCountT
public class CountStartListener extends HttpServlet implements
ServletContextListener
private static final long serialVersionUID =
public CountStartListener()
&& // TODO Auto-generated
constructor stub
public void contextDestroyed(ServletContextEvent arg0)
&& // TODO Auto-generated method
&& public void
contextInitialized(ServletContextEvent arg0)
&& DoCountTask.dotask();
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中HttpSessionAttributeListener与
HttpSessionBindingListener
皆使用HttpSessionBindingEHttpSessionListener和
HttpSessionActivationListener则都使用HttpSessionE其余Listener对应的Event如下所
Listener接口
ServletContextListener
ServletContextEvent
ServletContextAttributeListener
ServletContextAttributeEvent
HttpSessionListener
HttpSessionEvent
HttpSessionActivationListener
HttpSessionAttributeListener
HttpSessionBindingEvent
HttpSessionBindingListener
ServletRequestListener
ServletRequestEvent
ServletRequestAttributeListener
ServletRequestAttributeEvent
分别介绍:
一 ServletContext相关监听接口
补充知识:
通过ServletContext
的实例可以存取应用程序的全局对象以及初始化阶段的变量。
在JSP文件中,application 是 ServletContext
的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext
全局对象即Application范围对象,初始化阶段的变量指在web.xml中,经由&context-param&元素所设定的变量,它的范围也是Application范围,例如:
&context-param&
&param-name&Name&/param-name&
&param-value&browser&/param-value&
&/context-param&
当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:
String name =
(String)application.getInitParameter("Name");
或者使用EL时:
${initPara.name}
若是在Servlet中,取得Name的值方法:
String name =
(String)ServletContext.getInitParameter("Name");
1.ServletContextListener:
用于监听WEB
应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。
ServletContextListener 是 ServletContext
的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时
ServletContext 将要被销毁。
ServletContextListener接口的方法:
contextInitialized(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被加载及初始化。
contextDestroyed(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被载出。
ServletContextEvent中的方法:
ServletContext getServletContext()
取得ServletContext对象
2.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。
ServletContextAttributeListener接口方法:
attributeAdded(ServletContextAttributeEvent scab)
若有对象加入Application的范围,通知正在收听的对象
attributeRemoved(ServletContextAttributeEvent scab)
若有对象从Application的范围移除,通知正在收听的对象
attributeReplaced(ServletContextAttributeEvent scab)
若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象
ServletContextAttributeEvent中的方法:
java.lang.String getName()
回传属性的名称
java.lang.Object getValue()
回传属性的值
二、HttpSession相关监听接口
1.HttpSessionBindingListener接口
注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener
当我们的类实现了HttpSessionBindingListener接口后,只要对象加入 Session范围
(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的
removeAttribute方法的时候或Session Time out的时候)时,容器分别会自动调用下列两个方法:
void valueBound(HttpSessionBindingEvent
valueUnbound(HttpSessionBindingEvent event)
思考:如何实现记录网站的客户登录日志, 统计在线人数?
2.HttpSessionAttributeListener接口
HttpSessionAttributeListener监听HttpSession中的属性的操作。
在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se)
方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent
se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent
se) 方法。这和ServletContextAttributeListener比较类似。
3.HttpSessionListener接口
HttpSessionListener监听
HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent
se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
4.HttpSessionActivationListener接口
主要用于同一个Session转移至不同的JVM的情形。
四、ServletRequest监听接口
1.ServletRequestListener接口
和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
2.ServletRequestAttributeListener接口
和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
有的listener可用于统计网站在线人数及访问量。 如下:
服务器启动时(实现ServletContextListener监听器contextInitialized方法),读取数据库,并将其用一个计数变量保存在application范围内
session创建时(实现HttpSessionListener监听器sessionCreated方法),读取计数变量加1并重新保存
服务器关闭时(实现ServletContextListener监听器contextDestroyed方法),更新数据库
http://www.blogjava.net/wx886104/archive//322419.html
http://hht83./blog/static//
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Java servlet、filter、listener、interceptor之间的区别和联系
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Java servlet、filter、listener、interceptor之间的区别和联系的相关资料,需要的朋友可以参考下
servlet、filter、listener、interceptor之间的区别和联系
1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。
2.filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。
3.listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。
通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。
4.interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法。
比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
5.servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。
二、加载顺序
web.xml 的加载顺序是:context- param -& listener -& filter -& servlet
1.servlet:
(1)创建并返回一个包含基于客户请求性质的动态内容的完整的html页面
(2)创建可嵌入到现有的html页面中的一部分html页面(html片段)
(3)读取客户端发来的隐藏数据
(4)读取客户端发来的显示数据
(5)与其他服务器资源(包括数据库和java的应用程序)进行通信
(6)通过状态代码和响应头向客户端发送隐藏数据。
(1)filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应
(2)在执行servlet之前,首先执行filter程序,并为之做一些预处理工作
(3)根据程序需要修改请求和响应
(4)在servlet被调用之后截获servlet的执行。
3.listener:
servlet2.4规范中提供了8个 listener 接口,可以将其分为三类,分别如下:
(1)与 servletContext 有关的 listne r接口。包括:ServletContextListener、ServletContextAttributeListener
(2)与 HttpSession 有关的 Listner 接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener
(3)与 ServletRequest 有关的 Listener 接口,包括:ServletRequestListner、ServletRequestAttributeListener
1.servlet:servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在业务处理之前进行控制。
2.filter:流程是线程性的,url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而 servlet 处理之后,不会继续向下传递。
filter 功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。可以将 Filter 看成是 servlet 的一个补充(擦屁股的)。
Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。
它与Servlet的区别在于:它不能直接向用户生成响应。
完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
3.匹配规则
当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html(我的应用上下文是test),
容器会将http://localhost/tes去掉,将剩下的/aaa.html部分拿来做servlet的映射匹配,也就是拿这剩下的部分与web.xml中配置的servlet的url-pattern进行匹配。
注意:这个映射匹配过程是有一定的规则的,而且每次匹配最终都只匹配一个 servlet。(这一点和filter不同)
servlet 匹配规则:当一個servlet匹配成功后就不会在往下去匹配了
精确路径的匹配:
例子:比如servletA 的url-pattern为 /test,servletB的url-& pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,
这个时候容器就会先 进行精确 路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。
最长路径的匹配:
例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,
容器会选择路径最长的servlet来匹配,也就是这里的servletB。
扩展匹配:如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。
例子:servletA的url-pattern:*.action
4.servlet,filter 都是针对 url 之类的,而 listener 是针对对象的操作的,如 session 的创建,session.setAttribute 的发生,在这样的事件发生时做一些事情。
可用来进行:Spring整合Struts,为Struts的action注入属性,web应用定时任务的实现,在线人数的统计等
5.interceptor 拦截器,类似于filter,不过在struts.xml中配置,不是在web.xml,并且不是针对URL的,而是针对action,当页面提交action时,
进行过滤操作,相当于struts1.x提供的plug-in机制,可以看作,前者是struts1.x自带的filter,而interceptor 是struts2 提供的filter。
与filter不同点:
(1)不在web.xml中配置,而是在struts.xml中完成配置,与action在一起
(2)可由action自己指定用哪个interceptor 来在接收之前做事
6.struts2中的过滤器和拦截器的区别与联系:
(1)拦截器是 Struts2 提供的,而过滤器是由 Servlet 标准提供的
(2)拦截器拦截目标 Action 的目标方法,而过滤器针对各种 web 资源
(3)拦截器在 struts.xml 中配置,而过滤器在 web.xml文件中配置
(4)拦截器使用拦截器栈组织在一起,而过滤器是根据被拦截的资源联系在一起,由他们在配置文件中的位置决定了先后执行顺序
(5)拦截器是基于java反射机制的,而过滤器是基于函数回调的。
(6)过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
(7)拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
(8)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
(9)在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具40被浏览4522分享邀请回答import javax.servlet.ServletC
import javax.servlet.ServletContextL
public class MyContextListener
implements ServletContextListener {
private ServletContext context =
public void contextInitialized(ServletContextEvent event) {
System.out.println("servlet context created");
public void contextDestroyed(ServletContextEvent event) {
System.out.println("servlet context destroy");
2:javax.servlet.HttpSessionL//session创建的监听器
import javax.servlet.http.HttpSessionE
import javax.servlet.http.HttpSessionL
//@WebListener()
public class MyListener implements HttpSessionListener {
private static int counter = 0;
public static int getCounter() {
public void sessionCreated(HttpSessionEvent se) {
counter++;
System.out.println(String.format("[MyListener]MyListener.sessionCreated@session create|counter=%s", counter));
public void sessionDestroyed(HttpSessionEvent se) {
counter--;
55 条评论分享收藏感谢收起1018 条评论分享收藏感谢收起随笔 - 275
评论 - 2846

我要回帖

更多关于 listener和servlet 的文章

 

随机推荐