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 {@Overridepublic void contextDestroyed(ServletContextEvent arg0) {System.out.println("MyServletContextListener Destoryed");}/*** servletContext初始化*/@Overridepublic 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()方法就是在上下文加载时,监听器触发的方法,在这个方法中可以进行一些自定义的参数初始化的工作。
在上面的例子中我初始化了一个列表并放入上下文中,在应用层的代码中可以用以下方式获得这个列表:
//方法1ServletContext servletContext= request.getServletContext();ArrayList<String> expressList=(ArrayList<String>)servletContext.getAttribute("expressList");//方法2org.springframework.web.context.WebApplicationContext webApplicationContext = org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext();ServletContext servletContext2 = webApplicationContext.getServletContext();ArrayList<String> expressList2=(ArrayList<String>)servletContext2.getAttribute("expressList");
2,ServletContextAttributeListener
代码:
package com.web.system.listener;import javax.servlet.ServletContextAttributeEvent;import javax.servlet.ServletContextAttributeListener;public class MyServletContextAttributeListener implements ServletContextAttributeListener{@Overridepublic void attributeAdded(ServletContextAttributeEvent arg0) {System.out.println("新增上下文参数,name:"+arg0.getName()+",value:"+arg0.getValue());}@Overridepublic void attributeRemoved(ServletContextAttributeEvent arg0) {System.out.println("删除上下文参数,name:"+arg0.getName()+",value:"+arg0.getValue());}@Overridepublic 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*/@Overridepublic 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*/@Overridepublic 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
代码:
1. package com.web.system.listener;2.3. import javax.servlet.http.HttpSessionAttributeListener;4. import javax.servlet.http.HttpSessionBindingEvent;5.6. public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener{7.8. @Override9. public void attributeAdded(HttpSessionBindingEvent arg0) {10. System.out.println(arg0.getSession().getId()+"新增session参数,name:"+arg0.getName()+",value:"+arg0.getValue());11.12. }13.14. @Override15. public void attributeRemoved(HttpSessionBindingEvent arg0) {16. System.out.println(arg0.getSession().getId()+"删除session参数,name:"+arg0.getName()+",value:"+arg0.getValue());17.18. }19.20. @Override21. public void attributeReplaced(HttpSessionBindingEvent arg0) {22. System.out.println(arg0.getSession().getId()+"修改session参数,name:"+arg0.getName()+",value:"+arg0.getValue());23.24. }25.26. }
在web.xml中的配置:
1. <listener>2.3. <listener-class>com.web.system.listener.MyHttpSessionAttributeListener</listener-class>4.5. </listener>
这个监听器提供了session参数在新增、修改、删除时的监听,如果在应用层代码中对session参数进行操作:
1. request.getSession().setAttribute("testContextAttribute", "abc");2.3. request.getSession().setAttribute("testContextAttribute", "def");4.5. 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{@Overridepublic void requestDestroyed(ServletRequestEvent arg0) {System.out.println("MyServletRequestListener Destory");}@Overridepublic 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);//serverNameString serverName=arg0.getServletRequest().getServerName();System.out.println("serverName:"+serverName);//serverPortint serverPort=arg0.getServletRequest().getServerPort();System.out.println("serverPort:"+serverPort);HttpServletRequest servletRequest=(HttpServletRequest)arg0.getServletRequest();//requestURIString requestURI=servletRequest.getRequestURI();System.out.println("requestURI:"+requestURI);//requestURLString requestURL=servletRequest.getRequestURL().toString();System.out.println("requestURL:"+requestURL);//servletPathString servletPath=servletRequest.getServletPath();System.out.println("servletPath:"+servletPath);//queryStringString queryString=servletRequest.getQueryString();System.out.println("queryString:"+queryString);}}
在xml中的配置:
1. <listener>2.3. <listener-class>com.web.system.listener.MyServletRequestListener</listener-class>4.5. </listener>
requestInitialized()方法就是在一个HttpRequest创建完成时的监听,在该方法中可以对刚组建好的HttpRequest进行操作。
在上面的例子中,代码维护了一个WebService的request请求数并放到了上下文中。另外,方法中还输出了这个请求的ServerName,端口,URL,URI等信息。
如果用户提交了一个这样的请求:
那么监听器可能会有这样的输出:
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
代码:
1. package com.web.system.listener;2.3. import javax.servlet.ServletRequestAttributeEvent;4. import javax.servlet.ServletRequestAttributeListener;5. import javax.servlet.http.HttpServletRequest;6.7. public class MyServletRequestAttributeListener implements ServletRequestAttributeListener{8.9. @Override10. public void attributeAdded(ServletRequestAttributeEvent arg0) {11. HttpServletRequest servletRequest=(HttpServletRequest)arg0.getServletRequest();12. System.out.println(servletRequest.getRequestURL().toString()+"新增request参数,name:"+arg0.getName()+",value:"+arg0.getValue());13.14. }15.16. @Override17. public void attributeRemoved(ServletRequestAttributeEvent arg0) {18. HttpServletRequest servletRequest=(HttpServletRequest)arg0.getServletRequest();19. System.out.println(servletRequest.getRequestURL().toString()+"删除request参数,name:"+arg0.getName()+",value:"+arg0.getValue());20.21. }22.23. @Override24. public void attributeReplaced(ServletRequestAttributeEvent arg0) {25. HttpServletRequest servletRequest=(HttpServletRequest)arg0.getServletRequest();26. System.out.println(servletRequest.getRequestURL().toString()+"修改request参数,name:"+arg0.getName()+",value:"+arg0.getValue());27.28. }29.30. }
在web.xml中的配置:
1. <listener>2.3. <listener-class>com.web.system.listener.MyServletRequestAttributeListener</listener-class>4.5. </listener>
这个监听中提供了对HttpRequest的参数在进行新增、修改、删除时的监听,如果在应用层代码中修改请求的参数:
1. request.setAttribute("testContextAttribute", "abc");2.3. request.setAttribute("testContextAttribute", "def");4.5. 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中对这些监听器简直玩出了花,可以看看。
