當前位置:
首頁 > 知識 > 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://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中對這些監聽器簡直玩出了花,可以看看。

Servlet中幾個監聽器Listener的使用實例

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

程序員在等代碼出結果的時候都會幹什麼?
nginx log記錄請求響應時間

TAG:程序員小新人學習 |