監(jiān)聽器是java web開發(fā)中很重要的內(nèi)容,其中涉及到的知識(shí),可以參考下面導(dǎo)圖:
web監(jiān)聽器
1 什么是web監(jiān)聽器?
web監(jiān)聽器是一種servlet中的特殊的類,它們能幫助開發(fā)者監(jiān)聽web中的特定事件,比如servletcontext,httpsession,servletrequest的創(chuàng)建和銷毀;變量的創(chuàng)建、銷毀和修改等。可以在某些動(dòng)作前后增加處理,實(shí)現(xiàn)監(jiān)控。
2 監(jiān)聽器常用的用途
- 通常使用web監(jiān)聽器做以下的內(nèi)容:
- 統(tǒng)計(jì)在線人數(shù),利用httpsessionlisener
- 加載初始化信息:利用servletcontextlistener
- 統(tǒng)計(jì)網(wǎng)站訪問量
- 實(shí)現(xiàn)訪問監(jiān)控
3 接下里看看一個(gè)監(jiān)聽器的創(chuàng)建以及執(zhí)行過程
首先需要?jiǎng)?chuàng)建一個(gè)監(jiān)聽器,實(shí)現(xiàn)某種接口,例如我想實(shí)現(xiàn)一個(gè)對(duì)在線人數(shù)的監(jiān)控,可以創(chuàng)建如下的監(jiān)聽器:
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中配置該監(jiān)聽器,在web-app中添加:
1
2
3
|
<listener> <listener- class >com.test.mylistener</listener- class > </listener> |
在jsp中添加訪問人數(shù):
1
2
3
|
<body> 在線人數(shù):<%=session.getattribute( "usernumber" ) %><br/> </body> |
當(dāng)我使用我的瀏覽器訪問時(shí),執(zhí)行結(jié)果如下:
當(dāng)打開另一個(gè)瀏覽器訪問時(shí):
由于打開另一個(gè)瀏覽器訪問,相當(dāng)于另一個(gè)會(huì)話,因此在線人數(shù)會(huì)增加。
對(duì)于3.0版本的servlet來說,還支持使用注解的方式進(jìn)行配置。
那么接下來看看都有哪些監(jiān)聽器以及方法吧!
監(jiān)聽器的分類
1 按照監(jiān)聽的對(duì)象劃分:
按照監(jiān)聽對(duì)象的不同可以劃分為三種:
servletcontext監(jiān)控:對(duì)應(yīng)監(jiān)控application內(nèi)置對(duì)象的創(chuàng)建和銷毀。
當(dāng)web容器開啟時(shí),執(zhí)行contextinitialized方法;當(dāng)容器關(guān)閉或重啟時(shí),執(zhí)行contextdestroyed方法。
實(shí)現(xiàn)方式:直接實(shí)現(xiàn)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監(jiān)控:對(duì)應(yīng)監(jiān)控session內(nèi)置對(duì)象的創(chuàng)建和銷毀。
當(dāng)打開一個(gè)新的頁面時(shí),開啟一個(gè)session會(huì)話,執(zhí)行sessioncreated方法;當(dāng)頁面關(guān)閉session過期時(shí),或者容器關(guān)閉銷毀時(shí),執(zhí)行sessiondestroyed方法。
實(shí)現(xiàn)方式:直接實(shí)現(xiàn)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監(jiān)控:對(duì)應(yīng)監(jiān)控request內(nèi)置對(duì)象的創(chuàng)建和銷毀。
當(dāng)訪問某個(gè)頁面時(shí),出發(fā)一個(gè)request請(qǐng)求,執(zhí)行requestinitialized方法;當(dāng)頁面關(guān)閉時(shí),執(zhí)行requestdestroyed方法。
實(shí)現(xiàn)方式,直接實(shí)現(xiàn)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 按照監(jiān)聽事件劃分:
2.1 監(jiān)聽事件自身的創(chuàng)建和銷毀:同上面的按對(duì)象劃分。
2.2 監(jiān)聽屬性的新增、刪除和修改:
監(jiān)聽屬性的新增、刪除和修改也是劃分成三種,分別針對(duì)于servletcontext、httpsession、servletrequest對(duì)象:
servletcontext,實(shí)現(xiàn)servletcontextattributelistener接口:
通過調(diào)用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,實(shí)現(xiàn)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,實(shí)現(xiàn)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 監(jiān)聽對(duì)象的狀態(tài):
針對(duì)某些pojo類,可以通過實(shí)現(xiàn)httpsessionbindinglistener接口,監(jiān)聽pojo類對(duì)象的事件。例如:
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數(shù)據(jù)的鈍化與活化:
由于session中保存大量訪問網(wǎng)站相關(guān)的重要信息,因此過多的session數(shù)據(jù)就會(huì)服務(wù)器性能的下降,占用過多的內(nèi)存。因此類似數(shù)據(jù)庫對(duì)象的持久化,web容器也會(huì)把不常使用的session數(shù)據(jù)持久化到本地文件或者數(shù)據(jù)中。這些都是有web容器自己完成,不需要用戶設(shè)定。
不用的session數(shù)據(jù)序列化到本地文件中的過程,就是鈍化;
當(dāng)再次訪問需要到該session的內(nèi)容時(shí),就會(huì)讀取本地文件,再次放入內(nèi)存中,這個(gè)過程就是活化。
類似的,只要實(shí)現(xiàn)httpseesionactivationlistener接口就是實(shí)現(xiàn)鈍化與活化事件的監(jiān)聽:
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官網(wǎng)給出的匹配:
如果版本不匹配,那么tomcat是不能發(fā)布該工程的,首先看一下版本不匹配時(shí),會(huì)發(fā)生什么!
我試圖創(chuàng)建一個(gè)web工程,并且選取了servlet3.0版本:
然后我想要在tomcat6中發(fā)布,可以看到報(bào)錯(cuò)了!
jdk版本不對(duì)....這是在平時(shí)開發(fā)如果對(duì)servlet不熟悉的web新手,常犯的錯(cuò)誤。
解決方法:
1 在創(chuàng)建時(shí),直接發(fā)布到tomcat容器中,此時(shí)servlet僅僅會(huì)列出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的區(qū)別
這部分是對(duì)jsp的擴(kuò)展,經(jīng)常在jsp或者servlet中獲取數(shù)據(jù),那么getattribute與getparameter有什么區(qū)別呢?
1 從獲取到數(shù)據(jù)的來源來說:
getattribtue獲取到的是web容器中的值,比如:
我們?cè)趕ervlet中通過setattribute設(shè)定某個(gè)值,這個(gè)值存在于容器中,就可以通過getattribute方法獲取;
getparameter獲取到的是通過http傳來的值,比如這樣一個(gè)http請(qǐng)求:
http:localhost:8080/test/test.html?username=xingoo
還有其他的get和post方式,都可以通過getparameter來獲取。
2 從獲取到的數(shù)據(jù)類型來說:
getattribute返回的是一個(gè)對(duì)象,object。
getparameter返回的是,前面頁面中某個(gè)表單或者h(yuǎn)ttp后面參數(shù)傳遞的值,是個(gè)字符串。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/w-wfy/p/6425357.html