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