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中對這些監聽器簡直玩出了花,可以看看。
※程序員在等代碼出結果的時候都會幹什麼?
※nginx log記錄請求響應時間
TAG:程序員小新人學習 |