//SessionCounter.java\ozdvw
package SessionCount;e?
import javax.servlet.*; L9k0
import javax.servlet.http.*; plT
import java.io.*; w;
import java.util.*; JC;@
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 @b!Q5
public class SessionCounter extends HttpServlet ?implements HttpSessionListener { 2#
private static final String CONTENT_TYPE = "text/html; charset=GBK"; bd35
private static int activeSessions = 1; xZi"Yx
//Initialize global variables +iRX;1
public void init() throws ServletException { n3
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 {Ytdk
} ?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 ri04&
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 C
//Process the HTTP Get request @8Ob%
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { zH
? response.setContentType(CONTENT_TYPE); EPjJ
? HttpSession session=request.getSession(); ]g
} ?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 )9lR?P
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 !S
//Clean up resources UxUNe
public void destroy() { :=e2NM
} ?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 W'F
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 aHW&x9
public void sessionCreated(HttpSessionEvent httpSessionEvent) { HH
? activeSessions++; DyZpv
} ?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 4WJ
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 8)#.
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { \s,_t
? activeSessions--; *z
? System.out.println("test test");$s0T@W
// ?System.out.println("---111"); ZF+
} ?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 MX
public static int getActiveSessions() { tQ
?return activeSessions; )a4
} ?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 y%s
} ?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 n-=u*
////$E
////1^[
//count.jsp?
<%@ page import="SessionCount.SessionCounter"%> r-cXS
<%@ page language="java" ?contentType="text/html; charset=gb2312"{Z
? ?pageEncoding="gb2312"%>~|Q"eP
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">, l
<html>z>
<head>&5)~
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">%G*M?
<title>Insert title here</title>ij7z
</head>$i:
<script language="javascript" type="text/javascript">?.k
<!--#*>}
function MM_callJS(jsStr) { //v2.0mnu)IK
?return eval(jsStr)-A
}?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 ]M\-
//-->#}q
</script>rs(
<script language="javascript">Ax%Qs3
function removeline(){Q \@
if(event.clientX<0&&event.clientY<0).45
{?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 y!Rw%u
document.write('<iframe width="100" height="100" src="remove.jsp"></iframe><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 ?id=WebBrowser width=0></OBJECT>');Dgo!x
document.all.WebBrowser.ExecWB(45,1);[
}?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 ad6+
}?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 1`maF
</script>0.
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 9
<body onUnload="MM_callJS('removeline()')">I=QwN
在線:<%= SessionCounter.getActiveSessions() %> Abd\
</body>.
</html>YZmy
////////////////////////////////6K6(k
///////////////////////////////HoW?y
remove.jspZ{>=
/////?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 ]|65(
<%@ page language="java" contentType="text/html; charset=gb2312"!
? ?pageEncoding="gb2312"%>4"cD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">|r<G
<html>8
<head>m.
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">$#9
<title>Insert title here</title>H/hoe0
</head>z_g_
<body>?=9
<%session.invalidate();%>i
</body>-r
</html>Lw;7{.
///////////////////////////}PiE
/////////////////////////////[
web.htmlP&
^^^^^^^^^^^^加上Bz2J
<listener> y+
? <listener-class>SessionCount.SessionCounter</listener-class> q1d{
</listener> h1
if(event.clientX<0&&event.clientY<0)判斷瀏覽器是關閉還是刷新 ,因為刷新也會調(diào)用onunload&&
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 c07F
document.all.WebBrowser.ExecWB(45,1);是無提示的關閉瀏覽器!Q!*pf
classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 |0gLI
這個是調(diào)用不彈出對話框的方法,實際是調(diào)用系統(tǒng)的方法如下 ]9M
document.all.WebBrowser.ExecWB(45,1); f:
因為在javascript當中不能調(diào)用java方法,所以選擇另外寫一個jsp文件用于調(diào)用,;?(5yi
invalidate()方法,(?A|`K
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 xv
現(xiàn)在這個結果是正確的,因為我把private static int activeSessions = 1; //這里改成了1,本來照理應該設為0的,可以我運行第一次http://localhost:8080/servlet/count.jsp的時候得到的是0,所以我才把它改成1的,dKOp0
那們老師或同學知道的話,麻煩告訴怎么為事,為什么在第一次創(chuàng)建session時不能觸發(fā)事件sessionCreated()Rw
現(xiàn)在這個結果是正確的,因為我把private static int activeSessions = 1; //這里改成了1,本來照理應該設為0的,可以我運行第一次http://localhost:8080/servlet/count.jsp的時候得到的是0,所以我才把它改成1的, h(
,為什么在第一次創(chuàng)建session時不能觸發(fā)事件sessionCreated()g?
session是個雙向機制,第一次訪問的時候,是從客戶端發(fā)起的,瀏覽器不知道這個網(wǎng)頁是否需要session,所以瀏覽器不會創(chuàng)建sessionId,當這個請求到達服務器的時候,沒有sessionId,d}--5
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 r0_/S
SessionCounter 是被嵌在jsp里的,所以第一次顯示的時候,得到jsp頁面的session創(chuàng)建是在jsp頁面滯后,也就是說SessionCounter是滯后于jsp頁面的.xKTZrv
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 V@)
順便說一句,extends HttpServlet 是多余的。]&
在頁面里頁設置一個退出按鈕.調(diào)用quit.jsp=
它的內(nèi)容是:h>
我們用一個quit.jsp來處理用戶退出系統(tǒng)的操作,quit.jsp負責注銷session,及時釋放資源。>D6T
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 uj&B
·注銷session。Z5K&
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 ##
·關閉瀏覽器窗口。@Q(
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 TP^wA
其代碼如下所示:"
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 IWeVHc
1. <%@ page contentType="text/html; charset=GBK" %>z
2. <%E
3. session.invalidate();F"[}H
4. %>A
5. <script language="javascript" >4_
6. window.opener = null;`ngL
7. window.close();M|j%
8. </script> OnZH?
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 3-L-
其中第3行負責注銷session,原先放入session的對象將解綁定,等待垃圾回收以釋放資源。對于本例而言,session中有一個名為ses_userBean的userBean對象(它是在switch.jsp中放入session的),調(diào)用session.invalidate()后,userBean從session中解綁定,它的valueUnbound()方法會被觸發(fā)調(diào)用,然后再等待垃圾回收。A/cr
?達內(nèi)科技論壇 -- 達內(nèi)科技論壇 +Nb
第5~8行是一段javascript腳本程序,負責關閉窗口,如果網(wǎng)頁不是通過腳本程序打開的(window.open()),調(diào)用window.close()腳本關閉窗口前,必須先將window.opener對象置為null,如第6行所示,否則瀏覽器會彈出一個確定關閉的對話框,筆者發(fā)現(xiàn)這個問題困擾了不少的Web程序員,故特別指出。s `|*)