servlet技术中的servlet listener详解有什么具体作用

Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别 -
- ITeye博客
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 =10:11:
public void destroy() {12:
System.out.println("MyCharsetFilter准备销毁...");13:
public void doFilter(ServletRequest arg0, ServletResponse arg1,16:
FilterChain chain) throws IOException, ServletException {17:
// 强制类型转换18:
HttpServletRequest request = (HttpServletRequest)arg0;19:
HttpServletResponse response = (HttpServletResponse)arg1;20:
// 获取web.xm设置的编码集,设置到Request、Response中21:
request.setCharacterEncoding(config.getInitParameter("charset"));22:
response.setContentType(config.getInitParameter("contentType"));23:
response.setCharacterEncoding(config.getInitParameter("charset"));24:25:
// 将请求转发到目的地26:
chain.doFilter(request, response);27:
public void init(FilterConfig arg0) throws ServletException {30:
this.config = arg0;31:
System.out.println("MyCharsetFilter初始化...");32:
以下是 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&10:
&param-value&text/charset=UTF-8&/param-value&11:
&/init-param&12:
&/filter&13:
&filter-mapping&14:
&filter-name&filter&/filter-name&15:
&!-- * 代表截获所有的请求 或指定请求/test.do /xxx.do --&16:
&url-pattern&/*&/url-pattern&17:
&/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
9: * Web应用监听器10: */11: public class MyServletContextListener implements ServletContextListener {12: 13:
// 应用监听器的销毁方法14:
public void contextDestroyed(ServletContextEvent event) {15:
ServletContext sc = event.getServletContext();16:
// 在整个web应用销毁之前调用,将所有应用空间所设置的内容清空17:
sc.removeAttribute("dataSource");18:
System.out.println("销毁工作完成...");19:
// 应用监听器的初始化方法22:
public void contextInitialized(ServletContextEvent event) {23:
// 通过这个事件可以获取整个应用的空间24:
// 在整个web应用下面启动的时候做一些初始化的内容添加工作25:
ServletContext sc = event.getServletContext();26:
// 设置一些基本的内容;比如一些参数或者是一些固定的对象27:
// 创建DataSource对象,连接池技术 dbcp28:
BasicDataSource bds = new BasicDataSource();29:
bds.setDriverClassName("com.mysql.jdbc.Driver");30:
bds.setUrl("jdbc:mysql://localhost:3306/hibernate");31:
bds.setUsername("root");32:
bds.setPassword("root");33:
bds.setMaxActive(10);//最大连接数34:
bds.setMaxIdle(5);//最大管理数35:
//bds.setMaxWait(maxWait); 最大等待时间36:
// 把 DataSource 放入ServletContext空间中,37:
// 供整个web应用的使用(获取数据库连接)38:
sc.setAttribute("dataSource", bds);39:
System.out.println("应用监听器初始化工作完成...");40:
System.out.println("已经创建DataSource...");41:
web.xml中配置如下,很简单:
1: &!-- 配置应用监听器 --&
&listener&
&listener-class&dc.gz.listeners.MyServletContextListener&/listener-class&
&/listener&
这样配置好了之后,以后在web应用中就可以通过ServletContext取得BasicDataSource对象,从而获取与数据库的连接,提高性能,方便使
上面通过两个示例演示了Filter和Listener的基本使用,对于其它的应用则需要我们在项目开发中根据具体的场景选择。
浏览: 9627 次
来自: 陕西一.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&
ArrayList showList=(ArrayList)(getServletContext().getAttribute(&list&));
out.print(&在线人数 &+showList.size()+&&br&&);
for(int i=0;i&showList.size();i++){
out.print(showList.get(i)+&在线&+&&br&&);
&a href=&Login.jsp&&退出&/a&
4、配置页面&web.xml
&?xml&version=&1.0& encoding=&gb2312&?&
&!DOCTYPE&web-app
&&&&PUBLIC &-//Sun Microsystems, Inc.//DTD&Web&Application 2.3//EN&
&&&&&/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&, 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&&&se)&&&方法;当在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 = 9905170L;
public CountStartListener()
&&&// TODO Auto-generated constructor stub
public void contextDestroyed(ServletContextEvent arg0)
&&&// TODO Auto-generated method stub
&&&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接口的方法:
void contextInitialized(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被加载及初始化。
void contextDestroyed(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被载出。
ServletContextEvent中的方法:
ServletContext getServletContext()
取得ServletContext对象
2.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。
ServletContextAttributeListener接口方法:
void attributeAdded(ServletContextAttributeEvent scab)
若有对象加入Application的范围,通知正在收听的对象
void attributeRemoved(ServletContextAttributeEvent scab)
若有对象从Application的范围移除,通知正在收听的对象
void 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 event)
void 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方法),更新数据库
本文已收录于以下专栏:
相关文章推荐
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要...
一.WebContextLoaderListener 监听类
它能捕捉到服务器的启动和停止,在启动和停止触发里面的方法做相应的操作!
它必须在web.xml 中配置才能使用,是配置监听类的
转载于 /hellojava/archive//2833840.html
Listener 监听器
  前言:...
ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在...
之前陆续用过MyEclipse8.5、MyEclipse9.1、MyEclipse10.5开发WEB项目,最近听说出了最新版叫MyEclipse2014,于是决定尝尝鲜,运行一个以前在MyEclips...
web.xml中listener作用及使用
分类: servlet
14:21 18613人阅读 评论(0) 收藏 举报
sessionapplicationser...
&p style=&color: #084487; margin-bottom: 5 line-height: 21 text-indent: 2 padding
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要...
web.xml 中的过滤器(拦截器)Filter与监听器Listener的作用和区别?
10196人阅读 评论(0)
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)ServletContextListener作用 - 明志轩 - ITeye博客
博客分类:
ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享,所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。
ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。
在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
我们使用缓存的思路大概是:
服务器启动时,ServletContextListener 的 contextInitialized()方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 ervletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。
程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP,使用a pplication.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数),你可以同时更改缓存和文件/数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。
服务器将要关闭时,ServletContextListener 的 contextDestroyed()方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。
import U //my own class
import DatabaseM // my own class
import javax.servlet.ServletC
import javax.servlet.ServletContextL
public class MyContextListener
implements ServletContextListener {
private ServletContext context =
public void contextInitialized(ServletContextEvent event) {
context = event.getServletContext();
User user = DatabaseManager.getUserById(1);
context.setAttribute("user1", user);
public void contextDestroyed(ServletContextEvent event) {
User user = (User)context.getAttribute("user1");
DatabaseManager.updateUserData(user);
this.context =
布署 ServletContextListener
你实现(implements)了 ServletContextListener 编译后,把它放在正确的WEB-INF/classes目录下,更改WEB-INF目录下的 web.xml文件,在web-app节点里添加
&listener&
&listener-class&MyServletContextListener&/listener-class&
&/listener&
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
下面的例子很好!!!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
在 Servlet API 中有一个 ServletContextListener 接口,它能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用的生命周期。
当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。
lcontextInitialized(ServletContextEvent sce) :当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
lcontextDestroyed(ServletContextEvent sce) :当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
下面通过两个具体的例子来介绍 ServletContextListener 的用法。
例一:在服务启动时,将数据库中的数据加载进内存,并将其赋值给一个属性名,其它的 Servlet 就可以通过 getAttribute 进行属性值的访问。有如下两个步骤:
1 : ServletContext 对象是一个为整个 web 应用提供共享的内存,任何请求都可以访问里面的内容
2 :如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:
1 ) 实现 servletContextListerner 接口 并将要共享的通过 setAttribute ( name,data )方法提交到内存中去
2 )应用项目通过 getAttribute(name) 将数据取到 。
package ServletContextT
import java.sql.C
import java.sql.PreparedS
import java.sql.ResultS
import java.util.HashM
import java.util.M
import javax.servlet.ServletC
import javax.servlet.ServletContextE
import javax.servlet.ServletContextL
import util.ConnectT
public class ServletContextLTest implements ServletContextListener{
// 实现其中的销毁函数
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("this is last destroyeed");
// 实现其中的初始化函数,当有事件发生时即触发
public void contextInitialized(ServletContextEvent sce) {
ServletContext sct=sce.getServletContext();
Map&Integer,String& depts=new HashMap&Integer,String&();
Connection connection=
PreparedStatement pstm=
ResultSet rs=
connection=ConnectTool.getConnection();
String sql="select deptNo,dname from dept";
pstm=connection.prepareStatement(sql);
rs=pstm.executeQuery();
while(rs.next()){
depts.put(rs.getInt(1), rs.getString(2));
// 将所取到的值存放到一个属性键值对中
sct.setAttribute("dept", depts);
System.out.println("======listener test is beginning=========");
}catch(Exception e){
e.printStackTrace();
ConnectTool.releasersc(rs, pstm, connection);
在完成上述编码后,仍需在 web.xml 中进行如下配置,以使得该监听器可以起作用。
&listener&
&listener-class&ServletContextTest.ServletContextLTest&/listener-class&
&/listener&
在完成上述配置后, web 服务器在启动时,会直接加载该监听器,通过以下的应用程序就可以进行数据的访问。
package ServletContextT
import java.io.IOE
import java.io.PrintW
import java.util.*;
import javax.servlet.ServletC
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
public class CreateEmployee extends HttpServlet{
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext sct=getServletConfig().getServletContext();
// 从上下文环境中通过属性名获取属性值
Map&Integer,String& dept=(Map&Integer,String&)sct.getAttribute("dept");
Set&Integer& key=dept.keySet();
response.setContentType("text/charset=utf-8");
PrintWriter out=response.getWriter();
out.println("&html&");
out.println("&body&");
out.println("&form action='/register' action='post'&");
out.println("&table alignb='center'&");
out.println("&tr&");
out.println("&td&");
out.println("username:");
out.println("&/td&");
out.println("&td&");
out.println("&input type='text' name='username'");
out.println("&/tr&");
out.println("&tr&");
out.println("&td&");
out.println("city:");
out.println("&/td&");
out.println("&td&");
out.println("&select name='dept'");
for(Integer i:key){
out.println("&option value='"+i+"'&"+dept.get(i)+"&/option&");
out.println("&/select&");
out.println("&/td&");
out.println("&tr&");
out.println("&/table&");
out.println("&/form&");
out.println("&/body&");
out.println("&/html&");
out.flush();
例二:书写一个类用于统计当Web 应用启动后,网页被客户端访问的次数。如果重新启动Web 应用,计数器不会重新从1 开始统计访问次数,而是从上次统计的结果上进行累加。在实际应用中,往往需要统计自Web 应用被发布后网页被客户端访问的次数,这就要求当Web 应用被终止时,计数器的数值被永久存储在一个文件中或者数据库中,等到Web 应用重新启动时,先从文件或数据库中读取计数器的初始值,然后在此基础上继续计数。
向文件中写入或读取计数器的数值的功能可以由自定义的 MyServletContextListener 类来完成,它具有以下功能:
1 、在 Web 应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter 对象存放到 Web 应用范围内。存放计数器的文件的路径为helloapp/count/count.txt 。
2 、在Web 应用终止时把Web 应用范围内的计数器的数值保存到count.txt 文件中。
package ServletContextT
import javax.servlet.ServletC
import javax.servlet.ServletContextE
import javax.servlet.ServletContextL
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce){
System.out.println("helloapp application is Initialized.");
// 获取 ServletContext 对象
ServletContext context=sce.getServletContext();
// 从文件中读取计数器的数值
BufferedReader reader=new BufferedReader(
new InputStreamReader(context.
getResourceAsStream("/count/count.txt")));
int count=Integer.parseInt(reader.readLine());
reader.close();
// 创建计数器对象
Counter counter=new Counter(count);
// 把计数器对象保存到 Web 应用范围
context.setAttribute("counter",counter);
} catch(IOException e) {
e.printStackTrace();
public void contextDestroyed(ServletContextEvent sce){
System.out.println("helloapp application is Destroyed.");
// 获取 ServletContext 对象
ServletContext context=sce.getServletContext();
// 从 Web 应用范围获得计数器对象
Counter counter=(Counter)context.getAttribute("counter");
if(counter!=null){
// 把计数器的数值写到 count.txt 文件中
String filepath=context.getRealPath("/count");
filepath=filepath+"/count.txt";
PrintWriter pw=new PrintWriter(filepath);
pw.println(counter.getCount());
pw.close();
} catch(IOException e) {
e.printStackTrace();
将用户自定义的 MyServletContextListener 监听器在 Servlet 容器进行注册, Servlet 容器会在启动或终止 Web 应用时,会调用该监听器的相关方法。在 web.xml 文件中, &listener& 元素用于向容器注册监听器:
&listener&&listener-class& ServletContextTest .MyServletContextListener&listener-class /&&/listener&
注意:&listener-class&中要写出类的包名,比如下面的写法(包名标识了类的路径)
&listener&
&listener-class&com.efarm360.action.StartupAction&/listener-class&
&/listener&
通过上述两个例子,即可以非常清楚的了解到 ServletContextListener 接口的使用方法及技巧。在Container 加载Web 应用程序时(例如启动 Container 之后),会呼叫contextInitialized() ,而当容器移除Web 应用程序时,会呼叫contextDestroyed () 方法。 通过 Tomcat 控制台的打印结果的先后顺序,会发现当 Web 应用启动时,Servlet 容器先调用contextInitialized() 方法,再调用lifeInit 的init() 方法;当Web 应用终止时,Servlet 容器先调用lifeInit 的destroy() 方法,再调用contextDestroyed() 方法。由此可见,在Web 应用的生命周期中,ServletContext 对象最早被创建,最晚被销毁。
chengtong_java
浏览: 30600 次
来自: 武汉

我要回帖

更多关于 listener和servlet 的文章

 

随机推荐