1. 程式人生 > >Servlet中幾個監聽器Listener的使用例項

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。 [email protected]

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中對這些監聽器簡直玩出了花,可以看看。