1:聊天窗口的 处理servlet.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String eventName = request.getParameter("eventName");
System.out.println("keeper is here -----"+eventName);
NameRegister reg = NameRegister.getInstance();
Event event = reg.getEvent(eventName);
if(event == null){
event = new Event(eventName, this);
reg.setEvent(eventName, event);
}
//阻塞
synchronized(this) {
while(!event.isProcess()){
try {
System.out.println("--keeper--阻塞中-----");
wait();
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("--keeper--已经释放-----");
EventListener listener = event.getListener();
if(listener!= null){
listener.process(request, response);
}
//删除事件
reg.removeEvent(eventName);
}
从代码流程可以看出......有事件Evlent其实就是封装了 HttpServlet, 等:
public class Event
{
private String eventName;
private HttpServlet servlet;
private EventListener listener;
private boolean isProcess;
public Event(String eventName, HttpServlet servlet)
{
this.eventName = eventName;
this.servlet = servlet;
this.isProcess = false;
this.listener = null;
}
其中isProcess是作为释放servlet的线程的标志。
到发送请求 send到来的时候会进入SendServlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("chat is here");
String jid = request.getParameter("jid");
String tojid = request.getParameter("tojid");
String content = request.getParameter("content");
Message message = new Message();
message.setContent(content);
message.setUserId(jid);
message.setToUserId(tojid);
Controller.action(new SendPrivateMsg(message.toString()), "msg");
System.out.println("msg---is --over");
}
封装message然后,Controlller中处理 信息,其中SendPrivateMsg是一个 实现了EventListener的 类:
public interface EventListener {
public void process(HttpServletRequest request, HttpServletResponse response);
}
看Controller:
public class Controller {
public static boolean action(EventListener listener, String eventName){
NameRegister reg = NameRegister.getInstance();
HttpServlet servlet = null;
Event e = null;
try {
e = reg.getEvent(eventName);
if (e == null) {
System.out.println("事件名称 null==");
return false;
}
e.setListener(listener);
servlet = e.getServlet();
e.setProcess(true);
synchronized (servlet) {
System.out.println("事件名称=="+e.getEventName());
servlet.notifyAll();
}
} catch (Exception ex) {
ex.printStackTrace();
if ((servlet != null) && (e != null)) {
e = null;
return true;
}
}
return false;
}
}
主要是对 特定的事件 释放 阻塞,然后可以继续执行
EventListener listener = event.getListener();
if(listener!= null){
listener.process(request, response);
}