----------------------
ASP.Net+Unity开发、
.Net培训、期待与您交流! ----------------------
另外可以通过HttpSessionListener这个接口,做一个类似论坛的在线人数的统计。另外,由与session的生命周期是从创建时就开始,到session不被调用,或者浏览器关闭后,服务器仍会替保存session三十分钟,这个三十分钟是可以配置的。所以即使论坛上一些人已经离开,又因为服务器会保存session三十分钟的特点,所以这些论坛在线人数的统计只是大概的数字。
学习了方立勋老师Web开发第二十天,Servlet的开发技术,总结一下。
一.观察者设计模式
首先描述java的事件监听机制
1.事件监听涉及到三个组件:事件源,事件对象,事件监听器
2.当事件源上发生某一个动作是,它会调用事件监听器的一个方法,并在调用该方法时把事件对象传递进去,开发人员在监听器中通过事件对象就可以拿到事件源,从而对事件源进行操作。
第二,如何做一个事件源,被监听器监听
public class Demon2 {
//测试
public static void main(String[] args) {
Person p=new Person();
p.registerListener(new PersonListener() {
@Override
public void dorun(Event e) {
System.out.println(e.getSource()+"跑。。");
}
@Override
public void doeat(Event e) {
System.out.println("吃。。");
}
});
p.run();
}
}
class Person{
private PersonListener listener;
public void eat(){
if(listener!=null){
listener.doeat(new Event(this));
}
}
public void run(){
if(listener!=null){
listener.dorun(new Event(this));
}
}
public void registerListener(PersonListener listener){
this.listener=listener;
}
}
//设计接口
interface PersonListener{
public void doeat(Event e);
public void dorun(Event e);
}
class Event{
//封装Person
Person source;
public Event() {
super();
// TODO Auto-generated constructor stub
}
public Event(Person source) {
super();
this.source= source;
}
public Person getSource() {
return source;
}
public void setSource(Person source) {
this.source = source;
}
}
二.关于servlet监听器技术的一些实用例子
1.实现HttpSessionListener和ServletContextListener两个接口,常常可以用来做一个自定义的session扫描器。用于能定时扫描服务器的session,可以让经过一定时间没被用到的session硬化,即存在硬盘中,从而提高服务器的性能。其中完成自定义的session扫描器用到了Timer 这个工具类,通过查阅API文档,我们知道可以调用schedule方法,来达到定时做什么任务的目的。Timer 这个工具类在开发中经常会使用到,比如定时发送邮件,也可以用到Timer工具类。以下是自定义session扫描器的实现的代码。
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//自定义session扫描器
public class SessionScanerListener implements HttpSessionListener,ServletContextListener {
private List<HttpSession> list= Collections.synchronizedList(new LinkedList<HttpSession>());
private Object lock;
public void sessionCreated(HttpSessionEvent se) {
HttpSession session=se.getSession();
//避免添加的时候,两个session同时抢一个位置,所以要线程安全封装一下
synchronized(lock){
list.add(session);
}
System.out.println("session被创建");
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session被摧毁");
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
Timer timer=new Timer();
timer.schedule(new MyTask(list,lock), 0, 1000*60);//1分钟
}
}
class MyTask extends TimerTask{
private List<HttpSession> list;
private Object lock;
public MyTask(List list,Object lock){
this.list=list;
this.lock=lock;
}
public void run() {
synchronized(lock){
ListIterator it=list.listIterator();
while(it.hasNext()){
HttpSession session=(HttpSession) it.next();
if((System.currentTimeMillis()-session.getLastAccessedTime())>=1000*60){
session.invalidate();
list.remove(session);
}
}
}
}
}
另外在实现接口这后,监听器的调用方法是在web.xml中配置,例如:
<listener>
<listener-class>com.study.web.listener.SendMailListener</listener-class>
</listener>
另外可以通过HttpSessionListener这个接口,做一个类似论坛的在线人数的统计。另外,由与session的生命周期是从创建时就开始,到session不被调用,或者浏览器关闭后,服务器仍会替保存session三十分钟,这个三十分钟是可以配置的。所以即使论坛上一些人已经离开,又因为服务器会保存session三十分钟的特点,所以这些论坛在线人数的统计只是大概的数字。