ying zhouID:onlyxing
1504次访问,排名2万外好友2人,关注者2
双重性格吧,有时候比较安静,有时候也比较外向
onlyxing的文章
原创 23 篇
翻译 0 篇
转载 0 篇
评论 3 篇
最近评论
hxcqiang:我的也是这个错误,不过我是先装的sql再装的vs啊,为什么还是有错
onlyxing:你说的我试过,但我那个不行,只得重装了,呵呵
wangkafeng:删除注册,新建一个试下!
文章分类
收藏
    相册
    卡哇依
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Ajax 聊天室收藏

    新一篇: if not rs.eof then 的意思 | 旧一篇: Ajax 客戶端驗證與伺服端驗證

    網頁聊天的基本原理很簡單,在使用者發送訊息給伺服端時,同時取回新的聊天訊息,在使用者沒有發送訊息,同時查詢伺服端是否有新的訊息,並顯示在頁面中。 不過重點就在於取得訊息或重新取得訊息的方式,在過去,是在讓瀏覽器定時重新整理網頁,每一次除了新的訊息之外,往往伴隨著大量重複的HTML標籤等內容。 如果使用非同步請求,取得XML回應訊息,並動態更新頁面中顯示聊天訊息的部份,這麼一來,就可以節省掉下載重複頁面內容的頻寬,使用者的畫面也會更穩定,不會因為重新整理而發生閃爍的感覺。 例如,您可以寫一個簡單的聊天頁面:
    • ChatRoomEx-1.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=BIG5">
    <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>
    您可以在這個頁面中的欄位中輸入文字,而下方會有個顯示訊息的區域,每次的新訊息將只在該區域更新,頁面中其餘的部份不用變動,所以不用重複下載,來看一下JavaScript的部份:
    • ChatRoomEx-1.js
    var xmlHttp;
    
    function createXMLHttpRequest() {
        if (window.ActiveXObject) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        else if (window.XMLHttpRequest) {
            xmlHttp = new XMLHttpRequest();
        }
    }
    
    function sendMessage() {
        var msg = document.getElementById("text").value;
    
        // 使用者只是隨意按下傳送鈕,但文字欄位中沒有文字
        if(msg === "") {
            // 那就重新整理訊息區好了
    	refreshMessage();
    	return;
        }
    
        // 傳送訊息
        var param = "task=send&msg=" + msg;
        // ajax請求
        ajaxRequest(param);
        // 清空文字欄位
        document.getElementById("text").value = "";
    }
    
    // 定時查詢用這個
    function queryMessage() {
        var param = "task=query";
        ajaxRequest(param);
    }
    
    function ajaxRequest(param) {
        var url = "ChatRoomServlet?timeStamp=" + new Date().getTime();
        createXMLHttpRequest();
        xmlHttp.onreadystatechange = refreshMessage;
        xmlHttp.open("POST", url);
        xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
        xmlHttp.send(param);
    }
    	
    function refreshMessage() {
        if(xmlHttp.readyState == 4) {
            if(xmlHttp.status == 200) {
                // 處理顯示訊息的表格區域
                var table_body = document.getElementById("dynamicUpdateArea");
    	    var length = table_body.childNodes.length;
                var i;
                for (i = 0; i < length; i++) {
                    // 先移除原有的列(row)
                    table_body.removeChild(table_body.childNodes[0]);
                }
    
                // 處理取回的訊息
                var messages = xmlHttp.responseXML.getElementsByTagName("message");	
                length = messages.length;
    	    for(i = length - 1; i >= 0 ; i--) {
    	        var message = messages[i].firstChild.data;
                    // 在表格中新增一列來排列訊息
    	        var row = createRow(message);
    	        table_body.appendChild(row);                        
    	    }
                // 下次2秒後會再查詢一下有無新訊息
     	    setTimeout(queryMessage, 2000);
            }
        }
    }
    
    function createRow(message) {
        var row = document.createElement("tr");
        var cell = document.createElement("td");
        var cell_data = document.createTextNode(message);
        cell.appendChild(cell_data);
        row.appendChild(cell);
        return row;
    }
    伺服端必須傳回以下的XML格式,表示目前伺服端所管理的聊天室中可取得的訊息:
    <messages>
        <message>聊天訊息一</message>
        <message>聊天訊息二</message>     <message>聊天訊息三</message>
    </messages>
    以下是個簡單的聊天室Servlet:
    • ChatRoomServlet.java
    package onlyfun.caterpillar;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.LinkedList;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ChatRoomServlet extends 
               javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
        private static LinkedList<Message> messages = new LinkedList<Message>();
         
        private List<Message> addMessage(String text) {
            if (text != null && text.trim().length() > 0) {
                messages.addFirst(new Message(text));
                while (messages.size() > 10) {
                    messages.removeLast();
                }
            }
    
            return messages;
        }
    
        private List<Message> getMessages() {
            return messages;
        }
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                                   throws ServletException, IOException {
            List<Message> list = null;
            
            if("send".equals(request.getParameter("task"))) {
                String msg = request.getParameter("msg");
                // 中文處理
                msg = new String(msg.getBytes("ISO-8859-1"), "UTF8");
                list = addMessage(msg);
            }
            else if("query".equals(request.getParameter("task"))){
                 list = getMessages();
            }
            
            response.setContentType("text/xml");
            response.setHeader("Cache-Control", "no-cache");
            response.setCharacterEncoding("UTF8");
            
            PrintWriter out = response.getWriter();
            out.println("<messages>");
            for(int i = 0; i < list.size(); i++) {
                String msg = list.get(i).getText();
                out.println("<message>" + msg + "</message>");
            }
            out.println("</messages>");
            out.close();
        }               
    }
    • Message.java
    package onlyfun.caterpillar;
    
    public class Message {
        private String text;
        
        public Message(String newtext) {
            text = newtext;
            if (text.length() > 256) {
                text = text.substring(0, 256);
            }
            text = text.replace('<', '[');
            text = text.replace('&', '_');
        }
    
        public String getText() {
            return text;
        }
    }

    发表于 @ 2008年07月09日 22:10:00|评论(loading...)|编辑|收藏

    新一篇: if not rs.eof then 的意思 | 旧一篇: Ajax 客戶端驗證與伺服端驗證

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © onlyxing