激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - Java教程 - 淺談java監聽器的作用

淺談java監聽器的作用

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

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

監聽器java web開發中很重要的內容,其中涉及到的知識,可以參考下面導圖:

淺談java監聽器的作用

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>

當我使用我的瀏覽器訪問時,執行結果如下:

淺談java監聽器的作用

當打開另一個瀏覽器訪問時:

淺談java監聽器的作用

由于打開另一個瀏覽器訪問,相當于另一個會話,因此在線人數會增加。

對于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官網給出的匹配:

淺談java監聽器的作用

如果版本不匹配,那么tomcat是不能發布該工程的,首先看一下版本不匹配時,會發生什么!

我試圖創建一個web工程,并且選取了servlet3.0版本:

淺談java監聽器的作用

然后我想要在tomcat6中發布,可以看到報錯了!

jdk版本不對....這是在平時開發如果對servlet不熟悉的web新手,常犯的錯誤。

淺談java監聽器的作用

解決方法:

1 在創建時,直接發布到tomcat容器中,此時servlet僅僅會列出tomcat支持的版本:

淺談java監聽器的作用

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.91sese| h视频免费看 | 国产超碰人人爽人人做人人爱 | 欧美视频一区二区三区四区 | 大尺度福利视频 | 免费视频xxxx| 成人在线观看一区二区三区 | 成人综合在线观看 | 91高清完整版在线观看 | 青草伊人网 | 欧美一级精品片在线看 | 韩国一大片a毛片 | 香蕉久草视频 | 91看片在线看| 日本黄色大片免费观看 | 欧美性黄 | 男男羞羞视频网站国产 | 国产亚洲精品综合一区91 | 毛片韩国 | 亚洲欧美日韩一区二区三区在线观看 | 97干在线 | 国产午夜精品视频免费不卡69堂 | 少妇色诱麻豆色哟哟 | 日韩精品一区二区在线 | 精品人伦一区二区三区蜜桃网站 | 激情小说区 | 在线视频国产一区 | 黄色一级电影网 | va视频在线观看 | 久久精品中文 | 91精品国产九九九久久久亚洲 | 91精品国产91久久久久久丝袜 | 九九视频久久 | 成人福利视频在 | www.99久久久 | 久久精品探花 | 毛片在线免费播放 | 欧美国产免费 | 欧美精品国产综合久久 | 美女黄网站免费观看 | 性aaa|