一个有关servlet的疑惑

wanghao1987 2009-03-07 08:52:02
是不是一定要有用户去发起请求servlet才会有所动作?servlet可不可以每隔一段时间自动做些事情,比如自动检测一下在线用户?如果servlet不能完成该功能,那什么可以完成?谢谢,在线等待……
...全文
160 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fujilin 2009-03-07
  • 打赏
  • 举报
回复
用HttpSession监听器可以实现:




package webbook.chapter14;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class CounterListener implements HttpSessionListener {
private static long onlineNumber = 0;

public static long getOnlineNumber() {
return onlineNumber;
}

public void sessionCreated(HttpSessionEvent se) {
onlineNumber++;
}

public void sessionDestroyed(HttpSessionEvent se) {
onlineNumber--;
}
}




web.xml
<listener>
<listener-class>
webbook.chapter14.CounterListener
</listener-class>
</listener>


display.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="webbook.chapter14.CounterListener"%>
<html>
<head>
<title>display online number</title>
</head>
<body>
当前应用中一共有<%=CounterListener.getOnlineNumber()%>人在线<br>
</body>
</html>
taiyuankejikill 2009-03-07
  • 打赏
  • 举报
回复
定时向客户端附送数据,客户端应该用什么响应,applet可以吗?
还是javascript。。。。
guozhen314 2009-03-07
  • 打赏
  • 举报
回复
我也正需要这个解决方法 高手快解啊
jabeginner 2009-03-07
  • 打赏
  • 举报
回复
可以自己配置一个timer,一下是我用到的一个实
首先在web.xml文件添加一个servlet配置:

<servlet>
<servlet-name>GoThread</servlet-name>
<servlet-class>com.jin.game.GoThread</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

public class GoThread extends HttpServlet {

private static final long serialVersionUID = -2631567695086851653L;

public void init() {
try{
Timer timer = new Timer(true);
timer.schedule(new Task()/*这个就是你想一直让他执行的方法*/,0,30000);
}catch(Exception e){
System.out.print(e.getMessage()+"\n");
}

}

public void destroy() {
ConvertUtils.deregister();
}

}


fujilin 2009-03-07
  • 打赏
  • 举报
回复
是不是一定要有用户去发起请求servlet才会有所动作? 不是的, 请求也可以是JSP和html

servlet可不可以每隔一段时间自动做些事情,比如自动检测一下在线用户?用HttpSession监听器可以实现
langzhiwang888 2009-03-07
  • 打赏
  • 举报
回复
不是很明白,。。。。
axman 2009-03-07
  • 打赏
  • 举报
回复
正确的做法应该是ServletContextListener.
load-on-startup是2.4之前没有ServletContextListener接口的临时解决方法。

起到的作用和ServletContextListeners相同。但是
load-on-startup和ServletContextListeners有一个区别就是
load-on-startup除了在容器启动时运行,还有可能被客户端请求,也就是可能被多实例化。

而ServletContextListener只有在WEB容器启动时运行,外部无法访问,可以得到较好的控制。
当然这要看你具体要求。比如你想在启动时用它清一次内存,然后在运行后也可以通过网页访问来控制清内存。
访问一次清一下,那就用普通的Servlet同时配置成load-on-startup。

如果你的所有工作都在启动时完成,以后不能从外部控制,应该用ServletContextListener这个优雅的接口
niuyongzljtoo 2009-03-07
  • 打赏
  • 举报
回复
2楼的方法是对的
<servlet>
<servlet-name>GoThread</servlet-name>
<servlet-class>com.jin.game.GoThread</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>




Java codepublic class GoThread extends HttpServlet {

private static final long serialVersionUID = -2631567695086851653L;
public static HashMap hm = new HashMap();//此处用静态变量存储Session

public void init() {
try{
Timer timer = new Timer(true);
timer.schedule(new Task()/*这个就是你想一直让他执行的方法*/,0,30000);
}catch(Exception e){
System.out.print(e.getMessage()+"\n");
}

}

public void destroy() {
ConvertUtils.deregister();
}

}


...........
Task implements Runable{
run(){
///
do {
//你希望做的事情,如:扫描hm
}
sleep(5*1000);//休眠5秒

}

}
............

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧