当Web应用的web容器中运行时,web应用内部会不断地发生各种事件:如Web应用被启动、Web应用被停止,用户session开始、用户session结束、用户请求到达等,通常来说,这些web事件对开发者是透明的。今天笔者将向大家介绍几个常见的Listener类。
(1). ServletContextListener:用于监听Web应用的启动和关闭
(2). ServletContextAttrbuteListener:用于监听ServletContext范围(application)内属性的改变
(3). ServletRequestListener:用于监听用户请求
(4). ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变
(5). HttpSessionListener:用于监听用户session的开始和结束
(6). HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变
同时,使用listener有两种方法,读者可以根据实际情况自己选择:
(1). 使用@Weblistener修饰listener实现类
(2). 在web.xml文档中使用<listener…>元素进行配置。如:
<listener>
<listener-class>com.linjw.GetConnlistener</listener-class>
</listener>
1. ServletContextListener的使用
ServletContextListener主要是web应用的启动和关闭,所以当web启动时,调用的是contextInitialized()的方法,当web关闭时,则调用contextDestroyed()的方法。
@WebListener
public class GetConnListener implements ServletContextListener
{
// 应该启动时,该方法被调用。
public void contextInitialized(ServletContextEvent sce)
{
try
{
// 取得该应用的ServletContext实例
ServletContext application = sce.getServletContext();
// 从配置参数中获取驱动
String driver = application.getInitParameter("driver");
// 从配置参数中获取数据库url
String url = application.getInitParameter("url");
// 从配置参数中获取用户名
String user = application.getInitParameter("user");
// 从配置参数中获取密码
String pass = application.getInitParameter("pass");
// 注册驱动
Class.forName(driver);
// 获取数据库连接
Connection conn = DriverManager.getConnection(url
, user , pass);
// 将数据库连接设置成application范围内的属性
application.setAttribute("conn" , conn);
}
catch (Exception ex)
{
System.out.println("Listener中获取数据库连接出现异常"
+ ex.getMessage());
}
}
// 应该关闭时,该方法被调用。
public void contextDestroyed(ServletContextEvent sce)
{
// 取得该应用的ServletContext实例
ServletContext application = sce.getServletContext();
Connection conn = (Connection)application.getAttribute("conn");
// 关闭数据库连接
if (conn != null)
{
try
{
conn.close();
}
catch (SQLException ex)
{
ex.printStackTrace();
}
}
}
}
2. ServletContextAttributeListener的使用
ServletContextAttributeListener用于监听ServletContext(application)范围属性的变化,实现该方法接口的监听器需要以下的三个方法:
(1). attributeAdded(ServletContextAttributeEventevent):当程序把一个属性放入application范围时触发该方法
(2). attributeRemoved(ServletContextAttributeEventevent):当程序把一个属性从application范围删除时触发该方法。
(3). attributeReplaced(ServletContextAttributeEventevent):当程序替换application范围内的属性时将触发该方法。
@WebListener
public class MyServletContextAttributeListener
implements ServletContextAttributeListener
{
// 当程序向application范围添加属性时触发该方法
public void attributeAdded(ServletContextAttributeEvent event)
{
ServletContext application = event.getServletContext();
// 获取添加的属性名和属性值
String name = event.getName();
Object value = event.getValue();
System.out.println(application + "范围内添加了名为"
+ name + ",值为" + value + "的属性!");
}
// 当程序从application范围删除属性时触发该方法
public void attributeRemoved(ServletContextAttributeEvent event)
{
ServletContext application = event.getServletContext();
// 获取被删除的属性名和属性值
String name = event.getName();
Object value = event.getValue();
System.out.println(application + "范围内名为"
+ name + ",值为" + value + "的属性被删除了!");
}
// 当application范围的属性被替换时触发该方法
public void attributeReplaced(ServletContextAttributeEvent event)
{
ServletContext application = event.getServletContext();
// 获取被替换的属性名和属性值
String name = event.getName();
Object value = event.getValue();
System.out.println(application + "范围内名为"
+ name + ",值为" + value + "的属性被替换了!");
}
}
3. 关于ServletRequestListener和ServletRequestAttributeListener的使用
ServletRequestListener用于监听用户请求的到达,实现该接口的监听需要实现如下两个方法:
(1). requestInitialized(ServletRequestEventsre):用户请求到达、被初始化时触发该方法
(2). requestDestroyed(ServletRequestEventsre):用户请求结束、被销毁时触发该方法
ServletRequestAttributeListener则用于监听ServletRequest(request)范围内属性的变化,实现该接口要实现attribute Added()、attributeRemoved()、attributeReplaced()三个方法。
@WebListener
public class RequestListener
implements ServletRequestListener , ServletRequestAttributeListener
{
// 当用户请求到达、被初始化时触发该方法
public void requestInitialized(ServletRequestEvent sre)
{
HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
System.out.println("----发向" + request.getRequestURI()
+ "请求被初始化----"); }
// 当用户请求结束、被销毁时触发该方法
public void requestDestroyed(ServletRequestEvent sre)
{
HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
System.out.println("----发向" + request.getRequestURI()
+ "请求被销毁----");
}
// 当程序向request范围添加属性时触发该方法
public void attributeAdded(ServletRequestAttributeEvent event)
{
ServletRequest request = event.getServletRequest();
// 获取添加的属性名和属性值
String name = event.getName();
Object value = event.getValue();
System.out.println(request + "范围内添加了名为"
+ name + ",值为" + value + "的属性!");
}
// 当程序从request范围删除属性时触发该方法
public void attributeRemoved(ServletRequestAttributeEvent event)
{
ServletRequest request = event.getServletRequest();
// 获取被删除的属性名和属性值
String name = event.getName();
Object value = event.getValue();
System.out.println(request + "范围内名为"
+ name + ",值为" + value + "的属性被删除了!");
}
// 当request范围的属性被替换时触发该方法
public void attributeReplaced(ServletRequestAttributeEvent event)
{
ServletRequest request = event.getServletRequest();
// 获取被替换的属性名和属性值
String name = event.getName();
Object value = event.getValue();
System.out.println(request + "范围内名为"
+ name + ",值为" + value + "的属性被替换了!");
}
}
4. 关于HttpSessionListener和HttpSessionAttributeListener的使用
HttpSessionListener用于用户监听session的创建和销毁,实现该接口的监听器需要实现如下方法:
(1). sessionCreate(HttpSessionEventse):用户与服务器的会话开始、创建时触发该方法
(2). sessionDestroyed(HttpSessionEventse):用与服务器的会话断开、销毁时触发该方法
HttpSessionAttributeListener则用于监听HttpSession(session)范围内属性的变化,实现监听器需要实现方法有:attributeAdded()、attributeRemoved()、attributeReplaced()三个方法。
@WebListener
public class OnlineListener
implements HttpSessionListener
{
// 当用户与服务器之间开始session时触发该方法
public void sessionCreated(HttpSessionEvent se)
{
HttpSession session = se.getSession();
ServletContext application = session.getServletContext();
// 获取session ID
String sessionId = session.getId();
// 如果是一次新的会话
if (session.isNew())
{
String user = (String)session.getAttribute("user");
// 未登录用户当游客处理
user = (user == null) ? "游客" : user;
Map<String , String> online = (Map<String , String>)
application.getAttribute("online");
if (online == null)
{
online = new Hashtable<String , String>();
}
// 将用户在线信息放入Map中
online.put(sessionId , user);
application.setAttribute("online" , online);
}
}
// 当用户与服务器之间session断开时触发该方法
public void sessionDestroyed(HttpSessionEvent se)
{
HttpSession session = se.getSession();
ServletContext application = session.getServletContext();
String sessionId = session.getId();
Map<String , String> online = (Map<String , String>)
application.getAttribute("online");
if (online != null)
{
// 删除该用户的在线信息
online.remove(sessionId);
}
application.setAttribute("online" , online);
}
}
5. 总结
以上介绍的只是我们常见的监听类,其实在框架Strtuts2中有着比JSP更强大的监听器。但是我们对于JSP的监听的了解有助于我们学习struts2,同时也可对JSP的核心用法有更深入得知。