Servlet过滤器.docx
- 文档编号:13488810
- 上传时间:2023-06-14
- 格式:DOCX
- 页数:13
- 大小:20.76KB
Servlet过滤器.docx
《Servlet过滤器.docx》由会员分享,可在线阅读,更多相关《Servlet过滤器.docx(13页珍藏版)》请在冰点文库上搜索。
Servlet过滤器
Servlet监听器详解
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
接口:
目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中HttpSessionAttributeListener与
HttpSessionBindingListener皆使用HttpSessionBindingEvent;HttpSessionListener和HttpSessionActivationListener则都使用HttpSessionEvent;其余Listener对应的Event如下所示:
Listener接口
Event类
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中,经由
当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:
Stringname=(String)application.getInitParameter("Name");
或者使用EL时:
${initPara.name}
若是在Servlet中,取得Name的值方法:
Stringname=(String)ServletContext.getInitParameter("Name");
1.ServletContextListener:
用于监听WEB应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener接口。
ServletContextListener是ServletContext的监听者,如果ServletContext发生变化,如服务器启动时ServletContext被创建,服务器关闭时ServletContext将要被销毁。
ServletContextListener接口的方法:
voidcontextInitialized(ServletContextEventsce)
通知正在接受的对象,应用程序已经被加载及初始化。
voidcontextDestroyed(ServletContextEventsce)
通知正在接受的对象,应用程序已经被载出。
ServletContextEvent中的方法:
ServletContextgetServletContext()
取得ServletContext对象
2.ServletContextAttributeListener:
用于监听WEB应用属性改变的事件,包括:
增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。
ServletContextAttributeListener接口方法:
voidattributeAdded(ServletContextAttributeEventscab)
若有对象加入Application的范围,通知正在收听的对象
voidattributeRemoved(ServletContextAttributeEventscab)
若有对象从Application的范围移除,通知正在收听的对象
voidattributeReplaced(ServletContextAttributeEventscab)
若在Application的范围中,有对象取代另一个对象(重新给赋值保存)时,通知正在收听的对象
ServletContextAttributeEvent中的方法:
java.lang.StringgetName()
回传属性的名称
java.lang.ObjectgetValue()
回传属性的值
现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
主要作用是:
做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
下面利用监听器对数据库连接池DataSource的初始化演示它的使用:
1:
MyServletContextListener.java
2:
packagedc.gz.listeners;
3:
importjavax.servlet.ServletContext;
4:
importjavax.servlet.ServletContextEvent;
5:
importjavax.servlet.ServletContextListener;
6:
importmons.dbcp.BasicDataSource;
7:
8:
/**
9:
*Web应用监听器
10:
*/
11:
publicclassMyServletContextListenerimplementsServletContextListener{
12:
//应用监听器的销毁方法
14:
publicvoidcontextDestroyed(ServletContextEventevent){
15:
ServletContextsc=event.getServletContext();
16:
//在整个web应用销毁之前调用,将所有应用空间所设置的内容清空
17:
sc.removeAttribute("dataSource");
18:
System.out.println("销毁工作完成...");
19:
}
20:
21:
//应用监听器的初始化方法
22:
publicvoidcontextInitialized(ServletContextEventevent){
23:
//通过这个事件可以获取整个应用的空间
24:
//在整个web应用下面启动的时候做一些初始化的内容添加工作
25:
ServletContextsc=event.getServletContext();
26:
//设置一些基本的内容;比如一些参数或者是一些固定的对象
27:
//创建DataSource对象,连接池技术dbcp
28:
BasicDataSourcebds=newBasicDataSource();
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:
}
42:
}
web.xml中配置如下,很简单:
1:
--配置应用监听器-->
2:
3:
4:
这样配置好了之后,以后在web应用中就可以通过ServletContext取得BasicDataSource对象,从而获取与数据库的连接,提高性能,方便使用。
上面通过两个示例演示了Filter和Listener的基本使用,对于其它的应用则需要我们在项目开发中根据具体的场景选择。
二、HttpSession相关监听接口
1.HttpSessionBindingListener接口
注意:
HttpSessionBindingListener接口是唯一不需要在web.xml中设定的Listener
当我们使用的类实现了HttpSessionBindingListener接口后,只要该类的对象加入Session范围(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的removeAttribute方法的时候或SessionTimeout的时候)时,容器分别会自动调用下列两个方法:
voidvalueBound(HttpSessionBindingEventevent)
voidvalueUnbound(HttpSessionBindingEventevent)
publicclassUserObjectimplementsHttpSessionBindingListener
{
publicvoidvalueBound(HttpSessionBindingEventevent)
{
System.out.println("触发绑定事件!
");
}
publicvoidvalueUnbound(HttpSessionBindingEventevent)
{
System.out.println("解除和session的绑定");
}}
当把该监听器保存到session中,session.setAttribute("user",user)时就会触发valueBound事件.
当该监听器从session中移除时即session.removeAttribute("user"),触发valueUnbound事件;session失效或超时
时也会触发valueUnbound事件。
注意:
只有当该监听器(UserObject)保存到session中或从session移除时才会触发事件,其他没有实现该listener对象保存到session时不会触发该事件。
思考:
如何实现记录网站的客户登录日志,统计在线人数?
2.HttpSessionAttributeListener接口
HttpSessionAttributeListener监听HttpSession中的属性的操作。
当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEventse)方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEventse)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEventse)方法。
这和ServletContextAttributeListener比较类似。
.HttpSessionAttributeListener接口和HttpSessionBindingListener区别:
HttpSessionAttributeListener是所有session属性操作都可以,HttpSessionBindingListener只是针对于被绑定类的对象在实现session操作时候。
3.HttpSessionListener接口
HttpSessionListener监听HttpSession的操作。
当创建一个Session时,激发sessionCreated(HttpSessionEventse)方法;当销毁一个Session时,激发sessionDestroyed(HttpSessionEventse)方法。
4.HttpSessionActivationListener接口
主要用于同一个Session转移至不同的JVM的情形。
四、ServletRequest监听接口
1.ServletRequestListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
2.ServletRequestAttributeListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
Servlet监听器监听器概述
◆Listener是Servlet的监听器
◆可以监听客户端的请求、服务端的操作等。
◆通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1。
◆编写监听器需要实现相应的接口
◆编写完成后在web.xml文件中配置一下,就可以起作用了
◆可以在不修改现有系统基础上,增加web应用程序生命周期事件的跟踪
常用的Servlet监听器监听接口
◆ServletContextAttributeListener
监听对ServletContext属性的操作,比如增加/删除/修改
◆ServletContextListener
监听ServletContext,当创建ServletContext时,激发contextInitialized(ServletContextEventsce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEventsce)方法。
◆HttpSessionListener
监听HttpSession的操作。
当创建一个Session时,激发sessionCreated(SessionEventse)方法;当销毁一个Session
时,激发sessionDestroyed(HttpSessionEventse)方法。
◆HttpSessionAttributeListener
监听HttpSession中的属性的操作。
当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEventse)方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEventse)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEventse)方法。
使用范例:
由Servlet监听器管理共享数据库连接
生命周期事件的一个实际应用由context监听器管理共享数据库连接。
在web.xml中如下定义监听器:
﹤listener﹥
﹤listener-class﹥XXX.MyConnectionManager﹤/listener-class﹥
﹤/listener﹥
server创建监听器的实例,接受事件并自动判断实现监听器接口的类型。
要记住的是由于监听器是配置在部署描述符web.xml中,所以不需要改变任何代码就可以添加新的监听器。
public class MyConnectionManager implements ServletContextListener{
public void contextInitialized(ServletContextEvent e) {
Connection con = // create connection
e.getServletContext().setAttribute("con", con);
}
public void contextDestroyed(ServletContextEvent e) {
Connection con = (Connection) e.getServletContext().getAttribute("con");
try {
con.close();
}
catch (SQLException ignored) { } // close connection
}
}
Servlet监听器保证每新生成一个servletcontext都会有一个可用的数据库连接,并且所有的连接对会在context关闭的时候随之关闭。
有的listener可用于统计网站在线人数及访问量。
如下:
服务器启动时(实现ServletContextListener监听器contextInitialized方法),读取数据库,并将其用一个计数变量保存在application范围内session创建时(实现HttpSessionListener监听器sessionCreated方法),读取计数变量加1并重新保存
服务器关闭时(实现ServletContextListener监听器contextDestroyed方法),更新数据库。
简例一
监听用户上线与退出,显示在线用户
1、登陆页面Login.jsp
<%@pagepageEncoding="gb2312"contentType="text/html;charset=gb2312"%>
<%
session=request.getSession(false);
if(session!
=null)session.invalidate();
%>
用户名:
2、控制页面(只是为了说明监听器问题,所以简单了点...)isOnline.jsp
<%@pagepageEncoding="gb2312"contentType="text/html;charset=gb2312"%>
<%
session=request.getSession();
session.setAttribute("userName",request.getParameter("uName"));
response.sendRedirect("showOnline.jsp");
%>
3、显示页面showOnline.jsp
<%@pagepageEncoding="gb2312"contentType="text/html;charset=gb2312"import="java.util.ArrayList"%>
<%
ArrayListshowList=(ArrayList)(getServletContext().getAttribute("list"));
out.print("在线人数"+showList.size()+"
");
for(inti=0;i out.print(showList.get(i)+"在线"+" } %> 4、配置页面web.xml xmlversion="1.0"encoding="gb2312"? > DOCTYPEweb-app PUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN" " 5、监听器onlineListener.java packageorg.xi
");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Servlet 过滤器