如栗想为web应用注册一 servletcontextlistener和servlet.应该怎样做

框架技术(1)
Java WEB项目制作过程中,在web.xml中巧用Listener可以实现一些特定的需求,可以监听&Web应用事件,能最大程度地控制你的Web应用,这里介绍两个比较重要的&WEB应用事件:
应用启动事件发生在你的应用第一次被servlet容器装载和启动的时候;停止事件发生在Web应用停止的时候。&
Session创建事件发生在每次一个新的session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候。为了使用这些Web应用事件为你做些有用的事情,我们必须创建和使用一些特殊的“监听”类。监听类,它们就是实现了下边两个接口中任何一个接口的简单的java类:
javax.servlet.ServletContextListener
javax.servlet.http.HttpSessionListener &
如果你想让你的类监听应用的启动和停止事件,你就得实现ServletContextListener接口;
如果你想让你的类去监听Session的创建和失效事件,那你就得实现HttpSessionListener接口。&
让我们看看在这些接口中你必须要实现的方法。
1、监听应用的启动和停止&ServletContextListener&:
接口包括如下两个方法:
public&void&contextInitialized(ServletContextEvent&sce);&
public&void&contextDestroyed(ServletContextEvent&sce);&
如果你实现了一个接口,那你就必须实现它所有的方法。因此,如果你想利用应用的启动和停止事件,你就需要创建一个Java类并实现ServletContextListener接口。下边是这样的一个类的例子:
import&javax.servlet.ServletContextL
import&javax.servlet.ServletContextE
public&class&ApplicationWatch&implements&ServletContextListener&{
public&static&long&applicationInitialized&=&0L;
/*&应用启动事件&*/
public&void&contextInitialized(ServletContextEvent&ce)&{
applicationInitialized&=&System.currentTimeMillis();
//这里还可以添加你需要的业务处理
/*应用停止事件&*/
public&void&contextDestroyed(ServletContextEvent&ce)&{}
在上边的代码中,ApplicationWatch类实现了ServletContextListener接口。它实现了接口中的两个方法,但只用了其中的一个方法,另一个方法中没有写任何代码。这个类把应用启动的时间记录在一个可以从其它应用类中存取应用启动时间的public&static变量中,当然你也可以根据系统的需要在contextInitialized方法中添加一些自己的业务处理,以达到系统启动即加载的需求。
2、Session的创建和失效HttpSessionListener:
首先让我们看看HttpSessionListener接口有什么不同的方法,这个接口也只包含两个方法,分别对应于Session的创建和失效:
·&public&void&sessionCreated(HttpSessionEvent&se);&
·&public&void&sessionDestroyed(HttpSessionEvent&se);
&&&如上边的ApplicationWatch例子那样,我们也创建了一个实现HttpSessionListener接口的类。如下:
import&javax.servlet.http.HttpSessionL
import&javax.servlet.http.HttpSessionE
public&class&SessionCounter&implements&HttpSessionListener&{
private&static&int&activeSessions&=0;
/*&Session创建事件&*/
public&void&sessionCreated(HttpSessionEvent&se)&{
&&&&&&&activeSessions++;
/*&Session失效事件&*/
public&void&sessionDestroyed(HttpSessionEvent&se)&{
if(activeSessions&0)activeSessions--;
public&static&int&getActiveSessions()&{
return&activeS
在上边的代码中,SessionCounter类实现了HttpSessionListener接口,其目的是计算活动会话的数量。
以上两个监听类写好后,还需要告诉应用服务器有这些监听类,这就需要在web.xml文件中声明,下面我们看看web.xml的配置。
Web.xml 配置:
&&&我们通过把类路径加入/WEB-INF/web.xml文件的标签&listener&中来告诉服务器我们的监听类。下边是一个web.xml文件的例子:
&!--&Web.xml&--&
&?xml&version=&1.0&&encoding=&ISO-8859-1&?&
&!DOCTYPE&web-appPUBLIC&&-//Sun&Microsystems,&Inc.//DTD&Web&Application&2.3//EN&&/j2ee/dtds/web-app_2.3.dtd&&
&!--&Listeners&--&
&listener&
&listener-class&
com.stardeveloper.web.listener.SessionCounter
&/listener-class&
&/listener&
&listener&
&listener-class&
com.stardeveloper.web.listener.ApplicationWatch&/listener-class&
&/listener&
&/web-app&
如上所示,在web.xml文件中声明监听类是非常简单的。现在,每次的服务器的启动和停止,会话的创建和失效,配置好的监听类的相应的方法就会被调用。就这么简单!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2429次
排名:千里之外
原创:12篇
(4)(1)(1)(4)(1)(2)大家正在看...
最新热文...
相关文章...
最新热文...
大家都在看...
为您推荐...21328人阅读
java编程(28)
Servlet API
ServletContextListener
接口,它能够监听
ServletContext
对象的生命周期,实际上就是监听
应用的生命周期。
容器启动或终止Web
应用时,会触发ServletContextEvent
事件,该事件由
ServletContextListener
来处理。在 ServletContextListener
接口中定义了处理ServletContextEvent
事件的两个方法。
contextInitialized(ServletContextEvent
:当Servlet
容器启动Web
应用时调用该方法。在调用完该方法之后,容器再对Filter
初始化,并且对那些在Web
应用启动时就需要被初始化的Servlet
进行初始化。
contextDestroyed(ServletContextEvent
:当Servlet
容器终止Web
应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet
下面通过两个具体的例子来介绍
ServletContextListener
例一:在服务启动时,将数据库中的数据加载进内存,并将其赋值给一个属性名,其它的
就可以通过
getAttribute
进行属性值的访问。有如下两个步骤:
ServletContext
对象是一个为整个
应用提供共享的内存,任何请求都可以访问里面的内容
:如何实现在服务启动的时候就动态的加入到里面的内容:我们需要做的有:
servletContextListerner
并将要共享的通过
setAttribute
)方法提交到内存中去
)应用项目通过
getAttribute(name)
将数据取到
ServletContextT&
java.sql.C&
java.sql.PreparedS&
java.sql.ResultS&
java.util.HashM&
java.util.M&
javax.servlet.ServletC&
javax.servlet.ServletContextE&
javax.servlet.ServletContextL&
util.ConnectT&
class ServletContextLTest implements ServletContextListener{&
实现其中的销毁函数
&&& public void contextDestroyed(ServletContextEvent
&&& &&&&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=&
&&&&&&& try{&
&&&&&&&&&&&
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&,
&&&&&&&&&&&
System.out.println(&======listener test is beginning=========&);&
&&&&&&& }catch(Exception e){&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }finally{&
&&&&&&&&&&& ConnectTool.releasersc(rs, pstm,
connection);&
&&&&&&& }&
在完成上述编码后,仍需在
中进行如下配置,以使得该监听器可以起作用。
&listener&&
&listener-class&ServletContextTest.ServletContextLTest&/listener-class&&
&/listener&&
在完成上述配置后,
服务器在启动时,会直接加载该监听器,通过以下的应用程序就可以进行数据的访问。
ServletContextT&
java.io.IOE&
java.io.PrintW&
java.util.*;&
javax.servlet.ServletC&
javax.servlet.ServletE&
javax.servlet.http.HttpS&
javax.servlet.http.HttpServletR&
javax.servlet.http.HttpServletR&
class CreateEmployee extends HttpServlet{&
&&& @Override&
&&& 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
类来完成,它具有以下功能:
应用启动时从文件中读取计数器的数值,并把表示计数器的 Counter
对象存放到 Web
应用范围内。存放计数器的文件的路径为helloapp/count/count.txt
应用终止时把Web
应用范围内的计数器的数值保存到count.txt
ServletContextT&
javax.servlet.ServletC&
javax.servlet.ServletContextE&
javax.servlet.ServletContextL&
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);
把计数器对象保存到
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();
应用范围获得计数器对象
&&&&&& Counter
counter=(Counter)context.getAttribute(&counter&);
&&&&&& if(counter!=null){
&&&&&& try{
&&&&&&&&& //
把计数器的数值写到
&&&&&&&&& 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
容器进行注册,
容器会在启动或终止
应用时,会调用该监听器的相关方法。在
&listener&
元素用于向容器注册监听器:
&listener&
&listener-class&
ServletContextTest
.MyServletContextListener&listener-class
&/listener&
通过上述两个例子,即可以非常清楚的了解到
ServletContextListener
接口的使用方法及技巧。
在Container
应用程序时(例如启动 Container
之后),会呼叫contextInitialized()
,而当容器移除Web
应用程序时,会呼叫contextDestroyed ()
控制台的打印结果的先后顺序,会发现当 Web
应用启动时,Servlet
容器先调用contextInitialized()
方法,再调用lifeInit
方法;当Web
应用终止时,Servlet
容器先调用lifeInit
的destroy()
方法,再调用contextDestroyed()
方法。由此可见,在Web
应用的生命周期中,ServletContext
对象最早被创建,最晚被销毁。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:393209次
积分:4124
积分:4124
排名:第5049名
原创:76篇
转载:18篇
评论:127条
(1)(7)(1)(6)(2)(1)(6)(4)(2)(6)(17)(1)(3)(3)(5)(1)(2)(8)(9)(1)(1)(2)(2)(2)(4)出处:http://blog.csdn.net
利用Spring随时随地获得Request和Session
一、准备工作:
在web.xml中添加
&listener&
&listener-class&
org.springframework.web.context.request.RequestContextListener
&/listener-class&
&/listener&
二、使用方法:
1、方法一:通过代码实现
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
2、方法二:通过注解实现:
@Autowired
HttpServletR
三、关于RequestContextListener的背景知识:
基于LocalThread将HTTP request对象绑定到为该请求提供服务的线程上。这使得具有request和session作用域的bean能够在后面的调用链中被访问到。
Request作用域
&bean id=&loginAction& class=&com.foo.LoginAction& scope=&request&/&
针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction
bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。
Session作用域
&bean id=&userPreferences& class=&com.foo.UserPreferences& scope=&session&/&
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP
Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
global session作用域
&bean id=&userPreferences& class=&com.foo.UserPreferences& scope=&globalSession&/&
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global
session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
请注意,假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误
二、为什么需要额外的配置RequestContextFilter
也许会有一个疑问,已经通过ContextLoaderListener(或ContextLoaderServlet)将Web容器与Spring容器整合,为什么这里还要用额外的RequestContextListener以支持Bean的另外3个作用域,原因是ContextLoaderListener实现ServletContextListener监听器接口,而ServletContextListener只负责监听Web容器的启动和关闭的事件。RequestContextFilter实现ServletRequestListener监听器接口,该监听器监听HTTP请求事件,Web服务器接收的每次请求都会通知该监听器。通过配置RequestContextFilter,Spring容器与Web容器结合的更加密切。
三、作用域依赖问题
如果将Web相关作用域的Bean注入到singleton或prototype的Bean中,这种情况下,需要Spring AOP
&bean name=&car& class=&com.demo.Car& scope=&request&&
&aop:scoped-proxy/&
&bean id=&boss& class=&com.demo.Boss& &
&properrty name=&car& ref=&car& /&
作者:szwangdf 发表于 15:08:53
阅读:51 评论:0
相关 [java web 利用] 推荐:
- CSDN博客推荐文章
利用Spring随时随地获得Request和Session. 在web.xml中添加
. 1、方法一:通过代码实现. 2、方法二:通过注解实现:. 三、关于RequestContextListener的背景知识:. 基于LocalThread将HTTP request对象绑定到为该请求提供服务的线程上.
- Web前端 - ITeye博客
//把iframe的html挪到div上. &!-- media=&print&表示改样式只在打印预览或打印的时候才生效 --&
&style media=&print& type=&text/css&&  . &!-- 根据urlList,生成&div& &iframe&&iframe/&&/div& 这样格式的页面--&.
- 博客 - 伯乐在线
IBM developerworks. 简介: 本文介绍如何提升 Java Web 服务性能,主要介绍了三种方法:一是采用 Web 服务的异步调用,二是引入 Web 服务批处理模式,三是压缩 SOAP 消息. 重点介绍在编程过程中如何使用异步 Web 服务以及异步调用和同步调用的差异点. 本文还示范了如何在项目中使用以上三种方法,以及各种方法所适合的应用场景.
- Java - 编程语言 - ITeye博客
1.项目引入xssProtect-0.1.jar、antlr-3.0.1.jar、antlr-runtime-3.0.1.jar包. * 覆盖getParameter方法,将参数名和参数值都做xss过滤. * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取&br/&.
- BlogJava-首页技术区
使用Gradle构建Java Web应用. 本文是发布在
java.net上的一篇摘自于&Gradle in Action&一书中的
节选,介绍了使用
Gradle构建Java Web应用的过程. 刚刚接触Gradle,看到了这篇小文,随手译了出来:-) (最后更新).
- JavaScript - Web前端 - ITeye博客
最近遇到一个项目,需要用到较为复杂的打印功能,包括批量打印等. 目前来说,一般一个简单的详情页面打印,直接调用window.print就行了;. 但遇到复杂的时候,我们可能会想到用集成好的控件来解决,当然,如果你有时间又不怕麻烦,你也可以自己写一堆js. 这里,我就先抛砖引玉对两个比较常用的打印控件谈谈自己的看法.
- 企业架构 - ITeye博客
java web开发 高并发处理. java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据). 一:高并发高负载类网站关注点之数据库. 没错,首先是数据库,这是大多数应用所面临的首个SPOF. 尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.
- CSDN博客推荐文章
DFA算法的原理可以参考
这里,简单来说就是通过Map构造出一颗敏感词树,树的每一条由根节点到叶子节点的路径构成一个敏感词,例如下图:. LOG.error(&sensitiveWordMap 未初始化!&);. LOG.error(&敏感词库文件转码失败!&);.
- 企业架构 - ITeye博客
之前做了一个项目,要用到web层的异步化技术,在实际实现中,遇到了很多问题,作为教训简单罗列下. 1、app 容器/J2EE框架对异步的支持.
在tomcat5、jboss4的时候,每一个请求都用了一个app容器线程来执行,app线程必须一直处理完或者等待别的线程处理完,才能拿着请求的链接把结果写回到客户端.
- 圣斌 - IBM developerWorks 中国 : 文档库
Gretty 是构建 Web 服务超轻量级框架的新学派之一. 构建于极快的 Java NIO API 之上,Gretty 将 Groovy 用作 Web 端点和 Grape 的 Maven 式依赖关系管理的一种域特定语言. 本文介绍如何开始使用 Gretty 来构建和部署 Java Web 服务应用程序.
坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。}

我要回帖

更多关于 contextlistener 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信