哪些病毒感染可引起急性过敏性间质性肾炎肾间质肾炎

Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别
我的图书馆
Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁,以下通过过滤编码的代码示例来了解它的使用:
1: MyCharsetFilter.java 编码过滤器
2: package ...;
3: import ...;
5: // 主要目的:过滤字符编码;其次,做一些应用逻辑判断等.
6: // Filter跟web应用一起启动
7: // 当web应用重新启动或销毁时,Filter也被销毁
8: public class MyCharsetFilter implements Filter {
private FilterConfig config = null;
public void destroy() {
System.out.println("MyCharsetFilter准备销毁...");
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
// 强制类型转换
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
// 获取web.xm设置的编码集,设置到Request、Response中
request.setCharacterEncoding(config.getInitParameter("charset"));
response.setContentType(config.getInitParameter("contentType"));
response.setCharacterEncoding(config.getInitParameter("charset"));
// 将请求转发到目的地
chain.doFilter(request, response);
public void init(FilterConfig arg0) throws ServletException {
this.config = arg0;
System.out.println("MyCharsetFilter初始化...");
以下是 MyCharsetFilter.java 在web.xml 中配置:
1: &filter&
&filter-name&filter&/filter-name&
&filter-class&dc.gz.filters.MyCharsetFilter&/filter-class&
&init-param&
&param-name&charset&/param-name&
&param-value&UTF-8&/param-value&
&/init-param&
&init-param&
&param-name&contentType&/param-name&
&param-value&text/charset=UTF-8&/param-value&
&/init-param&
&filter-mapping&
&filter-name&filter&/filter-name&
&!-- * 代表截获所有的请求
或指定请求/test.do
/xxx.do --&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&&&& 以上的例子简单的说明了Filter的使用,具体其他的应用可以看具体的场景。
&&&&&&&& 现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。下面利用监听器对数据库连接池DataSource的初始化演示它的使用:
1: MyServletContextListener.java
2: package dc.gz.
3: import javax.servlet.ServletC
4: import javax.servlet.ServletContextE
5: import javax.servlet.ServletContextL
6: import mons.dbcp.BasicDataS
* Web应用监听器
11: public class MyServletContextListener implements ServletContextListener {
// 应用监听器的销毁方法
public void contextDestroyed(ServletContextEvent event) {
ServletContext sc = event.getServletContext();
// 在整个web应用销毁之前调用,将所有应用空间所设置的内容清空
sc.removeAttribute("dataSource");
System.out.println("销毁工作完成...");
// 应用监听器的初始化方法
public void contextInitialized(ServletContextEvent event) {
// 通过这个事件可以获取整个应用的空间
// 在整个web应用下面启动的时候做一些初始化的内容添加工作
ServletContext sc = event.getServletContext();
// 设置一些基本的内容;比如一些参数或者是一些固定的对象
// 创建DataSource对象,连接池技术 dbcp
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/hibernate");
bds.setUsername("root");
bds.setPassword("root");
bds.setMaxActive(10);//最大连接数
bds.setMaxIdle(5);//最大管理数
//bds.setMaxWait(maxWait); 最大等待时间
// 把 DataSource 放入ServletContext空间中,
// 供整个web应用的使用(获取数据库连接)
sc.setAttribute("dataSource", bds);
System.out.println("应用监听器初始化工作完成...");
System.out.println("已经创建DataSource...");
web.xml中配置如下,很简单:
1: &!-- 配置应用监听器
&listener&
&listener-class&dc.gz.listeners.MyServletContextListener&/listener-class&
&/listener&
这样配置好了之后,以后在web应用中就可以通过ServletContext取得BasicDataSource对象,从而获取与数据库的连接,提高性能,方便使用。
&&&&&&&&& 上面通过两个示例演示了Filter和Listener的基本使用,对于其它的应用则需要我们在项目开发中根据具体的场景选择。多多去挖掘。
TA的最新馆藏[转]&web.xml中filter,servlet和listener区别
首先感谢两位大牛,我在大牛的基础上理解加了自己的想法(括号内容),如果来客有心得体会,请留言,谢谢
& & & &filter最为过滤器继承了filter接口,在filter接口要实现三个方法:init(),destroy(),dofilter();分别是初始化,析构,和过滤,其中大部分时间花费在doFilter()方法上。
& & & &servlet继承与servlet接口,实现方法:init(),service(),destroy(),getServletConfig(),getServletInfo()方法。在调用时service方法时会根据请求方式调用doget()或者dopost()方法;
& & & & filter的初始化是在servlet容器启动时,而Servlet类被调用之后初始化、先于Filter调用。初始化可以在容器启动后被调用但需要配置。(filter的初始化根据在web.xml中filter的声明顺序,注意filtermapping必须放在filter声明之后使用。servlet被调用初始化,先于filter调用,是指chain.fiter(),service(),chainfiter()之后的代码)
& & & & &调用顺序:filter的调用顺序:
1. 按照web.xml中的映射配置顺序按照配置条件从后向前调用
2. 层次调用doFilter()方法中FilterChain.doFilter()之前的内容(filter-mapping的name先调用doFilter方法,但是每个dofilter方法的内部存在chain.dofilter会调用下一个filter-mapping,一直到不存在下一个filter后在返回,执行chain.dofilter()后面的代码)(相当于递归调用)
3. 调用Servlet中的service()方法
4. service方法执行完毕后,层次调用doFilter()中FilterChain.doFilter()之后的方法,顺序与之前的相反
& & & & servlet的调用顺序:
按照web.xml中的映射配置顺序按照配置条件从后向前调用第一个满足条件的Servlet,调用之前事先执行满足条件的Filter,不存在层次调用Servlet问题
filter晚于servlet销毁
作用:filter的作用
1. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
2. 根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
3. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
4. 根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
servlet的作用
主要是处理客户端的请求并将其结果发送到客户端.
第一位大牛的总结:
http://blog.csdn.net/zs234/article/details/8832343
看第二位大牛的实例可以更好的理解第一位大牛的总结:
/Fskjb/archive//1698448.html
Code highlighting produced by Actipro CodeHighlighter (freeware)/--&public class LogFilter implements Filter &&
//FilterConfig可用于访问Filter的配置信息 &
private FilterC &
//实现初始化方法 &
public void init(FilterConfig config) &
this.config = &&
//实现销毁方法 &
public void destroy() &
this.config = &&
//执行过滤的核心方法 &
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException,ServletException &
//---------下面代码用于对用户请求执行预处理--------- &
//获取ServletContext对象,用于记录日志 &
ServletContext context = this.config.getServletContext(); &&
long before = System.currentTimeMillis(); &
System.out.println(&开始过滤...&); &
//将请求转换成HttpServletRequest请求 &
HttpServletRequest hrequest = (HttpServletRequest) &
//记录日志 &
context.log(&Filter已经截获到用户的请求地址: & + hrequest.getServletPath()); &
//Filter只是链式处理,请求依然放行到目的地址 &
chain.doFilter(request, response); &&
//---------下面代码用于对服务器响应执行后处理--------- &
long after = System.currentTimeMillis(); &
//记录日志 &
context.log(&过滤结束&); &
//再次记录日志 &
context.log(&请求被定位到& + hrequest.getRequestURI() + &所花的时间为: & + (after - before)); &&
上面程序实现了doFilter()方法,实现该方法就可实现对用户请求进行预处理,也可实现对服务器响应进行后处理&&它们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。
在上面的请求Filter中,仅在日志中记录请求的URL,对所有的请求都执行chain.doFilter (request,reponse)方法,当Filter对请求过滤后,依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求的HttpSession,判断用户权限是否足够。如果权限不够,直接调用重定向即可,无须调用chain.doFilter(request,reponse)方法。
Code highlighting produced by Actipro CodeHighlighter (freeware)/--&================== &
FirstFilter.java & &&
================== & &&
package com.test. & &&
import java.io.IOE & &&
import javax.servlet.F & &&
import javax.servlet.FilterC & &&
import javax.servlet.FilterC & &&
import javax.servlet.ServletE & &&
import javax.servlet.ServletR & &&
import javax.servlet.ServletR & &&
public class FirstFilter implements Filter { & &&
& & @Override & &
& & public void destroy() { & &&
& & } & &&
& & @Override & &
& & public void doFilter(ServletRequest request, ServletResponse response, & &&
& & & & & & FilterChain chain) throws IOException, ServletException { & &&
& & & & System.out.println(&before invoke firstFilter's chain.doFilter() ..&); & &&
& & & & chain.doFilter(request, response); & &&
& & & & System.out.println(&after invoke firstFilter's chain.doFilter() ..&); & &&
& & } & &&
& & @Override & &
& & public void init(FilterConfig arg0) throws ServletException { & &&
& & & & System.out.println(&firstFilter init()...&); &&
============ & &&
SecondFilter.java & &&
============= & &
package com.test. & &&
import java.io.IOE & &&
import javax.servlet.F & &&
import javax.servlet.FilterC & &&
import javax.servlet.FilterC & &&
import javax.servlet.ServletE & &&
import javax.servlet.ServletR & &&
import javax.servlet.ServletR & &&
public class SecondFilter implements Filter { & &&
& & @Override & &
& & public void destroy() { & &&
& & } & &&
& & @Override & &
& & public void doFilter(ServletRequest request, ServletResponse response, & &&
& & & & & & FilterChain chain) throws IOException, ServletException { & &&
& & & & System.out.println(&before invoke secondFilter's chain.doFilter() ..&); & &&
& & & & chain.doFilter(request, response); & &&
& & & & System.out.println(&after invoke secondFilter's chain.doFilter() ..&); & &&
& & } & &&
& & @Override & &
& & public void init(FilterConfig filterConfig) throws ServletException { & &&
& & & & System.out.println(&secondFilter init()...&); & &&
========== & &
FirstServlet.java & &&
========== & &
package com.test. & &&
import java.io.IOE & &&
import javax.servlet.ServletE & &&
import javax.servlet.http.HttpS & &&
import javax.servlet.http.HttpServletR & &&
import javax.servlet.http.HttpServletR & &&
public class FirstServlet extends HttpServlet { & &&
& & @Override & &
& & protected void doGet(HttpServletRequest req, HttpServletResponse resp) & &&
& & & & & & throws ServletException, IOException { & &&
& & & & System.out.println(&servlet doGet be invoked...&); & &&
& & & & req.getRequestDispatcher(&test.&).forward(req, resp); & &&
& & } & &&
& & @Override & &
& & protected void doPost(HttpServletRequest req, HttpServletResponse resp) & &&
& & & & & & throws ServletException, IOException { & &&
& & & & // TODO Auto-generated method stub & &&
& & & & doGet(req, resp); & &&
Code highlighting produced by Actipro CodeHighlighter (freeware)/--& & &
&?xml version=&1.0& encoding=&UTF-8&?& & &&
&web-app version=&2.5& xmlns=&/xml/ns/javaee& & &
& & xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& & &
& & xsi:schemaLocation=&/xml/ns/javaee & & &
& & /xml/ns/javaee/web-app_2_5.xsd&& & &&
& & &welcome-file-list& & &&
& & & & &welcome-file&index.jsp&/welcome-file& & &&
& & &/welcome-file-list& & &&
& & &filter& & &&
& & & & &filter-name&firstFilter&/filter-name& & &&
& & & & &filter-class&com.test.filter.FirstFilter&/filter-class& & &&
& & &/filter& & &&
& & &filter& & &&
& & & & &filter-name&secondFilter&/filter-name& & &&
& & & & &filter-class&com.test.filter.SecondFilter&/filter-class& & &&
& & &/filter& & &&
& & &filter-mapping& & &&
& & & & &filter-name&secondFilter&/filter-name& & &&
& & & & &url-pattern&/*&/url-pattern& & &&
& & &/filter-mapping& & &&
& & &filter-mapping& & &&
& & & & &filter-name&firstFilter&/filter-name& & &&
& & & & &url-pattern&/*&/url-pattern& & &&
& & &/filter-mapping& & &&
& & &servlet& & &&
& & & & &servlet-name&firstServlet&/servlet-name& & &&
& & & & &servlet-class&com.alimama.servlet.FirstServlet&/servlet-class& & &&
& & &/servlet& & &&
& & &servlet-mapping& & &&
& & & & &servlet-name&firstServlet&/servlet-name& & &&
& & & & &url-pattern&/firstServlet&/url-pattern& & &&
& & &/servlet-mapping& & &&
&/web-app& &
然后发布,发现打印的日志如下:
firstFilter init()...
secondFilter init()...
信息: Server startup in 3665 ms
这里过滤器初始化好了。
当我们访问我们的 应用
发现打印日记如下:
before invoke secondFilter's chain.doFilter() ..
before invoke firstFilter's chain.doFilter() ..
after invoke firstFilter's chain.doFilter() ..
after invoke secondFilter's chain.doFilter() ..
当我们将web.xml中filter的位置进行调整后(注意filter-mapping的顺序):
Code highlighting produced by Actipro CodeHighlighter (freeware)/--&&?xml version=&1.0& encoding=&UTF-8&?& & &
&web-app version=&2.5& xmlns=&/xml/ns/javaee& & &
& & xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& & &
& & xsi:schemaLocation=&/xml/ns/javaee & & &
& & /xml/ns/javaee/web-app_2_5.xsd&& & &
& & &welcome-file-list& & &
& & & & &welcome-file&index.jsp&/welcome-file& & &
& & &/welcome-file-list& & &
& & &filter& & &
& & & & &filter-name&firstFilter&/filter-name& & &
& & & & &filter-class&com.test.filter.FirstFilter&/filter-class& & &
& & &/filter& & &
& & &filter& & &
& & & & &filter-name&secondFilter&/filter-name& & &
& & & & &filter-class&com.test.filter.SecondFilter&/filter-class& & &
& & &/filter& & &
& & & & & & &SPAN style=&COLOR: #ff0000&& &filter-mapping& & &
& & & & &filter-name&firstFilter&/filter-name& & &
& & & & &url-pattern&/*&/url-pattern& & &
& & &/filter-mapping& & &
& & &filter-mapping& & &
& & & & &filter-name&secondFilter&/filter-name& & &
& & & & &url-pattern&/*&/url-pattern& & &
& & &/filter-mapping&&/SPAN& & &
& & &servlet& & &
& & & & &servlet-name&firstServlet&/servlet-name& & &
& & & & &servlet-class&com.alimama.servlet.FirstServlet&/servlet-class& & &
& & &/servlet& & &
& & &servlet-mapping& & &
& & & & &servlet-name&firstServlet&/servlet-name& & &
& & & & &url-pattern&/firstServlet&/url-pattern& & &
& & &/servlet-mapping& & &
&/web-app& &
然后在启动应用,会看到打印:
before invoke firstFilter's chain.doFilter() ..
before invoke secondFilter's chain.doFilter() ..
after invoke secondFilter's chain.doFilter() ..
after invoke firstFilter's chain.doFilter() ..
实现javax.servlet.Filter接口,在web.xml中配置与标签指定使用哪个Filter实现类过滤哪些URL链接。只在web启动时进行初始化操作。filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。
特点:可以在响应之前修改Request和Response的头部,只能转发请求,不能直接发出响应。filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等
2. Servlet
servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在业务处理之前进行控制。
3. Listener
servlet,filter都是针对url之类的,而listener是针对对象的操作的,如session的创建,session.setAttribute的发生,在这样的事件发生时做一些事情。您所在的位置: &
Servlet中的Listener
Servlet中的Listener
电子工业出版社
《深入分析Java Web技术内幕(修订版)》第9章Servlet工作原理解析,本章从Servlet容器的启动、Servlet的初始化及Servlet的体系结构等内容中选出一些重点来讲述,目的是让读者有一个总体的完整结构图,同时本章也详细分析了其中的一些难点问题,希望对大家有所帮助。本节为大家介绍Servlet中的Listener。
9.5& Servlet中的Listener
在整个Tomcat服务器中,Listener使用得非常广泛,它是基于观察者模式设计的,Listener的设计为开发Servlet应用程序提供了一种快捷的手段,能够方便地从另一个纵向维度控制程序和数据。目前在Servlet中提供了6种两类事件的观察者接口,它们分别是:EventListeners类型的ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionAttributeListener和LifecycleListeners类型的ServletContextListener、HttpSessionListener,如图9-11所示。
实际上,这6个Listener都继承了EventListener接口,每个Listener各自定义了需要实现的接口,这些接口如表9-1所示。
表9-1& Listener需要实现的接口及说明
Listener类
含有的接口
接&口&说&明
当调用servletContex.方法时触发这个接口
当调用servletContex.方法时触发这个接口
如果在调用servletContex.之前该a已经存在,则替换这个a时,这个接口被触发
当调用request.方法时触发这个接口
当调用request.方法时触发这个接口
如果在调用request.之前该a已经存在,则替换这个a时这个接口被触发
当HttpServletRequest对象被传递到用户的Servlet的service方法之前该方法被触发
当HttpServletRequest对象在调用完用户的Servlet的service方法之后该方法被触发
session.方法被调用时该接口被触发
session.方法被调用时该接口被触发
如果在调用session.之前该a已经存在,则替换这个a时这个接口被触发
ontext容器初始化时触发,在所有的Filter和Servlet的init方法调用之前接口先被调用
Listener类
含有的接口
接&口&说&明
ontext容器销毁,在所有的Filter和Servlet的方法调用之后接口被调用
当一个session对象被创建时触发
当一个session对象被失效时触发
它们基本上涵盖了整个Servlet生命周期中你感兴趣的每种事件。这些Listener的实现类可以配置在wen.xml&listener&标签中。当然也可以在应用程序中动态添加Listener,需要注意的是ServletContextListener在容器启动之后就不能再添加新的,因为它所监听的事件已经不会再出现了。掌握这些Listener的使用方法,能够让我们的程序设计得更加灵活。
如Spring的org.springframework.web.context.ContextLoaderListener就实现了一个ServletContextListener,当容器加载时启动Spring容器。ContextLoaderListener在contextInitialized方法中初始化Spring容器,有几种办法可以加载Spring容器,通过在web.xml的?&context-param&?标签中配置Spring的applicationContext.xml路径,文件名可以任意取,如果没有配置,将在/WEB-INF/路径下查找默认的applicationContext.xml文件。ContextLoaderListener的contextInitialized方法代码如下:
public&void&contextInitialized(ServletContextEvent&event)&{ &&&&&&&&&this.contextLoader&=&createContextLoader(); &&&&&&&&&if&(this.contextLoader&==&null)&{ &&&&&&&&&&&&&thisthis.contextLoader&=& &&&&&&&&&} &&&&&&&&&this.contextLoader.initWebApplicationContext(event.getServlet-&Context()); &}&
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码
51CTO读书频道活动讨论群:
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
深入分析Java Web技术内幕(修订版)》新增了淘宝在无线端的应用
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 11人学习过讲师: 0人学习过讲师: 326人学习过
《电话销售中的成交技巧》紧紧围绕成交,从需求挖掘、
本书是经典的单元测试学习指南,分四部分全面介绍了单
这是一个成功学泛滥的年代。成功人士往往只谈成功之道
本书主要介绍了SQL的数据库应用和开发技术,内容涉及关系数据库和SQL概述,SQL环境,SQL对于数据表的操作,数据库查询知识,SQL
51CTO旗下网站小木虫 --- 600万学术达人喜爱的学术科研平台
Servlet中的Listener的应用作者: 收集于网络
由于工作需要,最近在找一些解决方案,发现Listener是一个很好的东西,
能够监听到session,application的create,destroy,可以监听到session,application
&属性绑定的变化,考虑了一下,可以应用在"在线人数统计","数据缓存"等各个方面,
下面是整理的一些资料.
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 se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。
下面我们开发一个具体的例子,这个监听器能够统计在线的人数。在ServletContext初始化和销毁时,在服务器控制台打印对应的信息。当ServletContext里的属性增加、改变、删除时,在服务器控制台打印对应的信息。
要获得以上的功能,监听器必须实现以下3个接口:
HttpSessionListener
ServletContextListener
ServletContextAttributeListener
我们看具体的代码,见示例14-9。
【程序源代码】
1&// ==================== Program Discription =====================2&// 程序名称:示例14-9 : EncodingFilter .java3&// 程序目的:学习使用监听器4&// ==============================================================5&import javax.servlet.http.*;6&import javax.servlet.*;78&public class OnLineCountListener implements HttpSessionListener,ServletContextListener,ServletContextAttributeListener9&{10&&11&&private ServletContext context =12&&13&&public OnLineCountListener()14&&{15&&&count=0;16&&&//setContext();17&&}18&&//创建一个session时激发19&&public void sessionCreated(HttpSessionEvent se) 20&&{21&&&count++;22&&&setContext(se);23&&&24&&}25&&//当一个session失效时激发26&&public void sessionDestroyed(HttpSessionEvent se) 27&&{28&&&count--;29&&&setContext(se);30&&}31&&//设置context的属性,它将激发attributeReplaced或attributeAdded方法32&&public void setContext(HttpSessionEvent se)33&&{34&&&se.getSession().getServletContext().setAttribute("onLine",new Integer(count));35&&}36&& //增加一个新的属性时激发37&&public void attributeAdded(ServletContextAttributeEvent event) {38&39&&log("attributeAdded( + event.getName() + ,
+40&&&&& event.getValue() + )");41&42&&&& }43&&&& 44&&& //删除一个新的属性时激发45&&&& public void attributeRemoved(ServletContextAttributeEvent event) {4647&&log("attributeRemoved( + event.getName() + ,
+48&&&&& event.getValue() + )");49&50&&&& }5152&&//属性被替代时激发53&&&& public void attributeReplaced(ServletContextAttributeEvent event) {54&55&&&log("attributeReplaced( + event.getName() + ,
+56&&&&&& event.getValue() + )");57&&&& }58&&&& //context删除时激发59&&&&& public void contextDestroyed(ServletContextEvent event) {60&61&&&log("contextDestroyed()");62&&&this.context =63&64&&&& }65&66&&&& //context初始化时激发67&&&& public void contextInitialized(ServletContextEvent event) {68&69&&&this.context = event.getServletContext();70&&&log("contextInitialized()");71&72&&&& }73&&&& private void log(String message) {74&75&&&&& System.out.println("ContextListener: " + message);76&&&& }&& 77&}&
【程序注解】 在OnLineCountListener里,用count代表当前在线的人数,OnLineCountListener将在Web服务器启动时自动执行。当OnLineCountListener构造好后,把count设置为0。每增加一个Session,OnLineCountListener会自动调用sessionCreated(HttpSessionEvent&se)方法;每销毁一个Session,OnLineCountListener会自动调用sessionDestroyed(HttpSessionEvent&se)方法。当调用sessionCreated(HttpSessionEvent&se)方法时,说明又有一个客户在请求,此时使在线的人数(count)加1,并且把count写到ServletContext中。ServletContext的信息是所有客户端共享的,这样,每个客户端都可以读取到当前在线的人数。&&&&从作用域范围来说,Servlet的作用域有ServletContext,HttpSession,ServletRequest. Context范围: ServletContextListener: 对一个应用进行全局监听.随应用启动而启动,随应用消失而消失主要有两个方法: contextDestroyed(ServletContextEvent&event)& 在应用关闭的时候调用 contextInitialized(ServletContextEvent&event)& 在应用启动的时候调用 这个监听器主要用于一些随着应用启动而要完成的工作,也就是很多人说的我想在容器 启动的时候干.......... 一般来说对"全局变量"初始化,如 public&void&contextInitialized(ServletContextEvent&event){ ServletContex&sc&=&event.getServletContext(); sc.setAttribute(name,value); }& 以后你就可以在任何servlet中getServletContext().getAttribute(name); 我最喜欢用它来做守护性工作,就是在contextInitialized(ServletContextEvent&event)& 方法中实现一个Timer,然后就让应用在每次启动的时候让这个Timer工作: 程序代码:& public&void&contextInitialized(ServletContextEvent&event){ timer&=&new&Timer(); timer.schedule(new&TimerTask(){ public&void&run(){ //do&any&things } },0,时间间隔); }& 有人说Timer只能规定从现在开始的多长时间后,每隔多久做一次事或在什么时间做 一次事,那我想在每月1号或每天12点做一项工作如何做呢? 你只要设一个间隔,然后每次判断一下当时是不是那个时间段就行了啊,比如每月一号做,那你 时间间隔设为天,即24小时一个循环,然后在run方法中判断当时日期new&Date().getDate()==1 就行了啊.如果是每天的12点,那你时间间隔设为小时,然后在run中判断new&Date().getHour() ==12,再做某事就行了. ServletContextAttributeListener: 这个监听器主要监听ServletContex对象在setAttribute()和removeAttribute()的事件,注意 也就是一个"全局变量"在被Add(第一次set),replace(对已有的变量重新赋值)和remove的时候. 分别调用下面三个方法: public&void&attributeAdded(ServletContextAttributeEvent&scab)这个方法不仅可以知道 哪些全局变量被加进来,而且可获取容器在启动时自动设置了哪些context变量: 程序代码:& public&void&attributeAdded(ServletContextAttributeEvent&scab){ System.out.println(scab.getName()); } public&void&attributeRemoved(ServletContextAttributeEvent&scab)& public&void&attributeReplaced(ServletContextAttributeEvent&scab)&
Session范围: HttpSessionListener: 这个监听器主要监听一个Session对象被生成和销毁时发生的事件.对应有两个方法: 程序代码:& public&void&sessionCreated(HttpSessionEvent&se)& public&void&sessionDestroyed(HttpSessionEvent&se)& 一般来说,一个session对象被create时,可以说明有一个新客端进入.可以用来粗略统计在线人 数,注意这不是精确的,因为这个客户端可能立即就关闭了,但sessionDestroyed方法却会按一定 的策略很久以后才会发生. HttpSessionAttributeListener: 和ServletContextAttributeListener一样,它监听一个session对象的Attribut被Add(一个特定 名称的Attribute每一次被设置),replace(已有名称的Attribute的值被重设)和remove时的事件. 对就的有三个方法. 程序代码:& public&void&attributeAdded(HttpSessionBindingEvent&se)& public&void&attributeRemoved(HttpSessionBindingEvent&se)& public&void&attributeReplaced(HttpSessionBindingEvent&se)& 上面的几个监听器的方法,都是在监听应用逻辑中servlet逻辑中发生了什么事,一般的来说. 我们只要完成逻辑功能,比如session.setAttribute("aaa","111");我只要把一个名为aaa的变量 放在session中以便以后我能获取它,我并不关心当session.setAttribute("aaa","111");发生时 我还要干什么.(当然有些时候要利用的),但对于下面这个监听器,你应该好好发解一下: HttpSessionBindingListener: 上面的监听器都是作为一个独立的Listener在容器中控制事件的.而HttpSessionBindingListener 对在一对象中监听该对象的状态,实现了该接口的对象如果被作为value被add到一个session中或从 session中remove,它就会知道自己已经作为一个session对象或已经从session删除,这对于一些非 纯JAVA对象,生命周期长于session的对象,以及其它需要释放资源或改变状态的对象非常重要. 比如: session.setAttribute("abcd","1111"); 以后session.removeAttribute("abcd");因为abcd是一个字符中,你从session中remove后,它就会 自动被垃圾回收器回收,而如果是一个connection:(只是举例,你千万不要加connection往session 中加入) 程序代码:& session.setAttribute("abcd",conn);& 以后session.removeAttribute("abcd");这时这个conn被从session中remove了,你已经无法获取它 的句柄,所以你根本没法关闭它.而在没有remove之前你根本不知道什么时候要被remove,你又无法 close(),那么这个connection对象就死了.另外还有一些对象可以在被加入一个session时要锁定 还要被remove时要解锁,应因你在程序中无法判断什么时候被remove(),add还好操作,我可以先加锁 再add,但remove就后你就找不到它的句柄了,根本没法解锁,所以这些操作只能在对象自身中实现. 也就是在对象被add时或remove时通知对象自己回调相应的方法: 程序代码:& MyConn&extends&Connection&implements&HttpSessionBindingListener{ public&void&valueBound(HttpSessionBindingEvent&se){ this.initXXX(); } public&void&valueUnbound(HttpSessionBindingEvent&se){ this.close(); } }& session.setAttribute("aaa",new&MyConn()); 这时如果调用session.removeAttribute("aaa"),则触发valueUnbound方法,就会自动关闭自己. 而其它的需要改变状态的对象了是一样.
本栏目更多导读:
北京学而思教育科技有限公司 地址:北京市海淀区北三环甲18号中鼎大厦A座1层102室 电话:010-

我要回帖

更多关于 慢性间质性肾炎 的文章

 

随机推荐