Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 349|回复: 0

[AJAX学习]简单的ajax聊天网页

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-13 01:50:52 | 显示全部楼层 |阅读模式
    网页聊天的基本原理很简单,在使用者发送信息给服务器端时,同时取回新的聊天信息,在使用者�有发送信息时,同时查询服务端是否有新的信息,�显示在页面中。

       不过重点就在于取得信息或重新取得信息的方式,过去,是在让浏览器定时重新刷新网页,每一次除了新的信息之外,往往伴随着大量重复的HTML标记等�容。

       如果使用非同步�求,取得XML回应信息,并动态更新页面中显示聊天信息的部分,这么一来,就可以节省掉下载重复页面�容的带宽,使用者的画面也会更稳定,不会因为重新整理而发生闪烁的感觉。

    例如,您可以写一个简单的聊天页面: index.html


      
      
      
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>聊天室</title>
    <script type="text/javascript" src="ChatRoomEx-1.js"></script>
    </head><body>
    <p>输入信息:
       <input id="text"/>
       <input type="button" value="发送" onclick="sendMessage()"/>
    </p>
    <p>聊天室信息:</p>
       <table align="left">
         <tbody id="dynamicUpdateArea"></tbody>
       </table>
    </body></html>
         您可以在这个网页中的文本框中输入文字,而下方会有个显示信息的区域,每次的新信息&#65533;只在该区域更新,页面中其余的部分不用变动,所以不用重复下载。 来看一下JavaScript的部分:ChatRoomEx-1.js
    1. var xmlHttp;
    2. function createXMLHttpRequest() {
    3.      if (window.ActiveXObject) {
    4.         xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    5.      }else if (window.XMLHttpRequest) {
    6.         xmlHttp = new XMLHttpRequest();
    7.      }
    8. }
    9. function sendMessage() {
    10.     var msg = document.getElementById("text").value;   
    11.     // 使用者只是随意按下发送按钮,但文本框中&#65533;有文字
    12.     if(msg === "") {
    13.         // 那就重新整理信息区好了
    14.         refreshMessage();
    15.         return;  
    16.     }
    17.      // 发送信息
    18.     var param = "task=send&msg=" + msg;

    19.     // ajax请求
    20.     ajaxRequest(param);
    21.     // 清空文本框
    22.     document.getElementById("text").value = "";
    23. }
    24.     // 定时查询用这个
    25.     function queryMessage() {
    26.      var param = "task=query";
    27.      ajaxRequest(param);
    28.     }
    29.     function ajaxRequest(param) {
    30.       var url = "ChatRoomServlet?timeStamp=" + new Date().getTime();
    31.       createXMLHttpRequest();
    32.       xmlHttp.onreadystatechange = refreshMessage;
    33.       xmlHttp.open("POST", url);  
    34.       xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
    35.       xmlHttp.send(param);
    36.      }
    37.      function refreshMessage() {
    38.        if(xmlHttp.readyState == 4) {
    39.           if(xmlHttp.status == 200) {  
    40.           // 处理显示信息的表格区域
    41.             var table_body = document.getElementById("dynamicUpdateArea");
    42.             var length = table_body.childNodes.length;
    43.             var i;
    44.             for (i = 0; i < length; i++) {
    45.                // 先移除原有的列(row)
    46.                table_body.removeChild(table_body.childNodes[0]);
    47.            }  
    48.           // 处理取回的信息
    49.             var messages = xmlHttp.responseXML.getElementsByTagName("message");         
    50.             length = messages.length;
    51.             for(i = length - 1; i >= 0 ; i--) {       
    52.              var message = messages[i].firstChild.data;  
    53.               // 在表格中新增一列来排列信息
    54.                 var row = createRow(message);       
    55.                 table_body.appendChild(row);
    56.              }  
    57.             // 下次2秒后会再查询一下有无新信息
    58.             setTimeout(queryMessage, 2000);
    59.         }
    60.     }
    61. }
    62.    function createRow(message) {
    63.       var row = document.createElement("tr");
    64.       var cell = document.createElement("td");
    65.       var cell_data = document.createTextNode(message);
    66.       cell.appendChild(cell_data);
    67.       row.appendChild(cell);  
    68.       return row;
    69.    }
    70. 服务器端必须传回以下的XML格式,表示目前服务器端所管理的聊天室中可取得的信息:   
    复制代码

       
        <messages>
       
        <message>聊天信息一</message>
       
       <message>聊天信息二</message>
       
       <message>聊天信息三</message>
       
    </messages>
       

       
    以下是这个简单的聊天室的Servlet:ChatRoomServlet.java
    1. package onlyfun.caterpillar;
    2. import java.io.IOException;
    3. import java.io.PrintWriter;
    4. import java.util.LinkedList;
    5. import java.util.List;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. public class ChatRoomServlet extends javax.servlet.http.HttpServlet implements
    10.     javax.servlet.Servlet {
    11.       private static LinkedList
    12.    
    13.       messages = new LinkedList
    14.      
    15.       ();
    16.       private List
    17.       
    18.         addMessage(String text) {
    19.         if (text != null && text.trim().length() > 0) {  
    20.           messages.addFirst(new Message(text));
    21.           while (messages.size() > 10) {
    22.                messages.removeLast();  
    23.           }  
    24.         }  
    25.         return messages;  
    26.      }
    27.      private List
    28.       
    29.          getMessages() {
    30.         return messages;
    31.      }  
    32.       protected void doPost(HttpServletRequest request, HttpServletResponse response)  
    33.          throws ServletException, IOException {
    34.            List
    35.         
    36.           list = null;
    37.               if("send".equals(request.getParameter("task"))) {
    38.                String msg = request.getParameter("msg");  
    39.                // 中文处理
    40.                msg = new String(msg.getBytes("ISO-8859-1"), "UTF8");
    41.                list = addMessage(msg);
    42.               } else if("query".equals(request.getParameter("task"))){
    43.                list = getMessages();
    44.               }   
    45.               response.setContentType("text/xml");
    46.               response.setHeader("Cache-Control", "no-cache");
    47.               response.setCharacterEncoding("UTF8");  
    48.               PrintWriter out = response.getWriter();
    49.               out.println("< messages>");  
    50.               for(int i = 0; i < list.size(); i++) {
    51.                 String msg = list.get(i).getText();
    52.                 out.println("< message>" + msg + "< /message>");  
    53.               }
    54.       
    55.               out.println(" ");
    56.             out.close();  
    57.         }  
    58.    }
    59.          Message.java
    60.          

    61. package onlyfun.caterpillar;
    62. public class Message {
    63.    private String text;
    64.    public Message(String newtext) {
    65.        text = newtext;
    66.        if (text.length() > 256) {
    67.            text = text.substring(0, 256);  
    68.        }  
    69.        text = text.replace("<", "[");
    70.        text = text.replace("&", "_");
    71.     }  
    72.      public String getText() {
    73.        return text;
    74.    }
    75. }                        
    76.                         
    77.         
    78.       
    79.       
    80.      
    81.    
    复制代码

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/13/015052578.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-17 12:26 , Processed in 0.566601 second(s), 52 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表