Servlet过滤器.docx

上传人:b****6 文档编号:13488810 上传时间:2023-06-14 格式:DOCX 页数:13 大小:20.76KB
下载 相关 举报
Servlet过滤器.docx_第1页
第1页 / 共13页
Servlet过滤器.docx_第2页
第2页 / 共13页
Servlet过滤器.docx_第3页
第3页 / 共13页
Servlet过滤器.docx_第4页
第4页 / 共13页
Servlet过滤器.docx_第5页
第5页 / 共13页
Servlet过滤器.docx_第6页
第6页 / 共13页
Servlet过滤器.docx_第7页
第7页 / 共13页
Servlet过滤器.docx_第8页
第8页 / 共13页
Servlet过滤器.docx_第9页
第9页 / 共13页
Servlet过滤器.docx_第10页
第10页 / 共13页
Servlet过滤器.docx_第11页
第11页 / 共13页
Servlet过滤器.docx_第12页
第12页 / 共13页
Servlet过滤器.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Servlet过滤器.docx

《Servlet过滤器.docx》由会员分享,可在线阅读,更多相关《Servlet过滤器.docx(13页珍藏版)》请在冰点文库上搜索。

Servlet过滤器.docx

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范围,例如:

  Name

  browser

 

 当容器启动时,会建立一个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:

      dc.gz.listeners.MyServletContextListener

  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"

   "

   org.xiosu.listener.onlineListener

5、监听器onlineListener.java

packageorg.xi

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2