servet

您所在的位置:网站首页 servlet淘汰 servet

servet

2023-03-21 20:19| 来源: 网络整理| 查看: 265

本文要实现的监听器接口列表自定义的监听器实例1,ServletContextListener2,ServletContextAttributeListener3,HttpSessionListener4,HttpSessionAttributeListener5,ServletRequestListener6,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 expressList=new ArrayList(); expressList.add("顺丰速递"); expressList.add("如风达"); expressList.add("宅急送"); expressList.add("EMS"); arg0.getServletContext().setAttribute("expressList", expressList); }}

在web.xml中的配置:

com.web.system.listener.MyServletContextListener

contextInitialized()方法就是在上下文加载时,监听器触发的方法,在这个方法中可以进行一些自定义的参数初始化的工作。在上面的例子中我初始化了一个列表并放入上下文中,在应用层的代码中可以用以下方式获得这个列表:

//方法1ServletContext servletContext= request.getServletContext();ArrayList expressList=(ArrayList)servletContext.getAttribute("expressList");//方法2org.springframework.web.context.WebApplicationContext webApplicationContext = org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext(); ServletContext servletContext2 = webApplicationContext.getServletContext();ArrayList expressList2=(ArrayList)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中的配置:

com.web.system.listener.MyServletContextAttributeListener

监听器中的三个方法分别监听了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中的配置:

com.web.system.listener.MyHttpSessionListener

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. 2. 3. com.web.system.listener.MyHttpSessionAttributeListener4. 5.

这个监听器提供了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{ @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中的配置:

1. 2. 3. com.web.system.listener.MyServletRequestListener4. 5.

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

代码:

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. 2. 3. com.web.system.listener.MyServletRequestAttributeListener4. 5.

这个监听中提供了对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中对这些监听器简直玩出了花,可以看看。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3