servlet监听器有一共有8种,3种类型,分别针对3个作用域。
1.创建,销毁型
ServletRequestListener有以下两个方法
void requestDestroyed(ServletRequestEvent sre)
void requestInitialized(ServletRequestEvent sre)
HttpSessionListener有以下两个方法
void sessionCreated(HttpSessionEvent se)
void sessionDestroyed(HttpSessionEvent se)
ServletContextListener
void contextDestroyed(ServletContextEvent sce)
void contextInitialized(ServletContextEvent sce)
2.增删改型
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
对于以上两种需要注册型,在web.xml中加入如下配置
<listener>
<listener-class>
com.asarja.base.listener.RequestHandleListener
</listener-class>
</listener>
3.不用注册型(以下两种监听器需要 实现类 实例化 )
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定,和解绑
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。(该监听器用法还在试验中)
demo:
下面一个demo展示以上7种监听器如何被调用的。
RequestListenerDemo.java
public class RequestListenerDemo implements ServletRequestListener{
public void requestDestroyed(ServletRequestEvent event) {
System.out.println(((HttpServletRequest)event.getServletRequest()).getRequestURL()+" destroyed");
}
public void requestInitialized(ServletRequestEvent event) {
System.out.println(((HttpServletRequest)event.getServletRequest()).getRequestURL()+" initialized");
}
}
RequestAttributeListenerDemo.java
public class RequestAttributeListenerDemo implements ServletRequestAttributeListener{
public void attributeAdded(ServletRequestAttributeEvent event) {
System.out.println("request "+event.getName()+ " add");
}
public void attributeRemoved(ServletRequestAttributeEvent event) {
System.out.println("request "+event.getName()+" remove");
}
public void attributeReplaced(ServletRequestAttributeEvent event) {
System.out.println("request "+event.getName()+" replace");
}
}
ServletContextListenerDemo.java
public class ServletContextListenerDemo implements ServletContextListener{
public void contextDestroyed(ServletContextEvent event) {
System.out.println(event.getServletContext().getServerInfo()+" destroyed");
}
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().setAttribute("name", "context");
System.out.println(event.getServletContext().getServerInfo()+" initialized");
}
}
ServletContextAttributeListenerDemo.java
public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener{
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("servletContext "+event.getName() +" add");
}
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("servletContext "+event.getName() +" remove");
}
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("servletContext "+event.getName() +" replace");
}
}
SessionListenerDemo.java
public class SessionListenerDemo implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent event) {
System.out.println(event.getSession().getId()+" created");
}
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println(event.getSession().getId()+" destoryed");
}
}
SessionAttributeListenerDemo.java
public class SessionAttributeListenerDemo implements HttpSessionAttributeListener{
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("session "+event.getName()+" add");
}
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("session "+event.getName()+" remove");
}
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("session "+event.getName()+" replace");
}
}
SessionBindingListenerDemo.java
public class SessionBindingListenerDemo implements HttpSessionBindingListener{
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("session " + event.getName() + " bound");
}
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("session " + event.getName() + " unbound");
}
}
CreateSession.java
public class CreateSession extends HttpServlet {
private static final long serialVersionUID = 1L;
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//HttpSessionBindingListener
SessionBindingListenerDemo sessionBindingListenerDemo = new SessionBindingListenerDemo();
//HttpSessionActivationListener
SessionActivationListenerDemo sessionActivationListenerDemo = new SessionActivationListenerDemo();
request.getSession().setAttribute("sessionBindingListenerDemo", sessionBindingListenerDemo);
request.getSession().removeAttribute("sessionBindingListenerDemo");
request.getSession().setAttribute("sessionActivationListenerDemo", sessionActivationListenerDemo);
request.getSession().removeAttribute("sessionActivationListenerDemo");
request.getSession().setAttribute("name", "zs");
request.setAttribute("name", "request");
request.getRequestDispatcher("session.jsp").forward(request, response);
}
}
web.xml
<listener>
<listener-class>
com.asarja.listener.ServletContextAttributeListenerDemo
</listener-class>
</listener>
<listener>
<listener-class>
com.asarja.listener.SessionAttributeListenerDemo
</listener-class>
</listener>
<listener>
<listener-class>
com.asarja.listener.RequestAttributeListenerDemo
</listener-class>
</listener>
<listener>
<listener-class>
com.asarja.listener.RequestListenerDemo
</listener-class>
</listener>
<listener>
<listener-class>
com.asarja.listener.SessionListenerDemo
</listener-class>
</listener>
<listener>
<listener-class>
com.asarja.listener.ServletContextListenerDemo
</listener-class>
</listener>
<servlet>
<servlet-name>CreateSession</servlet-name>
<servlet-class>com.asarja.listener.controller.CreateSession</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CreateSession</servlet-name>
<url-pattern>/createSession.do</url-pattern>
</servlet-mapping>
jsp
<%
session.getServletContext().setAttribute("name", "ls");
session.getServletContext().removeAttribute("name");
session.setAttribute("name", "li");
session.removeAttribute("name");
session.invalidate();
request.setAttribute("name", "request");
request.setAttribute("name", "request");
request.removeAttribute("name");
%>
以上测试了7种listener如何工作
request域监听器:可以用于监听客户端每一次请求的详细信息
session域监听器:可以用于记录在线人数(不是太准确)
servletContext域监听器:可以用于初始化一些数据等等,以供全局使用