我写了一个在线人数统计,如今出现两情状况
状况一:上线时必须手动刷新一次才会进行当前人数统计
状况二:下线时,只有关闭服务器里面的页面才会 -1,关闭IE,火狐,谷歌等浏览器都不会-1;以下是本人代码,请高手指教:web.xml//配置文件 <listener>
<listener-class>com.fx.Listener.listener</listener-class>
</listener>
... servlet配置代码省略 ...listener.java//监听器public class listener implements HttpSessionListener {
private static int count;
public void sessionCreated(HttpSessionEvent arg0) {
add();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
del();
}
public static void add(){
++ count; }
public static void del(){
-- count;
}
public static int getCount(){
return count;
}
}servlet.jsp //打开页面时调用的servlet----->doPost方法体 int count = listener.getCount();
req.getSession().setAttribute("num", count);
req.getRequestDispatcher("index.jsp").forward(req, resp);index.jsp//显示页面
<script type="text/javascript">
function window.onunload(){
if((window.screenLeft>=10000&&window.screenTop>=10000)||event.altKey){
form1.action="servlet2";
form1.submit();
}
}
</script>
<form name="form1">
当前在线人数为:${num }
</form>servlet2.jsp//关闭页面时调用的servlet----->doPost方法体 req.getSession().invalidate();
状况一:上线时必须手动刷新一次才会进行当前人数统计
状况二:下线时,只有关闭服务器里面的页面才会 -1,关闭IE,火狐,谷歌等浏览器都不会-1;以下是本人代码,请高手指教:web.xml//配置文件 <listener>
<listener-class>com.fx.Listener.listener</listener-class>
</listener>
... servlet配置代码省略 ...listener.java//监听器public class listener implements HttpSessionListener {
private static int count;
public void sessionCreated(HttpSessionEvent arg0) {
add();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
del();
}
public static void add(){
++ count; }
public static void del(){
-- count;
}
public static int getCount(){
return count;
}
}servlet.jsp //打开页面时调用的servlet----->doPost方法体 int count = listener.getCount();
req.getSession().setAttribute("num", count);
req.getRequestDispatcher("index.jsp").forward(req, resp);index.jsp//显示页面
<script type="text/javascript">
function window.onunload(){
if((window.screenLeft>=10000&&window.screenTop>=10000)||event.altKey){
form1.action="servlet2";
form1.submit();
}
}
</script>
<form name="form1">
当前在线人数为:${num }
</form>servlet2.jsp//关闭页面时调用的servlet----->doPost方法体 req.getSession().invalidate();
解决方案 »
- 报错:java.io.FileNotFoundException: ... /xwork-validator-1.0.3.dtd
- java 正则 提取内容
- 求JSP网上书店源码【80分】
- jsp urlwriter如何配置
- lazy(懒加载)到底什么意思?
- 如何用checkstyle检查 xml jsp sql ?
- 问一个new的问题...
- 菜鸟问题:怎样取出ResultSet里的记录数啊?
- 不改任何代码,实现jsp(非servlet)跨OS、跨应用服务器的移植(中文问题),能谈谈经验吗?
- 这里的给分是什么意思?
- web项目使用dwr服务器推技术,服务器的承受能力
- js怎么把值传给HTML呢?
int count = listener.getCount();
之前,先去访问下session,确保当前会话已经创建。
第二个问题呢,你需要脑补下会话的含义及其生命周期是啥。
关闭页面不代表会话结束(sessionDestroyed),会话结束只有两种情况:
1、代码中主动调用session.destory(); 这种一般用于 logout 页面;
2、会话超时,也就是用户在很长一段时间没有再次访问该应用,比如半小时,那么中间件会回收该会话。
我建议还是用javascript监听用户是否关闭浏览器进而用ajax去访问destory()方法
第一个肯定是创建了呀,要是没有创建,怎么会刷新后就统计人数呢第二个我在页面写了一个js代码的,如果页面关闭就会去servlet2这个servlet里面,这个里面调用强制销毁session,这样的思路应该是没有错的呀
我建议还是用javascript监听用户是否关闭浏览器进而用ajax去访问destory()方法赞同
* @see javax.servlet.http.HttpSessionListener#sessionCreated(javax.servlet.http.HttpSessionEvent)
*/
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
onlineUserCount ++;
toUpdateCount(httpSessionEvent);
} /* (non-Javadoc)
* @see javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.HttpSessionEvent)
*/
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
onlineUserCount --;
toUpdateCount(httpSessionEvent);
} private void toUpdateCount(HttpSessionEvent httpSessionEvent){
httpSessionEvent.getSession().setAttribute("onlineUserCount", onlineUserCount);
}