林信良(良葛格)的专栏

http://caterpillar.onlyfun.net/

用户操作
[即时聊天] [发私信] [加为好友]
林信良ID:caterpillar_here
225366次访问,排名293好友0人,关注者67
caterpillar_here的文章
原创 49 篇
翻译 0 篇
转载 1 篇
评论 325 篇
良葛格的公告
更多文件请访问
良葛格学习笔记

最近评论
hq_love_love:林老师问您一个问题。我在运行的这第一个例子加载下拉列表的值的时候会有一个alert(list);可以弹出后台String[]所返回的值。而在用DWRUtil.addOptions("op",list);时确报了个错,错误如下
[Object error]...
wangliang_hust2:不错!
wangliang_hust2:顶!!!
jbaowei2000:找不到JSONObject ,报异常
jbaowei2000:JSONObject 是什么?没看明白
文章分类
收藏
    相册
    Java
    夏昕的专栏
    良葛格学习笔记
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 DWR 入門與應用(三)收藏

    新一篇: Java 週報 > 爪哇教室> 第一個Spring程式 | 旧一篇: DWR 入門與應用(二)

    來寫個AJAX版的聊天室吧!先看看直接使用AJAX要如何做到,首先需要一個簡單的聊天室Servlet…
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    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>();

    public ChatRoomServlet() {
    super();
    }

    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"))) {
    list = addMessage(request.getParameter("msg"));
    }
    else if("query".equals(request.getParameter("task"))){
    list = getMessages();
    }
     
    PrintWriter out = response.getWriter();
    response.setContentType("text/xml");
    response.setHeader("Cache-Control", "no-cache");
     
    out.println("<response>");
    for(int i = 0; i < list.size(); i++) {
    String msg = list.get(i).getText();
    out.println("<message>" + msg + "</message>");
    }
    out.println("</response>");
    }
    }


    Message物件如下…
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package onlyfun.caterpillar;
     
    public class Message {
    private long id = System.currentTimeMillis();
    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 long getId() {
    return id;
    }
     
    public String getText() {
    return text;
    }
    }


    Servlet接受訊息新增與查詢,判斷的方式是檢查請求參數task是send或query。

    Servlet會以XML傳回目前List當中的訊息,客戶端可以查詢或插入新訊息時,取得目前List中的訊息,接著在web.xml中設定一下…
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
    <description>
    </description>
    <display-name>
    ChatRoomServlet</display-name>
    <servlet-name>ChatRoomServlet</servlet-name>
    <servlet-class>
    onlyfun.caterpillar.ChatRoomServlet</servlet-class>
    </servlet>
     
    <servlet-mapping>
    <servlet-name>ChatRoomServlet</servlet-name>
    <url-pattern>/ChatRoomServlet</url-pattern>
    </servlet-mapping>
    <session-config>
    <session-timeout>
    30
    </session-timeout>
    </session-config>
    </web-app>


    在網頁中,使用者可以在輸入訊息後按下按鈕送出資訊,並在XML回應取得時,將訊息以一列一列的表格方式顯示出來,另外還設定了週期性的輪詢,即使不輸入新訊息,也可以週期性的取得新的聊天訊息…
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=BIG5">
    <title>Chat Room</title>
     
    <script type="text/javascript">
    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;
    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, true);
    xmlHttp.setRequestHeader("Content-Type",
    "application/x-www-form-urlencoded;");
    xmlHttp.send(param);
    }

    function refreshMessage() {
    if(xmlHttp.readyState == 4) {
    if(xmlHttp.status == 200) {
    var messages = xmlHttp.responseXML.getElementsByTagName("message");

    var table_body = document.getElementById("dynamicUpdateArea");
    var length = table_body.childNodes.length;
    for (var i = 0; i < length; i++) {
    table_body.removeChild(table_body.childNodes[0]);
    }

    var length = messages.length;
    for(var i = length - 1; i >= 0 ; i--) {
    var message = messages[i].firstChild.data;
    var row = createRow(message);

    table_body.appendChild(row);
    }
    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;
    }
     
    </script>
     
    </head>
    <body>
     
    <p>
    Your Message:
    <input id="text"/>
    <input type="button" value="Send"
    onclick="sendMessage()"/>
    </p>
     
    <p>Messages:</p>
    <table align="left">
    <tbody id="dynamicUpdateArea"></tbody>
    </table>
     
    </body>
    </html>


    簡單抓個畫面… 



    直接用AJAX,後端用JSP/Servlet,您要對請求參數做些判斷,看看是新增訊息或查詢,並要自行輸出XML,有的沒的…

    改成DWR的話,就很簡單了,寫個簡單的Java物件…
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package onlyfun.caterpillar;
     
    import java.util.LinkedList;
    import java.util.List;
     
    public class Chat {
    private static LinkedList<Message> messages = new LinkedList<Message>();
     
    public List addMessage(String text) {
    if (text != null && text.trim().length() > 0) {
    messages.addFirst(new Message(text));
    while (messages.size() > 10) {
    messages.removeLast();
    }
    }

    return messages;
    }
     
    public List getMessages() {
    return messages;
    }
    }


    接著…在dwr.xml中開放一下…
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd">

    <dwr>
    <allow>
     
    <create creator="new" javascript="Chat">
    <param name="class" value="onlyfun.caterpillar.Chat"/>
    </create>

    <convert converter="bean" match="onlyfun.caterpillar.Message"/>
    </allow>
    </dwr>


    使用者取得訊息時,是直接傳回List物件,而List中裝的是Message物件,Message物件是自訂物件,conterver設定為 bean,表示DWR會自動將Message的getter名稱轉換為傳回客戶端的JavaScript物件中的屬性,例如Message中有 getText(),則在客戶端可以用message.text這樣的方式來存取。

    接著是簡單的客戶端網頁…
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=BIG5">
    <title>Insert title here</title>
     
    <script src="dwr/interface/Chat.js" type="text/javascript"></script>
    <script src="dwr/engine.js" type="text/javascript"></script>
    <script src="dwr/util.js" type="text/javascript"></script>
     
    <script type="text/javascript">
    function sendMessage() {
    var text = DWRUtil.getValue("text");
    DWRUtil.setValue("text", "");
    Chat.addMessage(text, gotMessages);
    }
     
    function gotMessages(messages) {
    var chatlog = "";
    for (var data in messages) {
    chatlog = "<div>" + messages[data].text +
    "</div>" + chatlog;
    }
    DWRUtil.setValue("chatlog", chatlog);
    setTimeout("queryMessage()", 2000);
    }
     
    function queryMessage() {
    Chat.getMessages(gotMessages);
    }
    </script>
     
    </head>
    <body>
     
    <p>
    Your Message:
    <input id="text"/>
    <input type="button" value="Send"
    onclick="sendMessage()"/>
    </p>
     
    <p>Messages:</p>
    <div id="chatlog"></div>
     
    </body>
    </html>


    當List物件傳回時,它成為gotMessages(messages)中的messages物件,而messages物件中包括 Message物件轉換後對應的JavaScript物件,由於我們已經設定了Converter,所以可以用messages[data].text來 取得傳回的訊息…

    簡單抓個畫面…

    发表于 @ 2006年09月30日 13:41:00|评论(loading...)|编辑

    新一篇: Java 週報 > 爪哇教室> 第一個Spring程式 | 旧一篇: DWR 入門與應用(二)

    评论

    #cyh 发表于2006-10-01 21:54:00  IP: 221.221.242.*
    支持,希望林老师继续写下去。期待!!!!!
    #Ming 发表于2006-10-02 08:42:00  IP: 218.16.196.*
    这篇文章比前两篇难度高了不少,值得学习,谢谢老师!
    #邱方纯 发表于2006-10-03 19:08:00  IP: 221.12.59.*
    这篇文章写的好,比前面的难度提高了很多,在实际应用中也很不错,
    老师,继续阿

    我们期盼着呢

    #JUN HUANG 发表于2006-10-04 19:33:00  IP: 218.79.200.*
    我还是个菜鸟,看了深有感触.受益非浅.
    #小蛇 发表于2006-10-05 00:14:00  IP: 125.93.25.*
    教程也清晰 希望老师能出个DWR相关的书带领带领我们``

    我第一个支持
    #angin 发表于2006-10-08 20:43:00  IP: 58.50.129.*
    林老师
    什么时候出关于dwr的书啊?
    早点最好!
    最好出一本spring Hibernate dwr的书
    准备去买你的jdk5.0学习笔记
    #哎, 发表于2006-10-11 09:34:00  IP: 59.61.87.*
    servlet里面有构造函数,但愿林老师是一时手误.
    #学到了 发表于2006-10-26 10:36:00  IP: 202.134.114.*
    很好,学到东西了,期待林老师继续下去,dwr.xml里还有很多配置,需要您的例程来指导我们去理解!
    #wubin 发表于2006-11-08 10:02:00  IP: 61.189.160.*
    写的好啊,佩服!
    #chenzijun 发表于2006-11-11 10:53:00  IP: 125.96.174.*
    林老师
    LinkedList线程不安全吧,
    这样写private static LinkedList<Message> messages = new LinkedList<Message>(); 多线程并发时会有问题吧
    #dennis 发表于2006-11-17 00:15:00  IP: 58.23.92.*
    写的真棒,LinkedList确实不是线程安全,这只是个例子
    #unverse 发表于2007-05-14 05:51:13  IP: 222.18.142.*
    chatlog = "<div>" + messages[data].text + "</div>" + chatlog;

    这句怎么原原本的输出来啊??
    <div>niahao</div>

    怎么回事啊?
    急!
    #jaogun 发表于2007-07-02 18:44:43  IP: 202.97.144.*
    不错,Mr 林的spring2.0正在看,写得不错,支持
    #blackpark 发表于2007-08-01 10:45:29  IP: 202.108.126.*
    关于上面格式的问题解决方法:
    $('chatlog').innerHTML = chatlog;

    注释下行:
    DWRUtil.setValue("chatlog", chatlog);
    #blackpark 发表于2007-08-01 11:03:08  IP: 202.108.126.*
    林老师的这个demo,原来希望显示消息是最上面是最新的,有点小bug,现在是最底下显示最新,改正方法如下:
    将html网页 21 22行修改如下:
    chatlog = chatlog + messages[data].text + "<br />";

    注:显示消息的HTML格式问题,看我上个帖子 :)
    #charm_888 发表于2007-11-21 13:06:13  IP: 61.149.219.*
    不错,继续,支持啊 老师!我按你的做了,每个例子都很好,都成功了! 谢谢啊!
    #sjkma 发表于2008-04-18 18:20:17  IP: 125.76.161.*
    写的太棒了,!!!!!!!!!!!!!!!!!!!
    #EsunYang 发表于2008-07-15 10:07:15  IP: 61.145.246.*
    不错, 值得学习, V.
    #xulovewcx 发表于2008-08-28 14:27:58  IP: 61.191.26.*
    杂不行啊,老师
    #wsrenwei 发表于2008-09-09 11:37:39  IP: 211.138.191.*
    我做下怎么都找不到DWRUtil
    而且我也不知道
    <script src="dwr/interface/Chat.js" type="text/javascript"></script><script src="dwr/engine.js" type="text/javascript"></script><script src="dwr/util.js" type="text/javascript"></script> 在哪
    #wsrenwei 发表于2008-09-09 11:48:02  IP: 211.138.191.*
    怎么都不行啊 会的指教
    QQ58517237
    #wangliang_hust2 发表于2008-09-26 16:42:28  IP: 123.122.106.*
    顶!!!
    #wangliang_hust2 发表于2008-09-26 16:44:11  IP: 123.122.106.*
    不错!
    发表评论  


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