一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 淺談java監(jiān)聽器的作用

淺談java監(jiān)聽器的作用

2020-12-28 09:34wwfy Java教程

這篇文章主要介紹了淺談java監(jiān)聽器的作用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

監(jiān)聽器java web開發(fā)中很重要的內(nèi)容,其中涉及到的知識(shí),可以參考下面導(dǎo)圖:

淺談java監(jiān)聽器的作用

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é)果如下:

淺談java監(jiān)聽器的作用

當(dāng)打開另一個(gè)瀏覽器訪問時(shí):

淺談java監(jiān)聽器的作用

由于打開另一個(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)給出的匹配:

淺談java監(jiān)聽器的作用

如果版本不匹配,那么tomcat是不能發(fā)布該工程的,首先看一下版本不匹配時(shí),會(huì)發(fā)生什么!

我試圖創(chuàng)建一個(gè)web工程,并且選取了servlet3.0版本:

淺談java監(jiān)聽器的作用

然后我想要在tomcat6中發(fā)布,可以看到報(bào)錯(cuò)了!

jdk版本不對(duì)....這是在平時(shí)開發(fā)如果對(duì)servlet不熟悉的web新手,常犯的錯(cuò)誤。

淺談java監(jiān)聽器的作用

解決方法:

1 在創(chuàng)建時(shí),直接發(fā)布到tomcat容器中,此時(shí)servlet僅僅會(huì)列出tomcat支持的版本:

淺談java監(jiān)聽器的作用

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 岛国虐乳紧缚媚药调教 | 紧缚束缚调教丨vk | 国产3344视频在线观看免费 | 久久久久久免费观看 | 女人用粗大自熨喷水在线视频 | 日韩高清在线高清免费 | 男同gay玩奴男同玩奴 | 操尼姑| 亚洲国产成人在人网站天堂 | 欧美精品日韩 | 国产欧美日韩在线播放 | 手机在线免费观看日本推理片 | 国产裸舞福利资源在线视频 | 性欧美高清理论片 | 国产免费专区 | 波多在线| 精品午夜寂寞影院在线观看 | meyd–456佐山爱在线播放 | 高清国语自产拍免费视频国产 | 免费看黄色片网站 | 图片专区小说专区卡通动漫 | 日韩欧美天堂 | 色多多绿巨人视频 | 成人aqq | 久久国产精品无码视欧美 | 亚洲欧美成人综合 | 麻豆在线传煤 | 美女脱了内裤打开腿让你桶爽 | 91免费精品国自产拍在线可以看 | 7777奇米影视| 国产精品久久久久不卡绿巨人 | 天天天做天天天天爱天天想 | 亚洲天堂在线视频观看 | 晓雪老师我要进你里面好爽 | 大好硬好深好爽想要视频 | 免费精品一区二区三区在线观看 | 嫩草影院久久99 | 精品久久久久久无码人妻国产馆 | 久草草在线视视频 | 日本亚洲欧洲高清有码在线播放 | 2022国产麻豆剧传媒古装 |