首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

创建基于 Ajax 的 IM 客户端(6)创建 Web 应用程序

创建基于 Ajax 的 IM 客户端(6)创建 Web 应用程序

创建 Web 应用程序下一步是创建可以访问这个 bot 的 Web 应用程序。在本例中,该 Web 应用程序包含单个 servlet,可以将消息传递给 bot 和由 bot 传回。当用户告知 servlet 发送消息时,servlet 会将消息传递给 bot 的 sendMessage() 方法。当用户告知 servlet,他或她想要接收消息时,servlet 会将消息传递给 bot 的 getMessages() 方法。
创建 servlet首先创建一个新 servlet,称为 ChatServlet。在  Eclipse,右键单击该项目并选择 New > Servlet
得到的 servlet 非常典型(参见清单 7):
清单 7. 基本的 servlet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ChatServlet
                extends javax.servlet.http.HttpServlet
                implements javax.servlet.Servlet {

    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
              throws ServletException, IOException {
         
         
    }      

    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
               throws ServletException, IOException {
    }                 
}




在实际的应用程序中,很可能使用 POST 方法;为了简化开发,我们将使用 GET,但前提是相同的。
现在让我们集成此 bot。
实例化此 bot每次用户调用此 servlet 时,都需要检索此 bot 的相同实例,所以需要创建一个静态实例(参见清单 8):
清单 8. 实例化此 bot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
....
public class ChatServlet extends javax.servlet.http.HttpServlet
                                 implements javax.servlet.Servlet {

   private static ChatBot bot = null;

   public ChatServlet() {
        super();
         
        bot = new ChatBot();
        bot.go();
        bot.startNew();

    }      
     
    protected void doGet(HttpServletRequest request,
....




首次调用此 servlet 时,会执行构造函数。在本例中,该构造函数实例化静态 ChatBot 对象,bot。它还启动线程,与之前在主方法中所做的无异。
现在,每次调用 servlet 时,都会得到单一一个 bot 实例(构造函数只在第一次调用 servlet 时运行,所以不会有任何的重复)。
发送消息有了 servlet 之后,就可以使用它来开始发送消息。方法是使用 GET 请求中的参数(参见清单 9):
清单 9. 发送消息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
....
    protected void doGet(HttpServletRequest request,
      HttpServletResponse response) throws ServletException, IOException {
         
        if (request.getParameter("target") != null
                && request.getParameter("message") != null){
            
            bot.sendMessage(request.getParameter("target").toString(),
                           request.getParameter("message").toString());
            
        }
         
    }      
....




当消息到来时,如果该消息具备目标和消息参数,就可以认为用户想要发送消息,也就可以使用这些参数发送消息。这与从主方法对其进行调用是一样的。
若要测试,可以打开浏览器并将其指向:http://yourserver/proj/ChatServlet?target=myfriend@myserver.net&message=Hi!               
当然,请确保在 URL 内放入您的具体信息,但您应该可以看到消息在您的 IM 客户端上弹出。
获得消息还可以使用 servlet 检索消息,但消息不出现在控制台内,而是出现在浏览器内。要实现此目的,首先需要创建一种方法来检索这个合适的队列(参见清单 10):
清单 10. 在 ChatBot.java 获得消息
1
2
3
4
5
6
7
8
9
10
....

    public String getMessages(String targetUser){
        String queue = chatQueues.get(targetUser).toString();
        chatQueues.put(targetUser, "");
        return queue;        
    }

    private void createConversation(String target){
....




此方法十分直观 — 检索当前队列的文本、清除此队列并返回文本(请记住此队列,如 chat 会话一样,都是通过将地址作为它的键进行存储的)。一旦它就绪后,就可以从 servlet 调用它(参见清单 11):
清单 11. 在 ChatServlet.java 获得消息
1
2
3
4
5
6
7
8
9
10
....
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
         
        if (request.getParameter("getMessages") != null){
            response.getWriter().print(
               bot.getMessages(
                    request.getParameter("getMessages").toString()));
        }            
....




在本例中,servlet 寻找 getMessages 参数,该参数保存所请求队列的用户名。如果它存在,servlet 会获得消息(使用 bot)并输出到页面。若要测试,可以保存更改并重启服务器(这样就得到了一个新的 bot 实例)。试着发送消息以使窗口弹出,然后从 IM 客户端发送几行文本。
之后,可以用 URL 请求此队列,比如:http://yourserver/proj/ChatServlet?getMessages=myfriend@myserver.net               
应该可以看到队列出现在浏览器窗口。
现在,需要将此功能合并到实际的 Web 客户端。
返回列表