天天看點

利用Servlet監聽器統計線上人數

 監聽器的作用是監聽web容器的有效事件,它由Servlet空器管理,利用Listener接口監聽某個執行程式,并根據該程式的需求做出适應的響應。下面介紹一個應用Servlet監聽實作統計線上人數的執行個體。

整體結構:

步驟:

(1)建立UserInfoList.java類檔案,主要用來存儲線上使用者和對線上使用者進行具體操作:

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

<code>package</code> <code>com.lixiyu;</code>

<code>import</code> <code>java.util.Vector;</code>

<code>public</code> <code>class</code> <code>UserInfoList {</code>

<code>public</code> <code>static</code> <code>UserInfoList user= </code><code>new</code> <code>UserInfoList();</code>

<code>@SuppressWarnings</code><code>(</code><code>"rawtypes"</code><code>)</code>

<code>private</code> <code>Vector vector=</code><code>null</code><code>;</code>

<code>/*利用private調用構造函數,</code>

<code> </code><code>* 防止被外界産生新的instance對象</code>

<code> </code><code>*/</code>

<code>public</code> <code>UserInfoList(){</code>

<code>    </code><code>this</code><code>.vector=</code><code>new</code> <code>Vector();</code>

<code>}</code>

<code>//外界使用的instance對象</code>

<code>public</code> <code>static</code> <code>UserInfoList getInstance(){</code>

<code>    </code><code>return</code> <code>user;</code>

<code>//增加使用者</code>

<code>@SuppressWarnings</code><code>(</code><code>"unchecked"</code><code>)</code>

<code>public</code> <code>boolean</code> <code>addUserInfo(String user){</code>

<code>    </code><code>if</code><code>(user!=</code><code>null</code><code>){</code>

<code>        </code><code>this</code><code>.vector.add(user);</code>

<code>        </code><code>return</code> <code>true</code><code>;</code>

<code>    </code><code>}</code><code>else</code><code>{</code>

<code>        </code><code>return</code> <code>false</code><code>;</code>

<code>    </code><code>}</code>

<code>//擷取使用者清單</code>

<code>public</code> <code>Vector getList(){</code>

<code>    </code><code>return</code> <code>vector;</code>

<code>//移除使用者</code>

<code>public</code> <code>void</code> <code>removeUserInfo(String user){</code>

<code>        </code><code>vector.removeElement(user);</code>

(2)建立UserInfoTrace.java類檔案,主要實作valueBound(HttpSessionBindingEvent arg0)和valueUnbound(HttpSessionBindingEven arg0)兩個方法。當有對象加入session時,valueBound()方法會被自動執行;當有對象從session中移除時,valueUnbound()方法會被自動執行,在valueBound()和valueUnbound()方法中都加入了輸出資訊的功能,可使使用者在控制台更清楚地了解執行過程。

<a href="http://s3.51cto.com/wyfs02/M02/11/A4/wKioL1LXoy6TIImfAACrYfVNko4108.jpg" target="_blank"></a>

代碼:

<code>import</code> <code>javax.servlet.http.HttpSessionBindingEvent;</code>

<code>public</code> <code>class</code> <code>UserInfoTrace </code><code>implements</code> <code>javax.servlet.http.HttpSessionBindingListener{</code>

<code>private</code> <code>String user;</code>

<code>private</code> <code>UserInfoList container=UserInfoList.getInstance();</code>

<code>public</code> <code>UserInfoTrace(){</code>

<code>    </code><code>user=</code><code>""</code><code>;</code>

<code>//設定線上監聽人員</code>

<code>public</code> <code>void</code> <code>setUser(String user){</code>

<code>    </code><code>this</code><code>.user=user;</code>

<code>//擷取線上監聽</code>

<code>public</code> <code>String getUser(){</code>

<code>    </code><code>return</code> <code>this</code><code>.user;</code>

<code>@Override</code>

<code>public</code> <code>void</code> <code>valueBound(HttpSessionBindingEvent arg0) {</code>

<code>    </code><code>// TODO Auto-generated method stub</code>

<code>    </code><code>System.out.println(</code><code>"上線"</code><code>+</code><code>this</code><code>.user);</code>

<code>public</code> <code>void</code> <code>valueUnbound(HttpSessionBindingEvent arg0) {</code>

<code>    </code><code>System.out.println(</code><code>"下線"</code><code>+</code><code>this</code><code>.user);</code>

<code>    </code><code>if</code><code>(user!=</code><code>""</code><code>){</code>

<code>        </code><code>container.removeUserInfo(user);</code>

(3)建立showUser.jsp頁面檔案,在頁面中設定session的setMaxInactiveInterval()為10秒,這樣可以縮session的生命周期:

40

41

42

<code>&lt;%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*" errorPage="" %&gt;</code>

<code>&lt;%@ page import="java.util.*"%&gt;</code>

<code>&lt;%@ page import="com.lixiyu.*"%&gt;</code>

<code>&lt;</code><code>html</code><code>&gt;</code>

<code>&lt;</code><code>head</code><code>&gt;</code>

<code>&lt;</code><code>meta</code> <code>http-equiv</code><code>=</code><code>"Content-Type"</code> <code>content</code><code>=</code><code>"text/html; charset=UTF-8"</code><code>&gt;</code>

<code>&lt;</code><code>title</code><code>&gt;使用監聽檢視線上使用者&lt;/</code><code>title</code><code>&gt;</code>

<code>&lt;</code><code>link</code> <code>href</code><code>=</code><code>"css/style.css"</code> <code>rel</code><code>=</code><code>"stylesheet"</code> <code>type</code><code>=</code><code>"text/css"</code><code>&gt;</code>

<code>&lt;/</code><code>head</code><code>&gt;</code>

<code>&lt;%</code>

<code>UserInfoList list=UserInfoList.getInstance();</code>

<code>UserInfoTrace ut=new UserInfoTrace();</code>

<code>String name=request.getParameter("user");</code>

<code>ut.setUser(name);</code>

<code>session.setAttribute("list",ut);</code>

<code>list.addUserInfo(ut.getUser());</code>

<code>session.setMaxInactiveInterval(10);</code>

<code>%&gt;</code>

<code>&lt;</code><code>body</code><code>&gt;</code>

<code>&lt;</code><code>div</code> <code>align</code><code>=</code><code>"center"</code><code>&gt;</code>

<code>&lt;</code><code>table</code> <code>width</code><code>=</code><code>"506"</code> <code>height</code><code>=</code><code>"230"</code> <code>border</code><code>=</code><code>"0"</code> <code>cellpadding</code><code>=</code><code>"0"</code> <code>cellspacing</code><code>=</code><code>"0"</code> <code>background</code><code>=</code><code>"image/background2.jpg"</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>tr</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>td</code> <code>align</code><code>=</code><code>"center"</code><code>&gt;&lt;</code><code>br</code><code>&gt;&lt;</code><code>br</code><code>&gt;</code>

<code>                                                                                                                      </code> 

<code> </code><code>&lt;</code><code>textarea</code> <code>rows</code><code>=</code><code>"8"</code> <code>cols</code><code>=</code><code>"20"</code><code>&gt;</code>

<code>Vector vector=list.getList();</code>

<code>if(vector!=null&amp;&amp;vector.size()&gt;0){</code>

<code>for(int i=0;i&lt;</code><code>vector.size</code><code>();i++){</code>

<code>  </code><code>out.println(vector.elementAt(i));</code>

<code>&lt;/</code><code>textarea</code><code>&gt;&lt;</code><code>br</code><code>&gt;&lt;</code><code>br</code><code>&gt;</code>

<code> </code><code>&lt;</code><code>a</code> <code>href</code><code>=</code><code>"loginOut.jsp"</code><code>&gt;傳回&lt;/</code><code>a</code><code>&gt;</code>

<code> </code><code>&lt;/</code><code>td</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>tr</code><code>&gt;</code>

<code>&lt;/</code><code>table</code><code>&gt;</code>

<code>&lt;/</code><code>div</code><code>&gt;</code>

<code>&lt;/</code><code>body</code><code>&gt;</code>

<code>&lt;/</code><code>html</code><code>&gt;</code>

(4)編寫一個過濾器CharactorFilter確定不會亂碼,編寫MyContentListener實作監聽接口并配置web.xml檔案映射。

CharactorFilter

<code>import</code> <code>java.io.IOException;</code>

<code>import</code> <code>javax.servlet.Filter;</code>

<code>import</code> <code>javax.servlet.FilterChain;</code>

<code>import</code> <code>javax.servlet.FilterConfig;</code>

<code>import</code> <code>javax.servlet.ServletException;</code>

<code>import</code> <code>javax.servlet.ServletRequest;</code>

<code>import</code> <code>javax.servlet.ServletResponse;</code>

<code>// 字元編碼過濾器</code>

<code>public</code> <code>class</code> <code>CharactorFilter </code><code>implements</code> <code>Filter {</code>

<code>    </code><code>// 字元編碼</code>

<code>    </code><code>String encoding = </code><code>null</code><code>;</code>

<code>    </code><code>@Override</code>

<code>    </code><code>public</code> <code>void</code> <code>destroy() {</code>

<code>        </code><code>encoding = </code><code>null</code><code>;</code>

<code>    </code><code>public</code> <code>void</code> <code>doFilter(ServletRequest request, ServletResponse response,</code>

<code>            </code><code>FilterChain chain) </code><code>throws</code> <code>IOException, ServletException {</code>

<code>        </code><code>// 判斷字元編碼是否為空</code>

<code>        </code><code>if</code><code>(encoding != </code><code>null</code><code>){</code>

<code>            </code><code>// 設定request的編碼格式</code>

<code>            </code><code>request.setCharacterEncoding(encoding);</code>

<code>            </code><code>// 設定response字元編碼</code>

<code>            </code><code>response.setContentType(</code><code>"text/html; charset="</code><code>+encoding);</code>

<code>        </code><code>}</code>

<code>        </code><code>// 傳遞給下一過濾器</code>

<code>        </code><code>chain.doFilter(request, response);</code>

<code>    </code><code>public</code> <code>void</code> <code>init(FilterConfig filterConfig) </code><code>throws</code> <code>ServletException {</code>

<code>        </code><code>// 擷取初始化參數</code>

<code>        </code><code>encoding = filterConfig.getInitParameter(</code><code>"encoding"</code><code>);</code>

web.xml

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?&gt;</code>

<code>&lt;</code><code>web-app</code> <code>xmlns</code><code>=</code><code>"http://java.sun.com/xml/ns/j2ee"</code> <code>xmlns:xsi</code><code>=</code><code>"http://www.w3.org/2001/XMLSchema-instance"</code> <code>xsi:schemaLocation</code><code>=</code><code>"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</code> <code>version</code><code>=</code><code>"2.4"</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>display-name</code><code>&gt;web&lt;/</code><code>display-name</code><code>&gt;</code>

<code> </code><code>&lt;!-- 聲明過濾器 --&gt;</code>

<code>    </code><code>&lt;</code><code>filter</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 過濾器名稱 --&gt;</code>

<code>        </code><code>&lt;</code><code>filter-name</code><code>&gt;CharactorFilter&lt;/</code><code>filter-name</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 過濾器的完整類名 --&gt;</code>

<code>        </code><code>&lt;</code><code>filter-class</code><code>&gt;com.lixiyu.CharactorFilter&lt;/</code><code>filter-class</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 初始化參數 --&gt;</code>

<code>        </code><code>&lt;</code><code>init-param</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 參數名 --&gt;</code>

<code>            </code><code>&lt;</code><code>param-name</code><code>&gt;encoding&lt;/</code><code>param-name</code><code>&gt;</code>

<code>            </code><code>&lt;!-- 參數值 --&gt;</code>

<code>            </code><code>&lt;</code><code>param-value</code><code>&gt;UTF-8&lt;/</code><code>param-value</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>init-param</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>filter</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 過濾器映射 --&gt;</code>

<code>    </code><code>&lt;</code><code>filter-mapping</code><code>&gt;</code>

<code>        </code><code>&lt;!-- URL映射 --&gt;</code>

<code>        </code><code>&lt;</code><code>url-pattern</code><code>&gt;/*&lt;/</code><code>url-pattern</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>filter-mapping</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>servlet</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>description</code><code>&gt;Added by JBuilder to compile JSPs with debug info&lt;/</code><code>description</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>servlet-name</code><code>&gt;debugjsp&lt;/</code><code>servlet-name</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>servlet-class</code><code>&gt;org.apache.jasper.servlet.JspServlet&lt;/</code><code>servlet-class</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>init-param</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>param-name</code><code>&gt;classdebuginfo&lt;/</code><code>param-name</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>param-value</code><code>&gt;true&lt;/</code><code>param-value</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>init-param</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>load-on-startup</code><code>&gt;3&lt;/</code><code>load-on-startup</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>servlet</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>servlet-mapping</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>url-pattern</code><code>&gt;*.jsp&lt;/</code><code>url-pattern</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>servlet-mapping</code><code>&gt;</code>

<code>&lt;</code><code>listener</code><code>&gt;</code>

<code>     </code><code>&lt;</code><code>listener-class</code><code>&gt;com.lixiyu.MyContentListener&lt;/</code><code>listener-class</code><code>&gt;</code>

<code>&lt;/</code><code>listener</code><code>&gt;</code>

<code>&lt;/</code><code>web-app</code><code>&gt;</code>

(5)編寫登陸頁index.jsp和登出頁loginOut.jsp

index.jsp

<code>&lt;%@ page contentType=</code><code>"text/html; charset=UTF-8"</code> <code>language=</code><code>"java"</code> <code>import</code><code>=</code><code>"java.sql.*"</code> <code>errorPage=</code><code>""</code> <code>%&gt;</code>

<code>&lt;html&gt;</code>

<code>&lt;head&gt;</code>

<code>&lt;meta http-equiv=</code><code>"Content-Type"</code> <code>content=</code><code>"text/html; charset=UTF-8"</code><code>&gt;</code>

<code>&lt;title&gt;使用監聽檢視線上使用者&lt;/title&gt;</code>

<code>&lt;/head&gt;</code>

<code>&lt;script language=</code><code>"javascript"</code><code>&gt;</code>

<code>function</code> <code>checkEmpty(form){</code>

<code>for</code><code>(i=</code><code>0</code><code>;i&lt;form.length;i++){</code>

<code>if</code><code>(form.elements[i].value==</code><code>""</code><code>){</code>

<code>alert(</code><code>"表單資訊不能為空"</code><code>);</code>

<code>return</code> <code>false</code><code>;</code>

<code>&lt;/script&gt;</code>

<code>&lt;link href=</code><code>"css/style.css"</code> <code>rel=</code><code>"stylesheet"</code> <code>type=</code><code>"text/css"</code><code>&gt;</code>

<code>&lt;body&gt;</code>

<code>&lt;div align=</code><code>"center"</code><code>&gt;</code>

<code>  </code><code>&lt;table width=</code><code>"506"</code> <code>height=</code><code>"170"</code> <code>border=</code><code>"0"</code> <code>cellpadding=</code><code>"0"</code> <code>cellspacing=</code><code>"0"</code> <code>background=</code><code>"image/background1.jpg"</code><code>&gt;</code>

<code>    </code><code>&lt;tr&gt;</code>

<code>      </code><code>&lt;td align=</code><code>"center"</code><code>&gt;</code>

<code>        </code><code>&lt;form name=</code><code>"form"</code> <code>method=</code><code>"post"</code> <code>action=</code><code>"showUser.jsp"</code> <code>onSubmit=</code><code>"return checkEmpty(form)"</code><code>&gt;</code>

<code>    </code><code>&lt;input type=</code><code>"text"</code> <code>name=</code><code>"user"</code><code>&gt;&lt;br&gt;&lt;br&gt;</code>

<code>    </code><code>&lt;input type=</code><code>"submit"</code> <code>name=</code><code>"Submit"</code> <code>value=</code><code>"登入"</code><code>&gt;</code>

<code>  </code><code>&lt;/form&gt;</code>

<code>                                                                                                     </code> 

<code>      </code><code>&lt;/td&gt;</code>

<code>    </code><code>&lt;/tr&gt;</code>

<code>  </code><code>&lt;/table&gt;</code>

<code>&lt;/div&gt;</code>

<code>&lt;/body&gt;</code>

<code>&lt;/html&gt;</code>

loginOut.jsp

<code>&lt;%@ page contentType=</code><code>"text/html; charset=UTF-8"</code> <code>language=</code><code>"java"</code> <code>errorPage=</code><code>""</code> <code>%&gt;</code>

<code>         </code><code>session.invalidate();</code>

<code> </code><code>out.println(</code><code>"&lt;script&gt;parent.location.href='index.jsp';&lt;/script&gt;"</code><code>);</code>

最後運作本執行個體,結果如圖所示:

當輸入為空會提示:

<a href="http://s3.51cto.com/wyfs02/M02/11/A5/wKiom1LXph-yi9vaAACYvB2KZzg016.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/11/A4/wKioL1LXphLzwHu1AABhACqTggo133.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/11/A5/wKiom1LXph_DrxMkAAB8aoZCqgc314.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/11/A4/wKioL1LXplKD_nboAACrYfVNko4716.jpg" target="_blank"></a>

本文轉自lixiyu 51CTO部落格,原文連結:http://blog.51cto.com/lixiyu/1352316,如需轉載請自行聯系原作者