Concludiamo l'analisi del codice di
ChatServiceImpl mostrando come
send rappresenti il cuore del nostro sistema di chat. Nel dettaglio, in
send andiamo a effettuare gli stessi controlli iniziali che abbiamo illustrato in
logout, ma con una differenza: dalla stringa costuiamo un messaggio rappresentato come istanza di un
bean denominato
ChatMessage, e lo inoltriamo a tutti i client connessi, utilizzando le loro sessioni Comet, così come illustrato nel codice seguente.
...
public void send(String message) throws ChatException {
HttpSession httpSession = getThreadLocalRequest().getSession(false);
if (httpSession == null) { throw new ChatException("not logged in: no http session"); }
String username = (String) httpSession.getAttribute("username"); if (username == null) { throw new ChatException("not logged in: no http session username"); }
ChatMessage chatMessage = new ChatMessage();
chatMessage.setUsername(username);
chatMessage.setMessage(message);
for (Map.Entry<String, CometSession> entry : users.entrySet()) { entry.getValue().enqueue(chatMessage);
}
}
}
Concludiamo questo mini tutorial, mostrando il file
web.xml in cui andiamo a definire tutti i
listener e le
servlet necessarie per eseguire la chat. I
listener in questione sono
CometServletContexListener e
CometHttpSessionListener, necessari rispettivamente per effettuare lo shutdown del processore Comet quando il
ServletContex viene distrutto e per invalidare la sessione Comet quando la sessione HTTP viene invalidata.
Le
servlet da definire invece sono:
ChatServiceImpl e
CometServlet. Di seguito il codice del file
web.xml:
<web-app>
<listener>
<listener-class>net.zschech.gwt.comet.server.CometServletContextListener</listener-class>
</listener>
<listener>
<listener-class>net.zschech.gwt.comet.server.CometHttpSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>chatService</servlet-name>
<servlet-class>org.mychat.server.ChatServiceImpl</servlet-class>
</servlet>
<servlet>
<servlet-name>chatComet</servlet-name>
<servlet-class>net.zschech.gwt.comet.server.CometServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>chatService</servlet-name>
<url-pattern>/net.zschech.gwt.chat.Chat/chat</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>chatComet</servlet-name>
<url-pattern>/net.zschech.gwt.chat.Chat/comet</url-pattern>
</servlet-mapping>
</web-app>