Servlet中几个监听器Listener的使用实例

目录

本文要实现的监听器接口列表

自定义的监听器实例

1,ServletContextListener

2,ServletContextAttributeListener

3,HttpSessionListener

4,HttpSessionAttributeListener

5,ServletRequestListener

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://本地主机:9080 / dangwebx-TST / TMS / BMS / billingQaReportController / list.do删除请求参数,名称:testContextAttribute,值:DEF

在实际项目中,HttpRequestAttribute的监听器输出的内容可能比想象中的要多,因为不管是Java的还是项目中的其他组件都有可能对请求进行一些必要的装配,所以可能会出现一些这样的输出:

HTTP://本地主机:9080 / dangwebx-TST / TMS / BMS / billingQaReportController / list.do新增请求参数,名称:javax.servlet.jsp.jstl.fmt.locale.request,值:zh_CN的

HTTP://本地主机:9080 / dangwebx-TST / TMS / BMS / billingQaReportController / list.do新增请求参数,名称:javax.servlet.jsp.jstl.fmt.localizationContext.request,值:org.springframework.web。 servlet.support.JstlUtils$SpringLocalizationContext@486f7c41

HTTP://本地主机:9080 / dangwebx-TST / TMS / BMS / billingQaReportController / list.do删除请求参数,名称:__ spring_security_scpf_applied,值:真

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

猜你喜欢

转载自blog.csdn.net/qq_36838191/article/details/83685565