監聽器是java web開發中很重要的內容,其中涉及到的知識,可以參考下面導圖:
web監聽器
1 什么是web監聽器?
web監聽器是一種servlet中的特殊的類,它們能幫助開發者監聽web中的特定事件,比如servletcontext,httpsession,servletrequest的創建和銷毀;變量的創建、銷毀和修改等。可以在某些動作前后增加處理,實現監控。
2 監聽器常用的用途
- 通常使用web監聽器做以下的內容:
- 統計在線人數,利用httpsessionlisener
- 加載初始化信息:利用servletcontextlistener
- 統計網站訪問量
- 實現訪問監控
3 接下里看看一個監聽器的創建以及執行過程
首先需要創建一個監聽器,實現某種接口,例如我想實現一個對在線人數的監控,可以創建如下的監聽器:
1
2
3
4
5
6
7
8
9
10
11
|
public class mylistener implements httpsessionlistener{ private int usernumber = 0 ; public void sessioncreated(httpsessionevent arg0) { usernumber++; arg0.getsession().setattribute( "usernumber" , usernumber); } public void sessiondestroyed(httpsessionevent arg0) { usernumber--; arg0.getsession().setattribute( "usernumber" , usernumber); } } |
然后在web.xml中配置該監聽器,在web-app中添加:
1
2
3
|
<listener> <listener- class >com.test.mylistener</listener- class > </listener> |
在jsp中添加訪問人數:
1
2
3
|
<body> 在線人數:<%=session.getattribute( "usernumber" ) %><br/> </body> |
當我使用我的瀏覽器訪問時,執行結果如下:
當打開另一個瀏覽器訪問時:
由于打開另一個瀏覽器訪問,相當于另一個會話,因此在線人數會增加。
對于3.0版本的servlet來說,還支持使用注解的方式進行配置。
那么接下來看看都有哪些監聽器以及方法吧!
監聽器的分類
1 按照監聽的對象劃分:
按照監聽對象的不同可以劃分為三種:
servletcontext監控:對應監控application內置對象的創建和銷毀。
當web容器開啟時,執行contextinitialized方法;當容器關閉或重啟時,執行contextdestroyed方法。
實現方式:直接實現servletcontextlistener接口:
1
2
3
4
5
6
7
8
|
public class myservletcontextlistener implements servletcontextlistener{ public void contextdestroyed(servletcontextevent sce) { } public void contextinitialized(servletcontextevent sce) { } } |
httpsession監控:對應監控session內置對象的創建和銷毀。
當打開一個新的頁面時,開啟一個session會話,執行sessioncreated方法;當頁面關閉session過期時,或者容器關閉銷毀時,執行sessiondestroyed方法。
實現方式:直接實現httpsessionlistener接口:
1
2
3
4
5
6
7
8
|
public class myhttpsessionlistener implements httpsessionlistener{ public void sessioncreated(httpsessionevent arg0) { } public void sessiondestroyed(httpsessionevent arg0) { } } |
servletrequest監控:對應監控request內置對象的創建和銷毀。
當訪問某個頁面時,出發一個request請求,執行requestinitialized方法;當頁面關閉時,執行requestdestroyed方法。
實現方式,直接實現servletrequestlistener接口:
1
2
3
4
5
6
7
8
|
public class myservletrequestlistener implements servletrequestlistener{ public void requestdestroyed(servletrequestevent arg0) { } public void requestinitialized(servletrequestevent arg0) { } } |
2 按照監聽事件劃分:
2.1 監聽事件自身的創建和銷毀:同上面的按對象劃分。
2.2 監聽屬性的新增、刪除和修改:
監聽屬性的新增、刪除和修改也是劃分成三種,分別針對于servletcontext、httpsession、servletrequest對象:
servletcontext,實現servletcontextattributelistener接口:
通過調用servletcontextattribtueevent的getname方法可以得到屬性的名稱。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class myservletcontextattrlistener implements servletcontextattributelistener{ public void attributeadded(servletcontextattributeevent hsbe) { system.out.println( "in servletcontext added :name = " +hsbe.getname()); } public void attributeremoved(servletcontextattributeevent hsbe) { system.out.println( "in servletcontext removed :name = " +hsbe.getname()); } public void attributereplaced(servletcontextattributeevent hsbe) { system.out.println( "in servletcontext replaced :name = " +hsbe.getname()); } } |
httpsession,實現httpsessionattributelistener接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class myhttpsessionattrlistener implements httpsessionattributelistener{ public void attributeadded(httpsessionbindingevent hsbe) { system.out.println( "in httpsession added:name = " +hsbe.getname()); } public void attributeremoved(httpsessionbindingevent hsbe) { system.out.println( "in httpsession removed:name = " +hsbe.getname()); } public void attributereplaced(httpsessionbindingevent hsbe) { system.out.println( "in httpsession replaced:name = " +hsbe.getname()); } } |
servletrequest,實現servletrequestattributelistener接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class myservletrequestattrlistener implements servletrequestattributelistener{ public void attributeadded(servletrequestattributeevent hsbe) { system.out.println( "in servletrequest added :name = " +hsbe.getname()); } public void attributeremoved(servletrequestattributeevent hsbe) { system.out.println( "in servletrequest removed :name = " +hsbe.getname()); } public void attributereplaced(servletrequestattributeevent hsbe) { system.out.println( "in servletrequest replaced :name = " +hsbe.getname()); } } |
2.3 監聽對象的狀態:
針對某些pojo類,可以通過實現httpsessionbindinglistener接口,監聽pojo類對象的事件。例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class user implements httpsessionbindinglistener,serializable{ private string username; private string password; public string getusername() { return username; } public void setusername(string username) { this .username = username; } public string getpassword() { return password; } public void setpassword(string password) { this .password = password; } public void valuebound(httpsessionbindingevent hsbe) { system.out.println( "valuebound name: " +hsbe.getname()); } public void valueunbound(httpsessionbindingevent hsbe) { system.out.println( "valueunbound name: " +hsbe.getname()); } } |
session數據的鈍化與活化:
由于session中保存大量訪問網站相關的重要信息,因此過多的session數據就會服務器性能的下降,占用過多的內存。因此類似數據庫對象的持久化,web容器也會把不常使用的session數據持久化到本地文件或者數據中。這些都是有web容器自己完成,不需要用戶設定。
不用的session數據序列化到本地文件中的過程,就是鈍化;
當再次訪問需要到該session的內容時,就會讀取本地文件,再次放入內存中,這個過程就是活化。
類似的,只要實現httpseesionactivationlistener接口就是實現鈍化與活化事件的監聽:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
public class user implements httpsessionbindinglistener, httpsessionactivationlistener,serializable{ private string username; private string password; public string getusername() { return username; } public void setusername(string username) { this .username = username; } public string getpassword() { return password; } public void setpassword(string password) { this .password = password; } public void valuebound(httpsessionbindingevent hsbe) { system.out.println( "valuebound name: " +hsbe.getname()); } public void valueunbound(httpsessionbindingevent hsbe) { system.out.println( "valueunbound name: " +hsbe.getname()); } public void sessiondidactivate(httpsessionevent hsbe) { system.out.println( "sessiondidactivate name: " +hsbe.getsource()); } public void sessionwillpassivate(httpsessionevent hsbe) { system.out.println( "sessionwillpassivate name: " +hsbe.getsource()); } } |
servlet版本與tomcat版本
首先看一下tomcat官網給出的匹配:
如果版本不匹配,那么tomcat是不能發布該工程的,首先看一下版本不匹配時,會發生什么!
我試圖創建一個web工程,并且選取了servlet3.0版本:
然后我想要在tomcat6中發布,可以看到報錯了!
jdk版本不對....這是在平時開發如果對servlet不熟悉的web新手,常犯的錯誤。
解決方法:
1 在創建時,直接發布到tomcat容器中,此時servlet僅僅會列出tomcat支持的版本:
2 修改工程servlet版本配置信息,文件為:工作目錄\sessionexample\.settings\org.eclipse.wst.common.project.facet.core.xml
1
2
3
4
5
6
7
8
9
10
|
<?xml version= "1.0" encoding= "utf-8" ?> <faceted-project> <runtime name= "apache tomcat v6.0" /> <fixed facet= "java" /> <fixed facet= "wst.jsdt.web" /> <fixed facet= "jst.web" /> <installed facet= "java" version= "1.7" /> <installed facet= "jst.web" version= "2.5" /> <installed facet= "wst.jsdt.web" version= "1.0" /> </faceted-project> |
getattribute與getparameter的區別
這部分是對jsp的擴展,經常在jsp或者servlet中獲取數據,那么getattribute與getparameter有什么區別呢?
1 從獲取到數據的來源來說:
getattribtue獲取到的是web容器中的值,比如:
我們在servlet中通過setattribute設定某個值,這個值存在于容器中,就可以通過getattribute方法獲取;
getparameter獲取到的是通過http傳來的值,比如這樣一個http請求:
http:localhost:8080/test/test.html?username=xingoo
還有其他的get和post方式,都可以通過getparameter來獲取。
2 從獲取到的數據類型來說:
getattribute返回的是一個對象,object。
getparameter返回的是,前面頁面中某個表單或者http后面參數傳遞的值,是個字符串。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/w-wfy/p/6425357.html