目录
2,ServletContextAttributeListener
4,HttpSessionAttributeListener
6,ServletRequestAttributeListener
Java对Servlet中的ServletContext(上下文),HttpSession,ServletRequest这三种对象提供了一些监听的接口,我们可以自定义监听器来实现这些接口,对这三种对象的一些事件进行监听。
本文要实现的监听器接口列表
一,对ServletContext的监听
ServletContextListener:Servlet上下文初始化和销毁时的监听器。
ServletContextAttributeListener:Servlet上下文参数变化时的监听器。
二,对HttpSession的监听
HttpSessionListener:HttpSession初始化和销毁时的监听器。
HttpSessionAttributeListener:HttpSession参数变化时的监听器。
三,对ServletRequest的监听
ServletRequestListener:ServletRequest初始化和销毁时的监听器。
ServletRequestAttributeListener:ServletRequest参数变化时的监听器。
对于这三种对象的监听器不止这些,每种监听器分别监听了这些对象发生的不同的事件。
自定义的监听器实例
1,ServletContextListener
代码:
package com.web.system.listener;
import java.util.ArrayList;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 自定义的ServletContext监听器,可以在ServletContext加载时做一些初始化的工作
*
*/
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("MyServletContextListener Destoryed");
}
/**
* servletContext初始化
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("MyServletContextListener Init");
ArrayList<String> expressList=new ArrayList<String>();
expressList.add("顺丰速递");
expressList.add("如风达");
expressList.add("宅急送");
expressList.add("EMS");
arg0.getServletContext().setAttribute("expressList", expressList);
}
}
在web.xml中的配置:
<listener>
<listener-class>com.web.system.listener.MyServletContextListener</listener-class>
</listener>
contextInitialized()方法就是在上下文加载时,监听器触发的方法,在这个方法中可以进行一些自定义的参数初始化的工作。
在上面的例子中我初始化了一个列表并放入上下文中,在应用层的代码中可以用以下方式获得这个列表:
//方法1
ServletContext servletContext= request.getServletContext();
ArrayList<String> expressList=(ArrayList<String>)servletContext.getAttribute("expressList");
//方法2
org.springframework.web.context.WebApplicationContext webApplicationContext = org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext();
ServletContext servletContext2 = webApplicationContext.getServletContext();
ArrayList<String> expressList2=(ArrayList<String>)servletContext2.getAttribute("expressList");
第一个方法是需要有HttpRequest的场合才能使用的。
2,ServletContextAttributeListener
代码:
package com.web.system.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("新增上下文参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("删除上下文参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("修改上下文参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
}
在web.xml中的配置:
<listener>
<listener-class>com.web.system.listener.MyServletContextAttributeListener</listener-class>
</listener>
监听器中的三个方法分别监听了Servlet上下文的参数在新增、修改、删除时的事件,如果在应用层代码中修改上下文的参数:
request.getSession().getServletContext().setAttribute("testContextAttribute", "abc");
request.getSession().getServletContext().setAttribute("testContextAttribute", "def");
request.getSession().getServletContext().removeAttribute("testContextAttribute");
监听器就可以监听到这些事件并输出:
新增上下文参数,name:testContextAttribute,value:abc
修改上下文参数,name:testContextAttribute,value:abc
删除上下文参数,name:testContextAttribute,value:def
3,HttpSessionListener
代码:
package com.web.system.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MyHttpSessionListener implements HttpSessionListener{
/**
* 新增session
*/
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("MyHttpSessionListener Created,sessionId:"+arg0.getSession().getId());
Integer count=null;//session数量
Object sessionCount=arg0.getSession().getServletContext().getAttribute("sessionCount");
if(sessionCount==null){
count=0;
}else{
count=Integer.valueOf(sessionCount.toString());
}
count++;
System.out.println("当前session数:"+count.toString());
arg0.getSession().getServletContext().setAttribute("sessionCount", count);
arg0.getSession().setAttribute("testName", "this is a name");
}
/**
* 销毁session
*/
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("MyHttpSessionListener Destory,sessionId:"+arg0.getSession().getId());
Integer count=null;//session数量
Object sessionCount=arg0.getSession().getServletContext().getAttribute("sessionCount");
if(sessionCount==null){
count=0;
}else{
count=Integer.valueOf(sessionCount.toString());
}
count--;
System.out.println("当前session数:"+count.toString());
arg0.getSession().getServletContext().setAttribute("sessionCount", count);
}
}
在web.xml中的配置:
<listener>
<listener-class>com.web.system.listener.MyHttpSessionListener</listener-class>
</listener>
sessionCreated()方法就是在创建一个session时的监听,具体时间点是在session创建完成之后,所以可以在方法中对刚创建的session进行操作。
在这个例子中,代码维护了一个当前WebService中的session数,当session创建时加一,session销毁时减一,这个session数是放在上下文中的。同时还往当前session中添加了一个叫testName的参数。
这个例子中的session数和testName参数,可以在应用层中的以下代码获得:
String sessionCount=request.getSession().getServletContext().getAttribute("sessionCount").toString();
String testName=request.getSession().getAttribute("testName").toString();
4,HttpSessionAttributeListener
代码:
package com.web.system.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener{
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println(arg0.getSession().getId()+"新增session参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println(arg0.getSession().getId()+"删除session参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println(arg0.getSession().getId()+"修改session参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
}
在web.xml中的配置:
<listener>
<listener-class>com.web.system.listener.MyHttpSessionAttributeListener</listener-class>
</listener>
这个监听器提供了session参数在新增、修改、删除时的监听,如果在应用层代码中对session参数进行操作:
request.getSession().setAttribute("testContextAttribute", "abc");
request.getSession().setAttribute("testContextAttribute", "def");
request.getSession().removeAttribute("testContextAttribute");
监听器就会有如下输出:
26E7704D5B524C997B34E54021D46E44新增session参数,name:testContextAttribute,value:abc
26E7704D5B524C997B34E54021D46E44修改session参数,name:testContextAttribute,value:abc
26E7704D5B524C997B34E54021D46E44删除session参数,name:testContextAttribute,value:def
5,ServletRequestListener
代码:
package com.web.system.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
public class MyServletRequestListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("MyServletRequestListener Destory");
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("MyServletRequestListener Init");
Integer count=null;//请求数量
Object requestCount=arg0.getServletContext().getAttribute("requestCount");
if(requestCount==null){
count=0;
}else{
count=Integer.valueOf(requestCount.toString());
}
count++;
System.out.println("当前请求数:"+count.toString());
arg0.getServletContext().setAttribute("requestCount", count);
//serverName
String serverName=arg0.getServletRequest().getServerName();
System.out.println("serverName:"+serverName);
//serverPort
int serverPort=arg0.getServletRequest().getServerPort();
System.out.println("serverPort:"+serverPort);
HttpServletRequest servletRequest=(HttpServletRequest)arg0.getServletRequest();
//requestURI
String requestURI=servletRequest.getRequestURI();
System.out.println("requestURI:"+requestURI);
//requestURL
String requestURL=servletRequest.getRequestURL().toString();
System.out.println("requestURL:"+requestURL);
//servletPath
String servletPath=servletRequest.getServletPath();
System.out.println("servletPath:"+servletPath);
//queryString
String queryString=servletRequest.getQueryString();
System.out.println("queryString:"+queryString);
}
}
在xml中的配置:
<listener>
<listener-class>com.web.system.listener.MyServletRequestListener</listener-class>
</listener>
requestInitialized()方法就是在一个HttpRequest创建完成时的监听,在该方法中可以对刚组建好的HttpRequest进行操作。
在上面的例子中,代码维护了一个WebService的request请求数并放到了上下文中。另外,方法中还输出了这个请求的ServerName,端口,URL,URI等信息。
如果用户提交了一个这样的请求:
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/datagrid.do?field=id,code,applyDate,filename,reportType,applyUser,outPath
那么监听器可能会有这样的输出:
MyServletRequestListener Init
当前请求数:19
serverName:localhost
serverPort:9080
requestURI:/dangwebx-tst/tms/bms/billingQaReportController/datagrid.do
requestURL:http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/datagrid.do
servletPath:/tms/bms/billingQaReportController/datagrid.do
queryString:field=id,code,applyDate,filename,reportType,applyUser,outPath
6,ServletRequestAttributeListener
代码:
package com.web.system.listener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpServletRequest;
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener{
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
HttpServletRequest servletRequest=(HttpServletRequest)arg0.getServletRequest();
System.out.println(servletRequest.getRequestURL().toString()+"新增request参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
HttpServletRequest servletRequest=(HttpServletRequest)arg0.getServletRequest();
System.out.println(servletRequest.getRequestURL().toString()+"删除request参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
HttpServletRequest servletRequest=(HttpServletRequest)arg0.getServletRequest();
System.out.println(servletRequest.getRequestURL().toString()+"修改request参数,name:"+arg0.getName()+",value:"+arg0.getValue());
}
}
在web.xml中的配置:
<listener>
<listener-class>com.web.system.listener.MyServletRequestAttributeListener</listener-class>
</listener>
这个监听中提供了对HttpRequest的参数在进行新增、修改、删除时的监听,如果在应用层代码中修改请求的参数:
request.setAttribute("testContextAttribute", "abc");
request.setAttribute("testContextAttribute", "def");
request.removeAttribute("testContextAttribute");
那么监听器可能会有这样的输出:
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do新增request参数,name:testContextAttribute,value:abc
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do修改request参数,name:testContextAttribute,value:abc
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do删除request参数,name:testContextAttribute,value:def
在实际项目中,HttpRequestAttribute的监听器输出的内容可能比想象中的要多,因为不管是java还是项目中的其他组件都有可能对请求进行一些必要的装配,所以可能会出现一些这样的输出:
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do新增request参数,name:javax.servlet.jsp.jstl.fmt.locale.request,value:zh_CN
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do新增request参数,name:javax.servlet.jsp.jstl.fmt.localizationContext.request,value:org.springframework.web.servlet.support.JstlUtils$SpringLocalizationContext@486f7c41
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do删除request参数,name:__spring_security_scpf_applied,value:true
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do删除request参数,name:__dangwebx_context_persistence_filter,value:true
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do删除request参数,name:encodingFilter.FILTERED,value:true
http://localhost:9080/dangwebx-tst/tms/bms/billingQaReportController/list.do删除request参数,name:openSessionInViewFilter.FILTERED,value:true
以上就是关于Servlet监听器的几个最简单的例子,另外,在SpringFramework中对这些监听器简直玩出了花,可以看看。