一、监听器
监听器是web应用程序事件模型的一部分,当web应用中的某些状态发生改变时,会产生相应的事件,监听器可以接收这些事件,并可以在事件发生时做相应的处理。
二、监听器常用的接口
2.1、javax.servlet.ServletContextListener
实现该接口可以在servlet上下文对象初始化或者销毁时得到通知
2.2、javax.servlet.ServletContextAttributeListener
实现该接口,可以 在servlet上下文的属性列表发生变化时得到通知
2.3、javax.servlet.http.HttpSessionListener
实现该接口可以在创建session后或者失效前得到通知
2.4、javax.servlet.http.HttpSessionActivationListener
实现该接口的对象,如果绑定到session中,当serssion被钝化或者激活时,servlet容器将通知该对象。
2.5、javax.servlet.http.HttpSessionAttributeListener
实现该接口,可以 在servlet上下文的属性列表发生变化时得到通知
2.6、javax.servlethttp.HttpSessionBindListener
实现该接口,可以使一个对象在绑定serssion或者从serssion中删除时得到通知。
2.7、javax.servlet.servletRequest
实现该接口,可以在请求对象初始化时或者被销毁时得到通知。
2.8、javax.servlet.ServletRequestAttributeListener
实现该接口,可以在请求对象中的属性发生变化是得到通知。
三、监听器的应用
3.1、HttpSessionBindingListener接口
定义实现HttpSessionBindingListener接口,当有session创建是在线人数+1,当session销毁时在线人数-1.
package demo.web.listener; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; public class UserListener implements HttpSessionBindingListener { public void valueBound(HttpSessionBindingEvent arg0) { Constants.ONLINE_USER_COUNT ++; } public void valueUnbound(HttpSessionBindingEvent arg0) { Constants.ONLINE_USER_COUNT --; } }
在web.xml中的简单配置
<listener> <listener-class>demo.web.listener.UserListener</listener-class> </listener>
3.2、利用servletContextListener接口
在系统服务启动时,加载DataSource对象,获取数据库连接。
- 编写监听器,实现实用JNDI查找数据源。
- 将查找到的数据源保存在servletContext上下文中。
- 编写一个servlet,读取上下文,并从中查找到数据源。
- 在web.xml文件中配置监听器及servlet
public class DataSourceListener implements ServletContextListener{ public void ContextInitialized(ServletContextEnvent e){ ServletContext sc = e.getServletContext(); Context cxt = new InitialContext();// 初始化上下文 // 获取与逻辑名相关的数据源对象 DataSource ds =(DtaSource)cxt.lookup("java:comp/env/jdbc/news"); // 将dataSource保存到servletContext上下文中 sc.serAttribute("DS",ds); } }
servlet相关代码:
package demo.web.servlet; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { DataSource ds = (DataSource)getServletContext().getAttribute("DS"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { super.service(arg0, arg1); } }
web.xml中的配置:
<servlet> <servlet-name>myServlet</servlet-name> <servlet-class>demo.web.servlet.MyServlet3</servlet-class> <init-param> <param-name>charSerContent</param-name> <param-value>utf-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/demo/myServlet</url-pattern> </servlet-mapping> <listener> <listener-class>demo.web.listener.UserListener</listener-class> </listener>