﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-细心!用心!耐心!-文章分类-AJAX技术</title><link>http://www.blogjava.net/jesson2005/category/21650.html</link><description>吾非文人，乃市井一俗人也，读百卷书，跨江河千里，故申城一游； 
一两滴辛酸，三四年学业，五六点粗墨，七八笔买卖，九十道人情。</description><language>zh-cn</language><lastBuildDate>Wed, 18 Apr 2007 06:44:07 GMT</lastBuildDate><pubDate>Wed, 18 Apr 2007 06:44:07 GMT</pubDate><ttl>60</ttl><item><title>DWR 入門與應用（三） </title><link>http://www.blogjava.net/jesson2005/articles/111007.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/111007.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/111007.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/111007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/111007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/111007.html</trackback:ping><description><![CDATA[<span class=javascript id=text167679>來寫個AJAX版的聊天室吧！先看看直接使用AJAX要如何做到，首先需要一個簡單的聊天室Servlet&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>package</strong></font> onlyfun.caterpillar;<br>&nbsp;<br><font class=java-reserved_word><strong>import</strong></font> java.io.IOException;<br><font class=java-reserved_word><strong>import</strong></font> java.io.PrintWriter;<br><font class=java-reserved_word><strong>import</strong></font> java.util.LinkedList;<br><font class=java-reserved_word><strong>import</strong></font> java.util.List;<br>&nbsp;<br><font class=java-reserved_word><strong>import</strong></font> javax.servlet.ServletException;<br><font class=java-reserved_word><strong>import</strong></font> javax.servlet.http.HttpServletRequest;<br><font class=java-reserved_word><strong>import</strong></font> javax.servlet.http.HttpServletResponse;<br>&nbsp;<br> <font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> ChatRoomServlet <font class=java-reserved_word><strong>extends</strong></font> javax.servlet.http.HttpServlet <font class=java-reserved_word><strong>implements</strong></font> javax.servlet.Servlet <font class=java-bracket>{</font><br>     <font class=java-reserved_word><strong>private</strong></font> <font class=java-reserved_word><strong>static</strong></font> LinkedList&lt;Message&gt; messages = <font class=java-reserved_word><strong>new</strong></font> LinkedList&lt;Message&gt;();<br>     <br>     <font class=java-reserved_word><strong>public</strong></font> ChatRoomServlet() <font class=java-bracket>{</font><br>    <font class=java-reserved_word><strong>super</strong></font>(); <br>  <font class=java-bracket>}</font><br>    <br>    <font class=java-reserved_word><strong>private</strong></font> List&lt;Message&gt; addMessage(String text) <font class=java-bracket>{</font><br>        <font class=java-reserved_word><strong>if</strong></font> (text != <font class=java-reserved_word><strong>null</strong></font> &amp;&amp; text.trim().length() &gt; 0) <font class=java-bracket>{</font><br>            messages.addFirst(<font class=java-reserved_word><strong>new</strong></font> Message(text));<br>            <font class=java-reserved_word><strong>while</strong></font> (messages.size() &gt; 10) <font class=java-bracket>{</font><br>                messages.removeLast();<br>            <font class=java-bracket>}</font><br>        <font class=java-bracket>}</font><br>&nbsp;<br>        <font class=java-reserved_word><strong>return</strong></font> messages;<br>    <font class=java-bracket>}</font><br>&nbsp;<br>    <font class=java-reserved_word><strong>private</strong></font> List&lt;Message&gt; getMessages() <font class=java-bracket>{</font><br>        <font class=java-reserved_word><strong>return</strong></font> messages;<br>    <font class=java-bracket>}</font><br>    <br>  <font class=java-reserved_word><strong>protected</strong></font> <font class=java-reserved_word><strong>void</strong></font> doPost(HttpServletRequest request, HttpServletResponse response) <font class=java-reserved_word><strong>throws</strong></font> ServletException, IOException <font class=java-bracket>{</font><br>        List&lt;Message&gt; list = <font class=java-reserved_word><strong>null</strong></font>;<br>        <br>        <font class=java-reserved_word><strong>if</strong></font>(<font class=java-string>"send"</font>.equals(request.getParameter(<font class=java-string>"task"</font>))) <font class=java-bracket>{</font><br>             list = addMessage(request.getParameter(<font class=java-string>"msg"</font>));<br>        <font class=java-bracket>}</font><br>        <font class=java-reserved_word><strong>else</strong></font> <font class=java-reserved_word><strong>if</strong></font>(<font class=java-string>"query"</font>.equals(request.getParameter(<font class=java-string>"task"</font>)))<font class=java-bracket>{</font><br>             list = getMessages();<br>        <font class=java-bracket>}</font><br>&nbsp;<br>        PrintWriter out = response.getWriter();<br>        response.setContentType(<font class=java-string>"text/xml"</font>);<br>        response.setHeader(<font class=java-string>"Cache-Control"</font>, <font class=java-string>"no-cache"</font>);<br>&nbsp;<br>        out.println(<font class=java-string>"&lt;response&gt;"</font>);<br>        <font class=java-reserved_word><strong>for</strong></font>(<font class=java-reserved_word><strong>int</strong></font> i = 0; i &lt; list.size(); i++) <font class=java-bracket>{</font><br>            String msg = list.get(i).getText();<br>            out.println(<font class=java-string>"&lt;message&gt;"</font> + msg + <font class=java-string>"&lt;/message&gt;"</font>);<br>        <font class=java-bracket>}</font><br>        out.println(<font class=java-string>"&lt;/response&gt;"</font>);<br>  <font class=java-bracket>}</font>             <br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>Message物件如下&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>package</strong></font> onlyfun.caterpillar;<br>&nbsp;<br><font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> Message <font class=java-bracket>{</font><br>    <font class=java-reserved_word><strong>private</strong></font> <font class=java-reserved_word><strong>long</strong></font> id = System.currentTimeMillis();<br>    <font class=java-reserved_word><strong>private</strong></font> String text;<br>    <br>    <font class=java-reserved_word><strong>public</strong></font> Message(String newtext) <font class=java-bracket>{</font><br>        text = newtext;<br>        <font class=java-reserved_word><strong>if</strong></font> (text.length() &gt; 256) <font class=java-bracket>{</font><br>            text = text.substring(0, 256);<br>        <font class=java-bracket>}</font><br>        text = text.replace(<font class=java-string>'&lt;'</font>, <font class=java-string>'['</font>);<br>        text = text.replace(<font class=java-string>'&amp;'</font>, <font class=java-string>'_'</font>);<br>    <font class=java-bracket>}</font><br>&nbsp;<br>    <font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>long</strong></font> getId() <font class=java-bracket>{</font><br>        <font class=java-reserved_word><strong>return</strong></font> id;<br>    <font class=java-bracket>}</font><br>&nbsp;<br>    <font class=java-reserved_word><strong>public</strong></font> String getText() <font class=java-bracket>{</font><br>        <font class=java-reserved_word><strong>return</strong></font> text;<br>    <font class=java-bracket>}</font><br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>Servlet接受訊息新增與查詢，判斷的方式是檢查請求參數task是send或query。 <br><br>Servlet會以XML傳回目前List當中的訊息，客戶端可以查詢或插入新訊息時，取得目前List中的訊息，接著在web.xml中設定一下&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;?xml version=<font class=java-string>"1.0"</font> encoding=<font class=java-string>"UTF-8"</font>?&gt;<br>&lt;web-app id=<font class=java-string>"WebApp_ID"</font> version=<font class=java-string>"2.4"</font> xmlns=<font class=java-string>"http://java.sun.com/xml/ns/j2ee"</font> xmlns:xsi=<font class=java-string>"http://www.w3.org/2001/XMLSchema-instance"</font> xsi:schemaLocation=<font class=java-string>"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</font>&gt;<br>  &lt;servlet&gt;<br>    &lt;description&gt;<br>    &lt;/description&gt;<br>    &lt;display-name&gt;<br>    ChatRoomServlet&lt;/display-name&gt;<br>    &lt;servlet-name&gt;ChatRoomServlet&lt;/servlet-name&gt;<br>    &lt;servlet-class&gt;<br>    onlyfun.caterpillar.ChatRoomServlet&lt;/servlet-class&gt;<br>  &lt;/servlet&gt;<br>&nbsp;<br>  &lt;servlet-mapping&gt;<br>    &lt;servlet-name&gt;ChatRoomServlet&lt;/servlet-name&gt;<br>    &lt;url-pattern&gt;/ChatRoomServlet&lt;/url-pattern&gt;<br>  &lt;/servlet-mapping&gt;<br>  &lt;session-config&gt;<br>    &lt;session-timeout&gt;<br>            30<br>        &lt;/session-timeout&gt;<br>  &lt;/session-config&gt;  <br>&lt;/web-app&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>在網頁中，使用者可以在輸入訊息後按下按鈕送出資訊，並在XML回應取得時，將訊息以一列一列的表格方式顯示出來，另外還設定了週期性的輪詢，即使不輸入新訊息，也可以週期性的取得新的聊天訊息&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br>48<br>49<br>50<br>51<br>52<br>53<br>54<br>55<br>56<br>57<br>58<br>59<br>60<br>61<br>62<br>63<br>64<br>65<br>66<br>67<br>68<br>69<br>70<br>71<br>72<br>73<br>74<br>75<br>76<br>77<br>78<br>79<br>80<br>81<br>82<br>83<br>84<br>85<br>86<br>87<br>88<br>89<br>90<br>91<br>92<br>93<br>94<br>95<br>96<br>97<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;!DOCTYPE HTML PUBLIC <font class=java-string>"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv=<font class=java-string>"Content-Type"</font> content=<font class=java-string>"text/html; charset=BIG5"</font>&gt;<br>&lt;title&gt;Chat Room&lt;/title&gt;<br>&nbsp;<br>&lt;script type=<font class=java-string>"text/javascript"</font>&gt;<br>var xmlHttp;<br>&nbsp;<br>function createXMLHttpRequest() <font class=java-bracket>{</font><br>    <font class=java-reserved_word><strong>if</strong></font> (window.ActiveXObject) <font class=java-bracket>{</font><br>        xmlHttp = <font class=java-reserved_word><strong>new</strong></font> ActiveXObject(<font class=java-string>"Microsoft.XMLHTTP"</font>);<br>    <font class=java-bracket>}</font> <br>    <font class=java-reserved_word><strong>else</strong></font> <font class=java-reserved_word><strong>if</strong></font> (window.XMLHttpRequest) <font class=java-bracket>{</font><br>        xmlHttp = <font class=java-reserved_word><strong>new</strong></font> XMLHttpRequest();<br>    <font class=java-bracket>}</font><br><font class=java-bracket>}</font><br>&nbsp;<br>function sendMessage() <font class=java-bracket>{</font><br>  var msg = document.getElementById(<font class=java-string>"text"</font>).value;<br>  <br>  <font class=java-reserved_word><strong>if</strong></font>(msg == <font class=java-string>""</font>) <font class=java-bracket>{</font><br>    refreshMessage();<br>    <font class=java-reserved_word><strong>return</strong></font>;<br>  <font class=java-bracket>}</font><br>  <br>  var param = <font class=java-string>"task=send&amp;msg="</font> + msg;<br>  ajaxRequest(param);<br>  document.getElementById(<font class=java-string>"text"</font>).value = <font class=java-string>""</font>;<br><font class=java-bracket>}</font><br>&nbsp;<br>function queryMessage() <font class=java-bracket>{</font><br>  var param = <font class=java-string>"task=query"</font>;<br>  ajaxRequest(param);<br><font class=java-bracket>}</font><br>&nbsp;<br>function ajaxRequest(param) <font class=java-bracket>{</font><br>  var url = <font class=java-string>"ChatRoomServlet?timestamp"</font> + <font class=java-reserved_word><strong>new</strong></font> Date().getTime();<br>    createXMLHttpRequest();<br>  xmlHttp.onreadystatechange = refreshMessage;<br>    xmlHttp.open(<font class=java-string>"POST"</font>, url, <font class=java-reserved_word><strong>true</strong></font>);<br>  xmlHttp.setRequestHeader(<font class=java-string>"Content-Type"</font>,<br>           <font class=java-string>"application/x-www-form-urlencoded;"</font>);<br>    xmlHttp.send(param);<br><font class=java-bracket>}</font><br>  <br>function refreshMessage() <font class=java-bracket>{</font><br>  <font class=java-reserved_word><strong>if</strong></font>(xmlHttp.readyState == 4) <font class=java-bracket>{</font><br>        <font class=java-reserved_word><strong>if</strong></font>(xmlHttp.status == 200) <font class=java-bracket>{</font><br>          var messages = xmlHttp.responseXML.getElementsByTagName(<font class=java-string>"message"</font>);<br>  <br>          var table_body = document.getElementById(<font class=java-string>"dynamicUpdateArea"</font>);<br>      var length = table_body.childNodes.length;<br>      <font class=java-reserved_word><strong>for</strong></font> (var i = 0; i &lt; length; i++) <font class=java-bracket>{</font><br>        table_body.removeChild(table_body.childNodes[0]);<br>      <font class=java-bracket>}</font><br>      <br>      var length = messages.length;<br>          <font class=java-reserved_word><strong>for</strong></font>(var i = length - 1; i &gt;= 0 ; i--) <font class=java-bracket>{</font><br>              var message = messages[i].firstChild.data;<br>              var row = createRow(message);<br>        <br>              table_body.appendChild(row);                        <br>          <font class=java-bracket>}</font><br>      setTimeout(<font class=java-string>"queryMessage()"</font>, 2000);<br>        <font class=java-bracket>}</font><br>  <font class=java-bracket>}</font><br><font class=java-bracket>}</font><br>&nbsp;<br>function createRow(message) <font class=java-bracket>{</font><br>    var row = document.createElement(<font class=java-string>"tr"</font>);<br>    var cell = document.createElement(<font class=java-string>"td"</font>);<br>    var cell_data = document.createTextNode(message);<br>    cell.appendChild(cell_data);<br>    row.appendChild(cell);<br>    <font class=java-reserved_word><strong>return</strong></font> row;<br><font class=java-bracket>}</font><br>&nbsp;<br>&lt;/script&gt;<br>&nbsp;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&nbsp;<br>&lt;p&gt;<br>  Your Message:<br>  &lt;input id=<font class=java-string>"text"</font>/&gt;<br>  &lt;input type=<font class=java-string>"button"</font> value=<font class=java-string>"Send"</font><br>      onclick=<font class=java-string>"sendMessage()"</font>/&gt;<br>&lt;/p&gt;<br>&nbsp;<br>&lt;p&gt;Messages:&lt;/p&gt;<br>    &lt;table align=<font class=java-string>"left"</font>&gt;<br>        &lt;tbody id=<font class=java-string>"dynamicUpdateArea"</font>&gt;&lt;/tbody&gt;<br>    &lt;/table&gt;<br>&nbsp;<br>&lt;/body&gt;<br>&lt;/html&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>簡單抓個畫面&#8230;&nbsp; </span><br><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/1.jpg"><br><br><span class=javascript id=text167681>直接用AJAX，後端用JSP/Servlet，您要對請求參數做些判斷，看看是新增訊息或查詢，並要自行輸出XML，有的沒的&#8230; <br><br>改成DWR的話，就很簡單了，寫個簡單的Java物件&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>package</strong></font> onlyfun.caterpillar;<br>&nbsp;<br><font class=java-reserved_word><strong>import</strong></font> java.util.LinkedList;<br><font class=java-reserved_word><strong>import</strong></font> java.util.List;<br>&nbsp;<br><font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> Chat <font class=java-bracket>{</font><br>  <font class=java-reserved_word><strong>private</strong></font> <font class=java-reserved_word><strong>static</strong></font> LinkedList&lt;Message&gt; messages = <font class=java-reserved_word><strong>new</strong></font> LinkedList&lt;Message&gt;();<br>&nbsp;<br>  <font class=java-reserved_word><strong>public</strong></font> List addMessage(String text) <font class=java-bracket>{</font><br>    <font class=java-reserved_word><strong>if</strong></font> (text != <font class=java-reserved_word><strong>null</strong></font> &amp;&amp; text.trim().length() &gt; 0) <font class=java-bracket>{</font><br>      messages.addFirst(<font class=java-reserved_word><strong>new</strong></font> Message(text));<br>      <font class=java-reserved_word><strong>while</strong></font> (messages.size() &gt; 10) <font class=java-bracket>{</font><br>        messages.removeLast();<br>      <font class=java-bracket>}</font><br>    <font class=java-bracket>}</font><br> <br>    <font class=java-reserved_word><strong>return</strong></font> messages;<br>  <font class=java-bracket>}</font><br>&nbsp;<br>  <font class=java-reserved_word><strong>public</strong></font> List getMessages() <font class=java-bracket>{</font><br>    <font class=java-reserved_word><strong>return</strong></font> messages;<br>  <font class=java-bracket>}</font><br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>接著&#8230;在dwr.xml中開放一下&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;?xml version=<font class=java-string>"1.0"</font> encoding=<font class=java-string>"UTF-8"</font>?&gt;<br>&lt;!DOCTYPE dwr PUBLIC <font class=java-string>"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</font> <font class=java-string>"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</font>&gt;<br> <br>&lt;dwr&gt;<br>  &lt;allow&gt;<br>&nbsp;<br>    &lt;create creator=<font class=java-string>"new"</font> javascript=<font class=java-string>"Chat"</font>&gt;<br>      &lt;param name=<font class=java-string>"class"</font> value=<font class=java-string>"onlyfun.caterpillar.Chat"</font>/&gt;<br>    &lt;/create&gt;<br>    <br>    &lt;convert converter=<font class=java-string>"bean"</font> match=<font class=java-string>"onlyfun.caterpillar.Message"</font>/&gt;      <br>  &lt;/allow&gt;<br>&lt;/dwr&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>使用者取得訊息時，是直接傳回List物件，而List中裝的是Message物件，Message物件是自訂物件，conterver設定為 bean，表示DWR會自動將Message的getter名稱轉換為傳回客戶端的JavaScript物件中的屬性，例如Message中有 getText()，則在客戶端可以用message.text這樣的方式來存取。 <br><br>接著是簡單的客戶端網頁&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br>41<br>42<br>43<br>44<br>45<br>46<br>47<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;!DOCTYPE HTML PUBLIC <font class=java-string>"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv=<font class=java-string>"Content-Type"</font> content=<font class=java-string>"text/html; charset=BIG5"</font>&gt;<br>&lt;title&gt;Insert title here&lt;/title&gt;<br>&nbsp;<br>&lt;script src=<font class=java-string>"dwr/interface/Chat.js"</font> type=<font class=java-string>"text/javascript"</font>&gt;&lt;/script&gt;<br>&lt;script src=<font class=java-string>"dwr/engine.js"</font> type=<font class=java-string>"text/javascript"</font>&gt;&lt;/script&gt;<br>&lt;script src=<font class=java-string>"dwr/util.js"</font> type=<font class=java-string>"text/javascript"</font>&gt;&lt;/script&gt;<br>&nbsp;<br>&lt;script type=<font class=java-string>"text/javascript"</font>&gt;<br>function sendMessage() <font class=java-bracket>{</font><br>    var text = DWRUtil.getValue(<font class=java-string>"text"</font>);<br>    DWRUtil.setValue(<font class=java-string>"text"</font>, <font class=java-string>""</font>);<br>    Chat.addMessage(text, gotMessages);<br><font class=java-bracket>}</font><br>&nbsp;<br>function gotMessages(messages) <font class=java-bracket>{</font><br>    var chatlog = <font class=java-string>""</font>;<br>    <font class=java-reserved_word><strong>for</strong></font> (var data in messages) <font class=java-bracket>{</font><br>        chatlog = <font class=java-string>"&lt;div&gt;"</font> + messages[data].text +<br>            <font class=java-string>"&lt;/div&gt;"</font> + chatlog;<br>    <font class=java-bracket>}</font><br>    DWRUtil.setValue(<font class=java-string>"chatlog"</font>, chatlog);<br>  setTimeout(<font class=java-string>"queryMessage()"</font>, 2000);<br><font class=java-bracket>}</font><br>&nbsp;<br>function queryMessage() <font class=java-bracket>{</font><br>  Chat.getMessages(gotMessages);<br><font class=java-bracket>}</font><br>&lt;/script&gt;<br>&nbsp;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&nbsp;<br>&lt;p&gt;<br>  Your Message:<br>  &lt;input id=<font class=java-string>"text"</font>/&gt;<br>  &lt;input type=<font class=java-string>"button"</font> value=<font class=java-string>"Send"</font><br>      onclick=<font class=java-string>"sendMessage()"</font>/&gt;<br>&lt;/p&gt;<br>&nbsp;<br>&lt;p&gt;Messages:&lt;/p&gt;<br>&lt;div id=<font class=java-string>"chatlog"</font>&gt;&lt;/div&gt;<br>&nbsp;<br>&lt;/body&gt;<br>&lt;/html&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>當List物件傳回時，它成為gotMessages(messages)中的messages物件，而messages物件中包括 Message物件轉換後對應的JavaScript物件，由於我們已經設定了Converter，所以可以用messages[data].text來 取得傳回的訊息&#8230; <br><br>簡單抓個畫面&#8230; </span><br><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/2.jpg"><br>
<img src ="http://www.blogjava.net/jesson2005/aggbug/111007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 16:29 <a href="http://www.blogjava.net/jesson2005/articles/111007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR 入門與應用（二） </title><link>http://www.blogjava.net/jesson2005/articles/111005.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/111005.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/111005.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/111005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/111005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/111005.html</trackback:ping><description><![CDATA[<span class=javascript id=text166425>假設您要從資料庫中查詢出一些字串，然後填寫到表單的下拉選單中。 <br><br>例如一個示意的Java程式如下： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>package</strong></font> onlyfun.caterpillar;<br>&nbsp;<br><font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> Option <font class=java-bracket>{</font><br>  <font class=java-reserved_word><strong>public</strong></font> String[] getOptions() <font class=java-bracket>{</font><br>                <font class=java-comment>// 實際上這些字串是從資料庫中查到的啦&#8230;</font><br>    <font class=java-reserved_word><strong>return</strong></font> <font class=java-reserved_word><strong>new</strong></font> String[] <font class=java-bracket>{</font><font class=java-string>"良葛格"</font>, <font class=java-string>"毛美眉"</font>, <font class=java-string>"米小狗"</font><font class=java-bracket>}</font>; <br>  <font class=java-bracket>}</font><br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>傳回的字串陣列，您要填寫到下拉選單中，當然，首先我們要在dwr.xml中開發這個物件&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;?xml version=<font class=java-string>"1.0"</font> encoding=<font class=java-string>"UTF-8"</font>?&gt;<br>&lt;!DOCTYPE dwr PUBLIC <font class=java-string>"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</font> <font class=java-string>"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</font>&gt;<br> <br>&lt;dwr&gt;<br>  &lt;allow&gt;<br>    &lt;create creator=<font class=java-string>"new"</font> javascript=<font class=java-string>"OPT"</font>&gt;<br>        &lt;param name=<font class=java-string>"class"</font> value=<font class=java-string>"onlyfun.caterpillar.Option"</font>/&gt;<br>    &lt;/create&gt;  <br>  &lt;/allow&gt;<br>&lt;/dwr&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>這是我們的網頁&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;!DOCTYPE HTML PUBLIC <font class=java-string>"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv=<font class=java-string>"Content-Type"</font> content=<font class=java-string>"text/html; charset=BIG5"</font>&gt;<br>&lt;script src=<font class=java-string>"option.js"</font> type=<font class=java-string>"text/javascript"</font>&gt;&lt;/script&gt;<br>&lt;script src=<font class=java-string>"dwr/interface/OPT.js"</font> type=<font class=java-string>"text/javascript"</font>&gt;&lt;/script&gt;<br>&lt;script src=<font class=java-string>"dwr/engine.js"</font> type=<font class=java-string>"text/javascript"</font>&gt;&lt;/script&gt;<br>&lt;script src=<font class=java-string>"dwr/util.js"</font> type=<font class=java-string>"text/javascript"</font>&gt;&lt;/script&gt;<br>&nbsp;<br>&lt;/head&gt;<br>&nbsp;<br>&lt;body&gt;<br>    選項: &lt;select id=<font class=java-string>"opts"</font>&gt;&lt;/select&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>傳回的字串陣列會填入opts這個select中，我們的option.js如下&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>window.onload = function() <font class=java-bracket>{</font><br>    OPT.getOptions(populate);  <br><font class=java-bracket>}</font>;<br>&nbsp;<br>function populate(list)<font class=java-bracket>{</font><br>    DWRUtil.removeAllOptions(<font class=java-string>"opts"</font>);<br>    DWRUtil.addOptions(<font class=java-string>"opts"</font>, list);<br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>夠簡單了&#8230;不需要解釋了&#8230; <br><br>看一下結果&#8230;&nbsp; </span><br><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/88753484.jpg"><br><br><span class=javascript id=text166427>好啦！我知道有人在說了，這個程式有夠無聊&#8230;<img alt=Dead src="http://www.javaworld.com.tw/jute/images/smiles/smile_dead.gif" width=15> <br><br>改一下！就是個不錯的範例了，例如連動方塊，唔！在Ajax in action中叫啥？Dynamic double combo？&#8230; <br><br>假設一個會去從資料庫中查詢資料的Java程式示意如下： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>package</strong></font> onlyfun.caterpillar;<br>&nbsp;<br><font class=java-reserved_word><strong>import</strong></font> java.util.Map;<br><font class=java-reserved_word><strong>import</strong></font> java.util.TreeMap;<br>&nbsp;<br><font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> Bike <font class=java-bracket>{</font><br>&nbsp;&nbsp;<font class=java-reserved_word><strong>private</strong></font> Map&lt;String, String[]&gt; bikes;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<font class=java-reserved_word><strong>public</strong></font> Bike() <font class=java-bracket>{</font><br>&nbsp;&nbsp;&nbsp;&nbsp;bikes = <font class=java-reserved_word><strong>new</strong></font> TreeMap&lt;String, String[]&gt;();<br>&nbsp;&nbsp;&nbsp;&nbsp;bikes.put(<font class=java-string>"2000"</font>, <font class=java-reserved_word><strong>new</strong></font> String[] <font class=java-bracket>{</font><font class=java-string>"2000 T1"</font>, <font class=java-string>"2000 T2"</font>, <font class=java-string>"2000 T3"</font><font class=java-bracket>}</font>);<br>&nbsp;&nbsp;&nbsp;&nbsp;bikes.put(<font class=java-string>"2001"</font>, <font class=java-reserved_word><strong>new</strong></font> String[] <font class=java-bracket>{</font><font class=java-string>"2001 A1"</font>, <font class=java-string>"2001 A2"</font><font class=java-bracket>}</font>);<br>&nbsp;&nbsp;&nbsp;&nbsp;bikes.put(<font class=java-string>"2002"</font>, <font class=java-reserved_word><strong>new</strong></font> String[] <font class=java-bracket>{</font><font class=java-string>"2002 BW1"</font>, <font class=java-string>"2002 BW2"</font>, <font class=java-string>"2002 BW"</font><font class=java-bracket>}</font>);<br>&nbsp;&nbsp;&nbsp;&nbsp;bikes.put(<font class=java-string>"2003"</font>, <font class=java-reserved_word><strong>new</strong></font> String[] <font class=java-bracket>{</font><font class=java-string>"2003 S320"</font><font class=java-bracket>}</font>);<br>&nbsp;&nbsp;&nbsp;&nbsp;bikes.put(<font class=java-string>"2004"</font>, <font class=java-reserved_word><strong>new</strong></font> String[] <font class=java-bracket>{</font><font class=java-string>"2004 TA1"</font>, <font class=java-string>"2004 TA2"</font>, <font class=java-string>"2004 TA3"</font><font class=java-bracket>}</font>);<br>&nbsp;&nbsp;<font class=java-bracket>}</font><br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<font class=java-reserved_word><strong>public</strong></font> String[] getYears() <font class=java-bracket>{</font><br>&nbsp;&nbsp;&nbsp;&nbsp;String[] keys = <font class=java-reserved_word><strong>new</strong></font> String[bikes.size()];<br>&nbsp;&nbsp;&nbsp;&nbsp;<font class=java-reserved_word><strong>int</strong></font> i = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;<font class=java-reserved_word><strong>for</strong></font>(String key : bikes.keySet()) <font class=java-bracket>{</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keys[i++] = key;<br>&nbsp;&nbsp;&nbsp;&nbsp;<font class=java-bracket>}</font><br>&nbsp;&nbsp;&nbsp;&nbsp;<font class=java-reserved_word><strong>return</strong></font> keys; <br>&nbsp;&nbsp;<font class=java-bracket>}</font><br>&nbsp;&nbsp;<br>&nbsp;&nbsp;<font class=java-reserved_word><strong>public</strong></font> String[] getBikes(String year) <font class=java-bracket>{</font><br>&nbsp;&nbsp;&nbsp;&nbsp;<font class=java-reserved_word><strong>return</strong></font> bikes.get(year);<br>&nbsp;&nbsp;<font class=java-bracket>}</font><br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>getYears()跟getBkies()分別表示產品的年份跟型號，這邊用Map模擬，實際上資料是來自資料庫的查詢。 <br><br>一樣的，在dwr.xml中設定： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;?xml version=<font class=java-string>"1.0"</font> encoding=<font class=java-string>"UTF-8"</font>?&gt;<br>&lt;!DOCTYPE dwr PUBLIC <font class=java-string>"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</font> <font class=java-string>"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</font>&gt;<br> <br>&lt;dwr&gt;<br>  &lt;allow&gt;<br>    &lt;create creator=<font class=java-string>"new"</font> javascript=<font class=java-string>"Bike"</font> scope=<font class=java-string>"application"</font>&gt;<br>        &lt;param name=<font class=java-string>"class"</font> value=<font class=java-string>"onlyfun.caterpillar.Bike"</font>/&gt;<br>    &lt;/create&gt;<br>  &lt;/allow&gt;<br>&lt;/dwr&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>我們會有個腳踏車年份與型號查詢頁面： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;!DOCTYPE HTML PUBLIC <font class=java-string>"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv=<font class=java-string>"Content-Type"</font> content=<font class=java-string>"text/html; charset=BIG5"</font>&gt;<br>&lt;title&gt;Insert title here&lt;/title&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/interface/Bike.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/engine.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/util.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'bike.js'</font>&gt;&lt;/script&gt;<br>&lt;/head&gt;<br>&lt;body onload=<font class=java-string>"refreshYearList();"</font>&gt;<br>&nbsp;&nbsp;年份：&lt;select id=<font class=java-string>"years"</font> onchange=<font class=java-string>"refreshBikeList();"</font>&gt;&lt;/select&gt;&lt;br/&gt;&lt;br/&gt;<br>&nbsp;&nbsp;型號：&lt;select id=<font class=java-string>"bikes"</font>&gt;&lt;/select&gt;&lt;br/&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>注意，在選完第一個年份後，會觸發onchange事件，接著第二個下拉選單會自動填上對應年份的型號，而不是按鈕按下，再去取得第二個下拉選單，然後refresh...blah...blah... <br><br>bike.js如下&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>function refreshYearList() <font class=java-bracket>{</font><br>    Bike.getYears(populateYearList);<br><font class=java-bracket>}</font><br>&nbsp;<br>function populateYearList(list)<font class=java-bracket>{</font><br>    DWRUtil.removeAllOptions(<font class=java-string>"years"</font>);<br>    DWRUtil.addOptions(<font class=java-string>"years"</font>, list);<br>    refreshBikeList();<br><font class=java-bracket>}</font><br>&nbsp;<br>function refreshBikeList() <font class=java-bracket>{</font><br>    var year = $(<font class=java-string>"years"</font>).value;<br>    Bike.getBikes(year, populateBikeList);<br><font class=java-bracket>}</font><br>&nbsp;<br>function populateBikeList(list)<font class=java-bracket>{</font><br>    DWRUtil.removeAllOptions(<font class=java-string>"bikes"</font>);<br>    DWRUtil.addOptions(<font class=java-string>"bikes"</font>, list);<br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>一樣很簡單&#8230; <br><br>看個無聊的畫面&#8230;XD </span><br><br><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/42270937.jpg">
<img src ="http://www.blogjava.net/jesson2005/aggbug/111005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 16:28 <a href="http://www.blogjava.net/jesson2005/articles/111005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR 入門與應用（一） </title><link>http://www.blogjava.net/jesson2005/articles/110998.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110998.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110998.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110998.html</trackback:ping><description><![CDATA[<div class=postText><span class=javascript id=text165881>Java 開發人員與網頁設計人員的橋樑 DWR&#8230;呃！我懶得寫簡介了&#8230;直接來看看可以做什麼吧！&#8230; <br><br>請先到 <a class=ilink href="http://getahead.ltd.uk/dwr/" target=_blank><u><font color=#0000ff>http://getahead.ltd.uk/dwr/</font></u></a> 下載 dwr.jar，放到WEB-INF/lib下&#8230; <br><br>負責處理客戶端請求，並呼叫Java物件的是DWRServlet，DWR其實也有些Model 2的味道，只是View的這一層比較弱，因為放到客戶端的JavaScript應用程式中&#8230; <br><br>在web.xml中加入DWRServlet&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;?xml version=<font class=java-string>"1.0"</font> encoding=<font class=java-string>"UTF-8"</font>?&gt;<br>&lt;web-app id=<font class=java-string>"WebApp_ID"</font> version=<font class=java-string>"2.4"</font> <br>xmlns=<font class=java-string>"http://java.sun.com/xml/ns/j2ee"</font> <br>xmlns:xsi=<font class=java-string>"http://www.w3.org/2001/XMLSchema-instance"</font> <br>xsi:schemaLocation=<br><font class=java-string>"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</font>&gt;<br>  &lt;display-name&gt;<br>  ajaxDWR&lt;/display-name&gt;<br>  &lt;servlet&gt;<br>    &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;<br>    &lt;servlet-class&gt;uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class&gt;<br>    &lt;init-param&gt;<br>      &lt;description&gt;<br>      &lt;/description&gt;<br>      &lt;param-name&gt;debug&lt;/param-name&gt;<br>      &lt;param-value&gt;true&lt;/param-value&gt;<br>    &lt;/init-param&gt;<br>  &lt;/servlet&gt;<br>  &lt;servlet-mapping&gt;<br>    &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;<br>    &lt;url-pattern&gt;/dwr<font class=java-comment>/*&lt;/url-pattern&gt;<br>  &lt;/servlet-mapping&gt;<br>&lt;/web-app&gt;<br></font></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>接下來寫個簡單的Hello吧！ <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>package</strong></font> onlyfun.caterpillar;<br>&nbsp;<br><font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> Hello <font class=java-bracket>{</font><br>  <font class=java-reserved_word><strong>public</strong></font> String hello(String name) <font class=java-bracket>{</font><br>      <font class=java-reserved_word><strong>return</strong></font> <font class=java-string>"哈囉！"</font> + name + <font class=java-string>"！您的第一個DWR！"</font>;<br>    <font class=java-bracket>}</font><br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>客戶端要呼叫這個Java物件，傳給它參數，而後傳回一個字串，客戶端再顯示這個字串，神奇？其實是要告訴DWRServlet這件事，這需要一個dwr.xml： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;?xml version=<font class=java-string>"1.0"</font> encoding=<font class=java-string>"UTF-8"</font>?&gt;<br>&lt;!DOCTYPE dwr PUBLIC <font class=java-string>"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</font><br> <font class=java-string>"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</font>&gt;<br> <br>&lt;dwr&gt;<br>  &lt;allow&gt;<br>    &lt;create creator=<font class=java-string>"new"</font> javascript=<font class=java-string>"Hello"</font>&gt;<br>      &lt;param name=<font class=java-string>"class"</font> value=<font class=java-string>"onlyfun.caterpillar.Hello"</font> /&gt;<br>    &lt;/create&gt;<br>  &lt;/allow&gt;<br>&lt;/dwr&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>creator設定為new，表示使用Hello的無參數建構子來生成物件，javascript設定為Hello，表示客戶端JavaScript程式可以使用Hello來呼叫對應的onlyfun.caterpillar.Hello物件。 <br><br>來寫個客戶端的網頁，當中有一個輸入欄位&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;!DOCTYPE HTML PUBLIC <font class=java-string>"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv=<font class=java-string>"Content-Type"</font> content=<font class=java-string>"text/html; charset=BIG5"</font>&gt;<br>  &lt;title&gt;第一個DWR程式&lt;/title&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/interface/Hello.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/engine.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/util.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'hello.js'</font>&gt;&lt;/script&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&nbsp;<br>&lt;input id=<font class=java-string>"user"</font> type=<font class=java-string>"text"</font> /&gt;<br>&lt;input type=<font class=java-string>'button'</font> value=<font class=java-string>'哈囉'</font> onclick=<font class=java-string>'hello();'</font> /&gt; <br>&nbsp;<br>&lt;div id=<font class=java-string>"result"</font>&gt;&lt;/div&gt;<br>&nbsp;<br>&lt;/body&gt;<br>&lt;/html&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>dwr/interface/Hello.js是由DWRServlet根據dwr.xml中的設定生成的，engine.js負責客戶端伺服端溝通，util.js是一些好用的JavaScript程式，可以讓您少寫很多JavaScript。 <br><br>hello.js是我們自訂的函式，按下按鈕後，會呼叫當中的hello()函式： <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>function hello() <font class=java-bracket>{</font><br>    var user = $(<font class=java-string>'user'</font>).value;<br>    Hello.hello(user, callback);<br><font class=java-bracket>}</font><br>&nbsp;<br>function callback(msg) <font class=java-bracket>{</font><br>   DWRUtil.setValue(<font class=java-string>'result'</font>, msg);<br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>${'user'}取得輸入欄位的DOM物件，value取得當中的欄位值，而後呼叫Hello.hello()，並將value當作參數傳送&#8230; 結果是呼叫Server端的Hello Java物件，當結果傳回後，會呼叫JavaScript的callback函式，DWRUtil的setValue()方法會將傳回的msg設定給指定 id的DOM，結果就是&#8230;啥！AJAX的功能在哪&#8230;就這個而言就是發出非同步請求，而回應不用Refresh頁面啦！&nbsp; </span><br><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/helloDWR.jpg"><br><br><span class=javascript id=text165882>好啦！這個無聊的Hello DWR可以做啥！&#8230;XD <br><br>已經可以讓您做個簡單的文字提示功能了&#8230;像這個&#8230; <br><a class=ilink href="http://caterpillar.onlyfun.net/Gossip/index.html" target=_blank><u><font color=#0000ff>http://caterpillar.onlyfun.net/Gossip/index.html</font></u></a> <br><br>把滑鼠指到書的照片上，會顯示提示文字，這些提示文字本身不是存在網頁上的，而是在Server端，當滑鼠指到書上時，會用Request object去抓，然後顯示在框框中&#8230; <br><br>當然！我的網站只支援PHP，所以那不是DWR完成的功能，而且我是直接用Request object跟DOM去慢慢刻的&#8230;對初學者來說已經有些麻煩了&#8230;XD <br><br>不過！用DWR就可以很簡單完成這個功能&#8230; <br><br>先寫個Java類別吧！會抓properties檔案中的文字訊息，例如&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre><font class=java-reserved_word><strong>package</strong></font> onlyfun.caterpillar;<br>&nbsp;<br><font class=java-reserved_word><strong>import</strong></font> java.util.ResourceBundle;<br>&nbsp;<br><font class=java-reserved_word><strong>public</strong></font> <font class=java-reserved_word><strong>class</strong></font> Book <font class=java-bracket>{</font><br>  <font class=java-reserved_word><strong>private</strong></font> ResourceBundle resource;<br>  <br>  <font class=java-reserved_word><strong>public</strong></font> Book() <font class=java-bracket>{</font><br>    resource = ResourceBundle.getBundle(<font class=java-string>"book"</font>); <br>  <font class=java-bracket>}</font><br>        <br>  <font class=java-reserved_word><strong>public</strong></font> String getDescription(String key) <font class=java-bracket>{</font><br>    <font class=java-reserved_word><strong>return</strong></font> resource.getString(key);<br>  <font class=java-bracket>}</font><br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>從程式中就知道，它會去抓book_zh_TW.properties的資料，這不是重點啦！只是Java的一個功能，我們要看的是DWR，不過先把book_zh_TW.properties準備好&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>java=Java 學習筆記的介紹 &#8230; BlaBla...<br>spring=Spring 技術手冊的介紹&#8230;BlaBla...<br>ajax=Ajax in action 中文版的介紹&#8230;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>唔！裏頭是中文字，自己用native2ascii轉換吧&#8230;這也不是重點&#8230;我們是要看DWR怎麼做到文字提示功能&#8230; <br><br>一樣的&#8230;要開放這個Book物件，在dwr.xml中&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;?xml version=<font class=java-string>"1.0"</font> encoding=<font class=java-string>"UTF-8"</font>?&gt;<br>&lt;!DOCTYPE dwr PUBLIC <font class=java-string>"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</font> <br><font class=java-string>"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</font>&gt;<br> <br>&lt;dwr&gt;<br>  &lt;allow&gt;<br>  &lt;create creator=<font class=java-string>"new"</font> javascript=<font class=java-string>"Book"</font> scope=<font class=java-string>"application"</font>&gt;<br>            &lt;param name=<font class=java-string>"class"</font> value=<font class=java-string>"onlyfun.caterpillar.Book"</font>/&gt;<br>        &lt;/create&gt;  <br>  &lt;/allow&gt;<br>&lt;/dwr&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>scope設定為application，表示這個Book物件在整個應用程式階段都活著。 <br><br>然後，客戶端寫個網頁&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br>28<br>29<br>30<br>31<br>32<br>33<br>34<br>35<br>36<br>37<br>38<br>39<br>40<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>&lt;!DOCTYPE HTML PUBLIC <font class=java-string>"-//W3C//DTD HTML 4.01 Transitional//EN"</font>&gt;<br>&lt;html&gt;<br>&lt;head&gt;<br>&lt;meta http-equiv=<font class=java-string>"Content-Type"</font> content=<font class=java-string>"text/html; charset=BIG5"</font>&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/interface/Book.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/engine.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'dwr/util.js'</font>&gt;&lt;/script&gt;<br>  &lt;script type=<font class=java-string>'text/javascript'</font> src=<font class=java-string>'book.js'</font>&gt;&lt;/script&gt;<br>&lt;title&gt;個人著／譯作&lt;/title&gt;<br>&lt;/head&gt;<br>&lt;body&gt;<br>&nbsp;<br>      &lt;div id=<font class=java-string>"ajax"</font> onmouseover=<font class=java-string>"getBookData(this);"</font><br> onmouseout=<font class=java-string>"clearData();"</font>&gt;&lt;a<br> href=<font class=java-string>"http://www.gotop.com.tw/waweb2004/home/home.aspx?pg=HM010X&amp;bn=AXP011800"</font>&gt;&lt;small&gt;&lt;img<br> style=<font class=java-string>"border: 0px solid ; width: 80px; height: 110px; float: left;"</font><br> alt=<font class=java-string>"Ajax in action 中文版"</font> title=<font class=java-string>"Ajax in action 中文版"</font><br> src=<font class=java-string>"images/ajax_in_action_c.jpg"</font> hspace=<font class=java-string>"10"</font> vspace=<font class=java-string>"2"</font>&gt;&lt;/small&gt;&lt;/a&gt;&lt;/div&gt;<br>&nbsp;<br>      &lt;div id=<font class=java-string>"spring"</font> onmouseover=<font class=java-string>"getBookData(this);"</font><br> onmouseout=<font class=java-string>"clearData();"</font>&gt;&lt;a<br> href=<font class=java-string>"http://www.gotop.com.tw/waweb2004/home/home.aspx?pg=HM010X&amp;bn=ACL021000"</font>&gt;&lt;small&gt;&lt;img<br> style=<font class=java-string>"border: 0px solid ; width: 80px; height: 110px; float: left;"</font><br> alt=<font class=java-string>"Spring 技術手冊"</font> title=<font class=java-string>"Spring 技術手冊"</font><br> src=<font class=java-string>"images/SpringTech_S.jpg"</font> hspace=<font class=java-string>"10"</font> vspace=<font class=java-string>"2"</font>&gt;&lt;/small&gt;&lt;/a&gt;&lt;/div&gt;<br>&nbsp;<br>      &lt;div id=<font class=java-string>"java"</font> onmouseover=<font class=java-string>"getBookData(this);"</font><br> onmouseout=<font class=java-string>"clearData();"</font>&gt;&lt;a<br> href=<font class=java-string>"http://www.gotop.com.tw/waweb2004/home/home.aspx?pg=HM010X&amp;bn=ACL020931"</font>&gt;&lt;small&gt;&lt;img<br> style=<font class=java-string>"border: 0px solid ; width: 80px; height: 110px; float: left;"</font><br> alt=<font class=java-string>"Java 學習筆記"</font> title=<font class=java-string>"Java 學習筆記"</font><br> src=<font class=java-string>"images/JavaGossip_Cover_Small.jpg"</font> hspace=<font class=java-string>"10"</font><br> vspace=<font class=java-string>"2"</font>&gt;&lt;/small&gt;&lt;/a&gt;&lt;/div&gt;<br> <br>    &lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;<br> <br>    &lt;div id=<font class=java-string>"info"</font>&gt;&lt;/div&gt;<br>&nbsp;<br>&lt;/body&gt;<br>&lt;/html&gt;<br></pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>重點在於onmouseover跟onmouseout，滑鼠移入與移出時會呼叫的函式，還有最下面的info，抓回來的書籍介紹會放到當中&#8230; <br><br>book.js如下，簡單的很&#8230; <br>
<table class=java cellSpacing=1 cellPadding=3 bgColor=#999999 border=0>
    <tbody>
        <tr>
            <td vAlign=top align=left width=1 bgColor=#dddddd>
            <pre><font color=#555555>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br></font></pre>
            </td>
            <td vAlign=top align=left bgColor=#ffffff>
            <pre>function getBookData(ele) <font class=java-bracket>{</font><br>  Book.getDescription(ele.id, setBookData);<br><font class=java-bracket>}</font><br>&nbsp;<br>function setBookData(description) <font class=java-bracket>{</font><br>  DWRUtil.setValue(<font class=java-string>'info'</font>, description);<br><font class=java-bracket>}</font><br>&nbsp;<br>function clearData() <font class=java-bracket>{</font><br>  DWRUtil.setValue(<font class=java-string>'info'</font>, <font class=java-string>''</font>);<br><font class=java-bracket>}</font> </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>程式很簡單，我懶得解釋了&#8230;XD <br><br>看一下畫面好了&#8230;這是滑鼠移到 <a href="http://www.gotop.com.tw/waweb2004/home/home.aspx?pg=HM010X&amp;bn=AXP011800"><font color=#ff0000><u>Ajax in action中文版</u></font></a> 上的介紹畫面&#8230; </span><br><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/helloDWR2.jpg"><br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1186566</p>
<br></div>
<div class=postFoot>
<script src="http://localhost:82/PromoteIcon.aspx?id=1186566"></script>
[<a title=功能强大的网络收藏夹，一秒钟操作就可以轻松实现保存带来的价值、分享带来的快乐 href="javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(saveit=window.open('http://wz.csdn.net/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=590,height=300,left=75,top=20,status=no,resizable=yes'));saveit.focus();"><u><font color=#0000ff>收藏到我的网摘</font></u></a>]&nbsp;&nbsp; 良葛格发表于 2006年09月06日 20:06:00 </div>
<link href="http://blog.csdn.net/caterpillar_here/Services/Pingback.aspx" rel=pingback><!--<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:descriptionrdf:about="http://blog.csdn.net/caterpillar_here/archive/2006/09/06/1186566.aspx"dc:identifier="http://blog.csdn.net/caterpillar_here/archive/2006/09/06/1186566.aspx"dc:title="dwr 入門與應用（一）"trackback:ping="http://tb.blog.csdn.net/TrackBack.aspx?PostId=1186566" /></rdf:rdf>-->
<script>function hide(){showComment();}</script>
<br><br><br>
<div class=post id=csdn_zhaig_ad_yahoo>
<div class=postTitle>特别推荐：</div>
<ul class=postText>
    <li><a href="http://tagegg.csdn.net/a.aspx?action=click&amp;unionuser=19&amp;adurl=http%3a%2f%2fwww.fsailing.com%2fcourse%2fcourse8.html&amp;adid=937||||||||||&amp;tag=ajax" target=_blank><u><font color=#0000ff>专业的Java开源技术培训</font></u></a><br>蓝点世纪外企Java软件工程师培训业余班，助你实现 月薪1000-6000元的飞跃！ <a href="http://tag.csdn.net/tag/ajax" target=_blank><font color=#0000ff><u>ajax</u></font></a></li>
    <li><a href="http://tagegg.csdn.net/a.aspx?action=click&amp;unionuser=19&amp;adurl=http%3a%2f%2ftagegg.csdn.net%2fsubject%2fxmas%2f&amp;adid=756|||||||||&amp;tag=ajax" target=_blank><u><font color=#0000ff>每天50元！百万用户等你来！</font></u></a><br>广告价格高,预算有限,产品推不出去,怎么办? Tag广告-灵活控制成本,直达目标用户!经济、实惠 <a href="http://tag.csdn.net/tag/ajax" target=_blank><font color=#0000ff><u>ajax</u></font></a></li>
    <li><a href="http://tagegg.csdn.net/a.aspx?action=click&amp;unionuser=19&amp;adurl=http%3a%2f%2fwww.oristand.com%2fCMS_Course%2fCourseIndex.aspx&amp;adid=1042|||||||||&amp;tag=ajax" target=_blank><u><font color=#0000ff>把握最前端的技术 获得最抢手的职业</font></u></a><br>极限编程方法挖掘您架构师的潜质和拓展能力 东方标准　国际软件工程师就业班 4月开课安排 <a href="http://tag.csdn.net/tag/ajax" target=_blank><font color=#0000ff><u>ajax</u></font></a></li>
    <li><a href="http://tagegg.csdn.net/a.aspx?action=click&amp;unionuser=19&amp;adurl=http%3a%2f%2fclub.book.csdn.net%2fpeople%2fmylist599.html&amp;adid=812||&amp;tag=ajax" target=_blank><u><font color=#0000ff>AJAX学习必备的三本书</font></u></a><br>AJAX图书十几本？那本书最适合您？ CSDN读书频道独家奉献 <a href="http://tag.csdn.net/tag/ajax" target=_blank><font color=#0000ff><u>ajax</u></font></a></li>
    <li><a href="http://tagegg.csdn.net/a.aspx?action=click&amp;unionuser=19&amp;adurl=http%3a%2f%2fbook.csdn.net%2fbookfiles%2f11%2f&amp;adid=652||&amp;tag=ajax" target=_blank><u><font color=#0000ff>《Ajax基础教程》六章连载中</font></u></a><br>详解Ajax开发工具与JavaScript测试 CSDN读书频道独家奉献 <a href="http://tag.csdn.net/tag/ajax" target=_blank><u><font color=#0000ff>ajax</font></u></a></li>
</ul>
</div>
<img src ="http://www.blogjava.net/jesson2005/aggbug/110998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 16:14 <a href="http://www.blogjava.net/jesson2005/articles/110998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr简介 </title><link>http://www.blogjava.net/jesson2005/articles/110975.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110975.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110975.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110975.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110975.html</trackback:ping><description><![CDATA[<div><span>最近</span><span>Ajax</span><span>比较火，全世界都在讨论。于是我也掺和掺和，直接用</span><span>XMLHttpRequest</span><span>？现在的我还没有那个水平。用</span><span>Echo2</span><span>或者</span><span>backbase</span><span>，又感觉那些纯</span><span>Ajax</span><span>的</span><span>framework</span><span>太重量级了。我要的只是一些简单的应用而已。于是寻觅的重点放在了一些对</span><span>xmlhttpRequest</span><span>进行轻量级包装的代码库上了。于是我找到了</span><span>DWR</span><span>（</span><span>Direct Web Remoting</span><span>）。</span><span>DWR</span><span>的口号是</span><span>AJAX and XMLHttpRequest made easy</span><span>，并且它也基本上做到了这一点。它提供了一个友好的框架和一些很有用的</span><span>JavaScript</span><span>库，可以让我用起</span><span>Ajax</span><span>更容易些。详细的信息可以到他们的网站</span><span><a href="http://www.getahead.ltd.uk/dwr/">http://www.getahead.ltd.uk/dwr/</a></span><span>。顺便在介绍一个网站吧：</span><span><a href="http://www.ajaxmatters.com/">http://www.ajaxmatters.com</a> </span><span>这里也有很多关于</span><span>Ajax</span><span>的资源。</span></div>
<p>&nbsp;</p>
<p><span>下面来简单介绍一下</span><span>DWR</span><span>。</span></p>
<p><span>其实在没有</span><span>XMLHttpRequest</span><span>前</span><span>DWR</span><span>就有了，那时它用的是</span><span>IFrame</span><span>，效果很差，所以我看看了就没有再</span><span>diao</span><span>它。现在的</span><span>DWR</span><span>主要用</span><span>XMLHttpRequest</span><span>，当然也可以选者用</span><span>IFrame</span><span>，但是不推荐。</span></p>
<p><span>DWR</span><span>是个</span><span>open source software</span><span>，授权方式是</span> <span><a href="http://www.apache.org/licenses/LICENSE-2.0.html"><span>ASL version 2.0</span></a></span><span>的。现在网站上</span><span>examples and tutorials</span><span>做的也不错。我就根据这些东西自己也做了一个应用，在本文的后面我会详细讲到。</span></p>
<p><span>现在</span><span>DWR</span><span>的最新版本是</span><span>1.0RC1</span><span>。在我的试用环境相还算比较稳定，没有出现什么问题。</span></p>
<p><span>DWR</span><span>本身以一个</span><span>dwr.jar</span><span>的</span><span>jar</span><span>包存在，它的入口时一个</span><span>Servlet</span><span>（</span><span>uk.ltd.getahead.dwr.DWRServlet</span><span>）所以要在</span><span>web.xml</span><span>里配置一下就可以了。具体配置看这里</span><span><a href="http://www.getahead.ltd.uk/dwr/intro.html">http://www.getahead.ltd.uk/dwr/intro.html</a></span><span>。比较简单。</span><span>dwr</span><span>为我们提供了一个</span><span>framework</span><span>帮我们很容易的实现</span><span>JavaScript</span><span>和</span><span>java</span><span>之间的通信。</span></p>
<p>&#160;</p>
<p><span><img height=281 alt=howitworks.png src="http://www.blogjava.net/images/blogjava_net/mstar/pics/howitworks.png" width=521 border=0><br><font color=#000000>我还没有看过</font></span><font color=#000000><font size=+0><span>dwr</span><span>的源码，具体他是怎么实现的我也不太清楚。但大致上肯定是通过</span><span>xmlhttprequest</span><span>来调用它的</span><span>servlet</span><span>然后把数据用</span><span>xml</span><span>打包解包了。其实我觉得这部分到不是</span><span>dwr</span><span>给我带来的最方便的地方。最方便的地方应该是他的那些</span><span>js</span><span>的库。</span></font></font></p>
<p><font color=#000000><font size=+0><span>所以下面我要介绍一下它的两个重要</span><span>js</span><span>对象。</span></font></font></p>
<p><font color=#000000><font size=+0><span>DWREngine </span><span>（</span><span>engine.js</span><span>中），</span><span>DWRUtil (util.js</span><span>中</span><span>)</span><span>。</span></font></font></p>
<p><font color=#000000><font size=+0><span>DWREngine</span><span>中的方法是基本上是关于</span><span>XMLHttpRequest</span><span>的。</span></font></font></p>
<p><font color=#000000><font size=+0><span>下面中介绍一些</span></font></font></p>
<p><span><font color=#000000><font size=+0>DWREngine.setErrorHandler(handler)</font></font></span></p>
<p><font color=#000000><font size=+0><span>默认的错误处理时弹出一个对话框，你可以通过这个方法改变成你需要的表现形式。</span></font></font></p>
<p><span><font color=#000000><font size=+0>DWREngine.setWarningHandler(handler)</font></font></span></p>
<p><span><font color=#000000>改变默认的警告处理形式</font></span></p>
<p><span>DWREngine.beginBatch()</span></p>
<p><span>Some Remote Function&#8230;</span></p>
<p><span>DWREngine.endBatch()</span></p>
<p><span>当你有几个远程调用要一起进行时，就要用到这两个方法。</span></p>
<p><span>如果不用这两个方法，你就会发现你的远程调用并不以你想象的顺序进行。</span></p>
<p><span>DWREngine</span><span>中还有一些其它的方法，我没有用过。你可以通过</span><span>dwr</span><span>的</span><span>js-doc</span><span>来看。如果通过文档看不懂它是干什么用的，就看</span><span>js</span><span>源码，源码的注释也是比较详细的。</span></p>
<p><span>DWRUtil</span><span>中也有一些很有用的方法。这些方法一般是编写</span><span>js</span><span>的辅助方法。</span></p>
<p><span>比如</span><span>setValue</span><span>和</span><span>getValue</span><span>。大多数</span><span>html</span><span>标签有</span><span>value</span><span>属性，这时你要获取或者设置它的值时就用</span><span>$(&#8220;someid&#8221;).value</span><span>就可以了。但是有些</span><span>html</span><span>标记是没有</span><span>value</span><span>属性的，它的值时在标签的中间，如</span><span>&lt;span id=&#8221;span<st1:chmetcnv UnitName="&#8221;" SourceValue="1" HasSpace="False" Negative="False" NumberType="1" TCSC="0" w:st="on">1&#8221;</st1:chmetcnv>&gt;some value&lt;/span&gt;</span><span>这时你要取或设它的值的时候就用</span><span>DWRUtil.setValue($(&#8220;span1&#8221;)</span><span>，</span><span>someValue)</span><span>。这样你就可以在客户端动态的表现一些数据了。</span></p>
<p><span>还有很多很好用的方法，</span><span>dwr</span><span>的例子中有一些说明，源码中的注释也比较详细。</span></p>
<p><span>Dwr</span><span>就介绍到这里吧。下一篇，我做了个</span><span>table</span><span>的例子。<br><img height=618 alt=screen.jpg src="http://www.blogjava.net/images/blogjava_net/mstar/pics/screen.jpg" width=802 border=0></span></p>
<img src ="http://www.blogjava.net/jesson2005/aggbug/110975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 15:34 <a href="http://www.blogjava.net/jesson2005/articles/110975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把DWR的配置写到Spring的配置文件里（Spring2 新特性-自定义schema初体验） </title><link>http://www.blogjava.net/jesson2005/articles/110973.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110973.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110973.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110973.html</trackback:ping><description><![CDATA[<div class=postTitle>要读懂我这篇文章估计需要一些前期知识：<br>你要知道Spring是什么，并且要知道Spring已经出了2.0的版本了。<br>你要知道DWR是什么，并且要知道DWR也要出2.0的版本了。<br><br>呵呵，开个玩笑&#8230;&#8230;。这年头在BlogJava上混的，估计没几个不知道上面这两个项了。<br><br>好了，现在言归正传。DWR本身就提供对Spring的支持，可以直接把Spring中的Bean暴露给客户端浏览器的Javascript调用。在dwr.xml中的写法是这样的：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">create&nbsp;</span><span style="COLOR: #ff0000">creator</span><span style="COLOR: #0000ff">="spring"</span><span style="COLOR: #ff0000">&nbsp;javascript</span><span style="COLOR: #0000ff">="AjaxPortalService"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="beanName"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="AjaxPortalService"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="changeWondowState"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="changeWorkbenchState"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="changeWindowOrder"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>这样写到也没什么，只是把项目分模块以后，虽有的配置都写到一个dwr.xml文件里面维护起来比较麻烦，尤其再遇到版本管理中的代码合并。所以曾经我扩展了DWR，让它可以从多个文件读取配置信息。然后每个模块自己一个配置文件，跟着source一起走。这样做也有问题，就是现在Java应用程序的配置文件太多啦！Spring的配置，WebWork的配置，Hibernate的配置，DWR的配置，再加上一些杂七杂八的xml和properties。看着这些配置文件简直要疯掉了。<br><br>正在此时，spring2横空出世，现在你可以把一些配置文件合并到一起了。正好趁此机会体验一下Spring2的自定义schema特性。<br><br>目标：<br>把DWR的配置写成这样：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="GBK"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">beans&nbsp;</span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/tx"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/aop"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:dwr</span><span style="COLOR: #0000ff">="http://www.devside.org/schema/spring/dwr"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop&nbsp;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/tx&nbsp;http://www.springframework.org/schema/tx/spring-tx-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.devside.org/schema/spring/dwr&nbsp;http://www.devside.org/schema/spring/dwr.xsd"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;default-autowire</span><span style="COLOR: #0000ff">="byName"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="departmentDao"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.dao.DepartmentDao"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="employeeDao"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.dao.EmployeeDao"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="companyService"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.service.CompanyService"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">aop:config</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">aop:pointcut&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="companyServiceOperation"</span><span style="COLOR: #ff0000">&nbsp;expression</span><span style="COLOR: #0000ff">="execution(*&nbsp;cn.com.legendapl.hellostruts2.service.ICompanyService.*(..))"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">aop:advisor&nbsp;</span><span style="COLOR: #ff0000">advice-ref</span><span style="COLOR: #0000ff">="txAdvice"</span><span style="COLOR: #ff0000">&nbsp;pointcut-ref</span><span style="COLOR: #0000ff">="companyServiceOperation"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">aop:config</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="ajaxCompanyProxy"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.ajax.AjaxCompanyProxy"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:allow&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="ajaxCompanyProxyAllow"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:create&nbsp;</span><span style="COLOR: #ff0000">beanName</span><span style="COLOR: #0000ff">="ajaxCompanyProxy"</span><span style="COLOR: #ff0000">&nbsp;javascript</span><span style="COLOR: #0000ff">="CompanyProxy"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="findEmployeeById"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr:create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:convert&nbsp;</span><span style="COLOR: #ff0000">converter</span><span style="COLOR: #0000ff">="bean"</span><span style="COLOR: #ff0000">&nbsp;match</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.entity.*"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr:allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span></div>
</div>
<p><br>重点在这里：<br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:allow&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="ajaxCompanyProxyAllow"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:create&nbsp;</span><span style="COLOR: #ff0000">beanName</span><span style="COLOR: #0000ff">="ajaxCompanyProxy"</span><span style="COLOR: #ff0000">&nbsp;javascript</span><span style="COLOR: #0000ff">="CompanyProxy"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="findEmployeeById"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr:create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:convert&nbsp;</span><span style="COLOR: #ff0000">converter</span><span style="COLOR: #0000ff">="bean"</span><span style="COLOR: #ff0000">&nbsp;match</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.entity.*"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr:allow</span><span style="COLOR: #0000ff">&gt;</span></p>
<p><span style="COLOR: #0000ff"><font color=#000000>好了现在动手开始做。<br><br>原理其实很简单，现在看张图。画的不好，敬请原谅！<br><br><br><br><img height=362 alt=spring-dwr.png src="http://www.blogjava.net/images/blogjava_net/mstar/pics20050930/spring-dwr.png" width=793 border=0><br><br>从这样图中我们可以看出我们要做如下工作：<br>1、做一个dwr.xsd，定义spring配置文件中的dwr这部分配置的schema。<br>&nbsp;&nbsp;&nbsp;要做这个需要有一定xml和xsd的知识，我也是现学现用啦！<br></font></span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:schema&nbsp;</span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">="http://www.devside.org/schema/spring/dwr"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsd</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:beans</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="COLOR: #ff0000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;targetNamespace</span><span style="COLOR: #0000ff">="http://www.devside.org/schema/spring/dwr"</span><span style="COLOR: #ff0000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;elementFormDefault</span><span style="COLOR: #0000ff">="qualified"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;attributeFormDefault</span><span style="COLOR: #0000ff">="unqualified"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:import&nbsp;</span><span style="COLOR: #ff0000">namespace</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="COLOR: #ff0000">&nbsp;schemaLocation</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="allow"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexContent</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:extension&nbsp;</span><span style="COLOR: #ff0000">base</span><span style="COLOR: #0000ff">="beans:identifiedType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:sequence</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="create"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="createType"</span><span style="COLOR: #ff0000">&nbsp;minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000">&nbsp;maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="convert"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="convertType"</span><span style="COLOR: #ff0000">&nbsp;minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000">&nbsp;maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:sequence</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:extension</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexContent</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:element</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="createType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:sequence</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="auth"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="authType"</span><span style="COLOR: #ff0000">&nbsp;minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000">&nbsp;maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="include"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="includeType"</span><span style="COLOR: #ff0000">&nbsp;minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000">&nbsp;maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="exclude"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="excludeType"</span><span style="COLOR: #ff0000">&nbsp;minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000">&nbsp;maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:sequence</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="beanName"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000">&nbsp;use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="javascript"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000">&nbsp;use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="convertType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="converter"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000">&nbsp;use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="match"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000">&nbsp;use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="authType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="method"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000">&nbsp;use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="role"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000">&nbsp;use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="includeType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="method"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000">&nbsp;use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="excludeType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="method"</span><span style="COLOR: #ff0000">&nbsp;type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000">&nbsp;use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:schema</span><span style="COLOR: #0000ff">&gt;</span></div>
<p>2、我们要做一个DWRNamespaceHandler来处理DWR的配置信息，其实里面就做一件事把AllowBeanDefinitionParser注册给allow节点。因为我们dwr的配置部分根节点就一个标签allow，所以我们就做一个用于解析allow标签的AllowBeanDefinitionParser解析器就行。如果我们的根节点还有其他的标签，同样也要做相应的解析器。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;DWRNamespaceHandler&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;NamespaceHandlerSupport&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;init()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">把AllowBeanDefinitionParser注册到allow节点</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;registerBeanDefinitionParser(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">allow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AllowBeanDefinitionParser());<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>}</span></div>
<br>其实难点是做AllowBeanDefinitionParser，这里你需要一些DOM模型的知识，来操作配置节点的内容。然后根据内容进行处理。在这里我们，需要做三件事：<br>&nbsp;&nbsp; [1]&nbsp; 把配置节点的内容转换成对象模型，即AllowBean（其实就是一些POJO罢了）。<br>&nbsp;&nbsp; [2]&nbsp; 把这个AllowBean注册给Spring的Context，这一步是可选的。因为我们主要是把这个Bean给DWR，当然顺道给Spring一份也没什么问题。<br>&nbsp;&nbsp; [3] 把这个AllowBean注册到AllowBeanHolder。<br><br>3、AllowBeanHolder。<br>&nbsp;&nbsp;&nbsp;其实这就是个简单的singleton类，整个运行期只有一个实例。它就像一个容器，AllowBeanDefinitionParser往里放，DWR的Configuration再从这里取。<br><br>4、扩展DWR的DefaultConfiguration，我们做一个SpringConfiguration。DWR的DefaultConfiguration是负责读取配置信息的。我们在其中加入从AllowBeanHolder读取配置信息的功能即可。<br><br>5、扩展DWR的DWRServlet，我们做一个SpringDWRServlet，原来的DWRServlet加载的是DefaultConfiguration，我们的Serlvet加载我们自己的SpringConfiguration即可。<br><br>6、万事俱备，只欠东风啦。就是让Spring知道我们干了这些！<br>&nbsp;&nbsp;&nbsp;在META-INF目录下（如果没有在src目录下创建一个）加入spring.handlers和spring.schemas两个文件。<br>&nbsp;&nbsp;&nbsp;spring.handlers中的内容：<br><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<font color=#008000>http\:</font></span><font color=#008000><span style="COLOR: #008000">//</span><span style="COLOR: #008000">www.devside.org/schema/spring/dwr=org.devside.core.support.dwr.DWRNamespaceHandler</span></font><br>&nbsp;&nbsp;&nbsp;spring.schemas中的内容：<br>&nbsp;&nbsp; <font color=#008000>http\://www.devside.org/schema/spring/dwr.xsd=org/devside/core/support/dwr/dwr.xsd<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; </font><font color=#000000>注意不要写错字哦，我一开始就写错一个字母，结果怎么调试都不能成功，还以为Spring2有问题呢。<br><br>ok了，下面我们就可以写一个spring的配置文件来试试喽。<br><br>下面提供两个源码包，一个是spring-dwr的源码，一个是hellosturts2，一个struts2+spring2+hibernate3.2的例子，其中有用到spring-dwr的例子。<br><br>为了减小容量，我把jar都去掉了，lib目录下提供了一个列表，你可以自己去找相关的jar包。<br><br><a href="http://www.blogjava.net/Files/mstar/HelloStruts2.zip"><font color=#6fbc4c><u>http://www.blogjava.net/Files/mstar/HelloStruts2.zip</u></font></a><br><br><a href="http://www.blogjava.net/Files/mstar/spring-dwr.zip"><u><font color=#6fbc4c>http://www.blogjava.net/Files/mstar/spring-dwr.zip</font></u></a></font> 
<img src ="http://www.blogjava.net/jesson2005/aggbug/110973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 15:33 <a href="http://www.blogjava.net/jesson2005/articles/110973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr简介--一个例子(续二) </title><link>http://www.blogjava.net/jesson2005/articles/110972.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110972.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110972.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110972.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 页面部分有几个重要的文件：login.jsp -- 登陆画面showtable.jsp -- 显示table的画面showtable.js -- 显示table页用到的javascript下面是login.jsp&lt;body&gt;&lt;!--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是要用到了js，UserLogic.js是自己的，是有dwr根据你编写的dwr...&nbsp;&nbsp;<a href='http://www.blogjava.net/jesson2005/articles/110972.html'>阅读全文</a><img src ="http://www.blogjava.net/jesson2005/aggbug/110972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 15:32 <a href="http://www.blogjava.net/jesson2005/articles/110972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr简介--一个例子(续一) </title><link>http://www.blogjava.net/jesson2005/articles/110968.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110968.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110968.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 抱歉这篇才写。上班没有多少时间啊！TableModelBean.java 这是核心业务类，既要被Action使用又要被dwr使用。由于我注释写了一些，所以就不详细介绍了public&nbsp;class&nbsp;TableModelBean&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表格的第一列&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/jesson2005/articles/110968.html'>阅读全文</a><img src ="http://www.blogjava.net/jesson2005/aggbug/110968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 15:31 <a href="http://www.blogjava.net/jesson2005/articles/110968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr简介--一个例子(一)</title><link>http://www.blogjava.net/jesson2005/articles/110966.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110966.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110966.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110966.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 上一篇我主要介绍dwr的概况。这一篇我用dwr做了个可以不刷新页面就更新的表格。运行环境：windows xp pro sp2j2sdk1.2.4_03weblogic8.1struts1.2.4开发工具eclipse3.0其实dwr和struts没有什么关系，只不过最近我们项目组在用struts作东西。我就顺便用把我的程序建立在Struts上。主要文件。dwr.jar--dwr的类库包strut...&nbsp;&nbsp;<a href='http://www.blogjava.net/jesson2005/articles/110966.html'>阅读全文</a><img src ="http://www.blogjava.net/jesson2005/aggbug/110966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 15:29 <a href="http://www.blogjava.net/jesson2005/articles/110966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR小结DWRUtil篇  </title><link>http://www.blogjava.net/jesson2005/articles/110957.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110957.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110957.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110957.html</trackback:ping><description><![CDATA[<p><strong><span>$();</span></strong></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>相当于</span><span>document.getElementById(id);</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>: id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>name</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性值</span><span>;</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>:</span></p>
<p><span><input type=&#8221;text&#8221; name=&#8221;txt_test&#8221;></input></span></p>
<p><span>&lt;script&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var ele=$(txt_test);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var str=DWRUtil.toDescriptiveString(ele,1)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.debug(str);</span></p>
<p><span>&lt;/script&gt;</span></p>
<p>&#160;</p>
<p><strong><span>DWRUtil.getValue();</span></strong></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>获得指定元素</span><span>value</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>值</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>: id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>name</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性值</span><span>;</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>注意</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>该函数只能用于有</span><span>value</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性的元素</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>:</span></p>
<p><span><input type=&#8221;text&#8221; name=&#8221;txt_test&#8221;></input></span></p>
<p><span>&lt;script&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>var val=DWRUtil.getValue(&#8220;txt_test&#8221;);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.debug(val);</span></p>
<p><span>&lt;/script&gt;</span></p>
<p>&#160;</p>
<p><strong><span>DWRUtil.getValues();</span></strong></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>获得一组指定元素的</span><span>value</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>值</span><span>;</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>:id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>name</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>构成的数组对象</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>:</span></p>
<p><span><input type=&#8221;text&#8221; value=&#8221;wiley&#8221; name=&#8221;txt_name&#8221;></input></span></p>
<p><span><input type=&#8221;text&#8221; value=&#8221;wiley&#8221; name=&#8221;txt_pswd&#8221;></input></span></p>
<p><span>&lt;script&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var arr_=DWRUtil.getValues({&#8220;txt_name&#8221;:null,&#8221;txt_pswd&#8221;:null});</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var str=DWRUtil.toDescriptiveString(arr,1)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.debug(str);</span></p>
<p><span>&lt;/script&gt;</span></p>
<p>&#160;</p>
<p><strong><span>DWRUtil.setValue();</span></strong></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>设置指定元素的</span><span>value</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>值</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>: id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>name</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性值</span></p>
<p><span><input type=&#8221;text&#8221; value=&#8221;&#8221; name=&#8221;txt_test&#8221;></input></span></p>
<p><span>&lt;script&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.setValue(&#8220;txt_test&#8221;,&#8221;wiley&#8221;);</span></p>
<p><span>&lt;/script&gt;</span></p>
<p>&#160;</p>
<p>&#160;</p>
<p><strong><span>DWRUtil.setValues();</span></strong></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>设置一组指定元素的值</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>: id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>name</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>构成的数组对象</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>:</span></p>
<p><span><input type=&#8221;text&#8221; value=&#8221;&#8221; name=&#8221;txt_name&#8221;></input></span></p>
<p><span><input type=&#8221;text&#8221; value=&#8221;&#8221; name=&#8221;txt_pswd&#8221;></input></span></p>
<p><span>&lt;script&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.setValues({&#8220;txt_name&#8221;:&#8221;wiley&#8221;,&#8221;txt_pswd&#8221;:&#8221;wiley&#8221;});</span></p>
<p><span>&lt;/script&gt;</span></p>
<p>&#160;</p>
<p><strong><span>DWRUtil.getText();</span></strong></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>获得</span><span>select</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>元素的文本值</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>: id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>name</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性值</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>:</span></p>
<p><span><select name=&#8221;sel_test&#8221;> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<option value=&#8221; selected wiley-cn>wiley中国</option>
</select></span></p>
<p><span>&lt;script&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var txt=DWRUtil.getText (&#8220;sel_test&#8221;);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var val=DWRUtil.getValue(&#8220;sel_test&#8221;);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.debug(&#8220;Text:&#8221;+txt+&#8221;\tValue:&#8221;+val);</span></p>
<p><span>&lt;/script&gt;</span></p>
<p>&#160;</p>
<p><strong><span>DWRUtil.addRows();</span></strong></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>指定表格添加行</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>格式</span><span>:DWRUtil.addRows(id,items, functions);</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>:</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>第一个参数</span><span>:table</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>tbody</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>的</span><span>id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性值</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>第二个参数</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>数组或链表</span><span>(</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>可能用词不是很适合</span><span>)</span></p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>第三个参数</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>函数链表</span></p>
<p>&#160;</p>
<p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>1:</span></p>
<p><span>
<table>
    </span>
    <p>&#160;</p>
    <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
    <tbody>
        <tr>
            </span>
            <p>&#160;</p>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
            <td></span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>主题</span></td>
            </span></p>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
            <p>&#160;</p>
            <p>&#160;</p>
            <p>&#160;</p>
            <p>&#160;</p>
            </p>
            <tr>
                </span>
                <p>&#160;</p>
                <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                <p>&#160;</p>
                <p>&#160;</p>
                <p>&#160;</p>
                <p>&#160;</p>
                </p>
            </tr>
            <tbody id=&#8221;tby_test&#8221;>
                </span>
                <p>&#160;</p>
                <p><span>
                <p>&#160;</p>
                <p>&#160;</p>
                <p>&#160;</p>
                <p>&#160;</p>
                </p>
            </tbody>
            </span></p>
            <p><span>
            <p>&#160;</p>
            <p>&#160;</p>
            <p>&#160;</p>
            <p>&#160;</p>
            </p>
        </table>
        </span></p>
        <p><span>&lt;script&gt;</span></p>
        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var arr_={&#8220;wiley&#8217;s blog&#8221;,&#8221;wiley</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>中国</span><span>&#8221;};</span></p>
        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.addRows(&#8220;tby_test&#8221;,arr_,[function(arr_){return arr_}]);</span></p>
        <p><span>&lt;/script&gt;</span></p>
        <p>&#160;</p>
        <p>&#160;</p>
        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>2:</span></p>
        <p>&#160;</p>
        <p><span>
        <table>
            </span>
            <p>&#160;</p>
            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
            <tbody>
                <tr>
                    </span>
                    <p>&#160;</p>
                    <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                    <td></span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>名称</span></td>
                    </span></p>
                    <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                    <td></span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>网址</span></td>
                    </span></p>
                    <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                    <p>&#160;</p>
                    <p>&#160;</p>
                    <p>&#160;</p>
                    <p>&#160;</p>
                    </p>
                    <tr>
                        </span>
                        <p>&#160;</p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                        <p>&#160;</p>
                        <p>&#160;</p>
                        <p>&#160;</p>
                        <p>&#160;</p>
                        </p>
                    </tr>
                    <tbody id=&#8221;tby_test&#8221;>
                        </span>
                        <p>&#160;</p>
                        <p><span>
                        <p>&#160;</p>
                        <p>&#160;</p>
                        <p>&#160;</p>
                        <p>&#160;</p>
                        </p>
                    </tbody>
                    </span></p>
                    <p><span>
                    <p>&#160;</p>
                    <p>&#160;</p>
                    <p>&#160;</p>
                    <p>&#160;</p>
                    </p>
                </table>
                </span></p>
                <p><span>&lt;script&gt;</span></p>
                <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var items=[{&#8220;name&#8221;:&#8221;wiley</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>中国</span><span>&#8221;,&#8221;add&#8221;:&#8221;wiley-cn.com&#8221;}];</span></p>
                <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.addRows(&#8220;tby_test&#8221;,items,[function(item){return item.name}, function(item){return item.add}]);</span></p>
                <p><span>&lt;/script&gt;</span></p>
                <p>&#160;</p>
                <p><strong><span>DWRUtil.romoveAllRows();</span></strong></p>
                <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>删除指定表格行</span></p>
                <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>:table</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>tbody</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>的</span><span>id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性值</span></p>
                <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span></p>
                <p><span>
                <table>
                    </span>
                    <p>&#160;</p>
                    <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                    <tbody>
                        <tr>
                            </span>
                            <p>&#160;</p>
                            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                            <td></span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>名称</span></td>
                            </span></p>
                            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                            <td></span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>网址</span></td>
                            </span></p>
                            <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                            <p>&#160;</p>
                            <p>&#160;</p>
                            <p>&#160;</p>
                            <p>&#160;</p>
                            </p>
                            <tr>
                                </span>
                                <p>&#160;</p>
                                <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
                                <p>&#160;</p>
                                <p>&#160;</p>
                                <p>&#160;</p>
                                <p>&#160;</p>
                                </p>
                            </tr>
                            <tbody id=&#8221;tby_test&#8221;>
                                </span>
                                <p>&#160;</p>
                                <p><span>
                                <p>&#160;</p>
                                <p>&#160;</p>
                                <p>&#160;</p>
                                <p>&#160;</p>
                                </p>
                            </tbody>
                            </span></p>
                            <p><span>
                            <p>&#160;</p>
                            <p>&#160;</p>
                            <p>&#160;</p>
                            <p>&#160;</p>
                            </p>
                        </table>
                        </span></p>
                        <p><span>&lt;script&gt;</span></p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.romoveAllRows(&#8220;tby_test&#8221;);//</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>每次添加前将原有数据行删除</span><span>,</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>防止数据重叠</span></p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var items=[{&#8220;name&#8221;:&#8221;wiley</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>中国</span><span>&#8221;,&#8221;add&#8221;:&#8221;wiley-cn.com&#8221;}];</span></p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.addRows(&#8220;tby_test&#8221;,items,[function(item){return item.name}, function(item){return item.add}]);</span></p>
                        <p><span>&lt;/script&gt;</span></p>
                        <p>&#160;</p>
                        <p><span>DWRUtil.addOptions();</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>添加</span><span>select</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>元素的</span><span>option</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>子元素</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>格式</span><span>:DWRUtil.addOption(id,items)</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>DWRUtil.addOption(id,items,valueProp,textProp);</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>:</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>第一个参数</span><span>:select</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>的</span><span>id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>name</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性值</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>第二个参数</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>数组或链表</span><span>(</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>填充数据</span><span>)</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>第三、四个参数</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>链表节点的属性</span><span>,</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>第三个填充</span><span>value</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>值，第四个填充</span><span>text</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>值</span></p>
                        <p>&#160;</p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例：</span></p>
                        <p><span><select name=&#8221;sel_test&#8221;></select></span></p>
                        <p><span>&lt;script&gt;</span></p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var arr_={&#8220;wiley&#8221;,&#8221;wiley</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>中国</span><span>&#8221;};</span></p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.addRows(&#8220;sel_test&#8221;,arr_);//</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>此时</span><span>value</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>与</span><span>text</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>值相同</span></p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.romoveAllOptions(&#8220;sel_test&#8221;);</span></p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Var items=[{&#8220;name&#8221;:&#8221;wiley</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>中国</span><span>&#8221;,&#8221;add&#8221;:&#8221;wiley-cn.com&#8221;}];</span></p>
                        <p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DWRUtil.addRows(&#8220;sel_test&#8221;,&#8221;add&#8221;,&#8221;name&#8221;);//</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>此时</span><span>value</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>与</span><span>text</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>不相同</span></p>
                        <p><span>&lt;/script&gt;</span></p>
                        <p>&#160;</p>
                        <p><strong><span>DWRUtil.romoveAllOptions();</span></strong></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>删除指定</span><span>select</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>元素的</span><span>option</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>子元素</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>参数</span><span>:select</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>元素的</span><span>id</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>或</span><span>name</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>属性值</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>前面例子有用到</span></p>
                        <p>&#160;</p>
                        <p><strong><span>DWRUtil.debug();</span></strong></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>等价于</span><span>alert()</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>前面例子有用到</span></p>
                        <p>&#160;</p>
                        <p><span>DWRUtil.toDescriptiveString();</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>功能</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>将对象序列化成字符串</span><span>,</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>主要用于调试</span></p>
                        <p><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>例</span><span>:</span><span Roman?? New ?Times mso-hansi-font-family: Roman?; Times>前面的例子有用到</span></p>
<img src ="http://www.blogjava.net/jesson2005/aggbug/110957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 15:14 <a href="http://www.blogjava.net/jesson2005/articles/110957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR的学习文档（Hello World,类型转换,Spring,Annotation) </title><link>http://www.blogjava.net/jesson2005/articles/110956.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110956.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110956.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110956.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110956.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Email:javafish@sunxin.org DWR是作为远程调用的ajax框架，将服务端的java类，方法和浏览器的javascript的类，方法对应起来。现在官方最新的版本是DWR2.0，可以在http://getahead.ltd.uk/dwr/download下载到。 我们真对DWR2.0做一些例子讲解一下它的特性： Hello World： 新建一个web项目DWRStudy，在项...&nbsp;&nbsp;<a href='http://www.blogjava.net/jesson2005/articles/110956.html'>阅读全文</a><img src ="http://www.blogjava.net/jesson2005/aggbug/110956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 15:12 <a href="http://www.blogjava.net/jesson2005/articles/110956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用DWR2.0做的一个Server日志查看器</title><link>http://www.blogjava.net/jesson2005/articles/110954.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Mon, 16 Apr 2007 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110954.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110954.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110954.html</trackback:ping><description><![CDATA[<div class=postTitle><a class=postTitle2 id=viewpost1_TitleUrl href="http://www.blogjava.net/mstar/archive/2007/01/03/Ajax_DWR2_LogViewer.html"><font color=#646464>用DWR2.0做的一个Server日志查看器</font></a> </div>
<p>有时候我需要查看已经部署到服务器上的应用程序的日志，每次都要远程登录服务器感觉很麻烦，所以一般我会把log文件的目录用apache做个网站，这样通过IE就可以访问到了。但是有时要看即时输出情况，就要不断的F5，很麻烦。所以就有个想法，不如用DWR2.0的反转Ajax来做个程序，让日志有变化时自动的发送到客户端，这样就我一个劲的按F5了。<br><br>我下面就把这个程序分享给大家，希望大家提提意见。<br><br>首先是环境：<br>DWR 2.0.rc1<br>Sun JDK 1.5<br><br>先看张运行起来的图吧，大家一看就知道这是个什么东西了。<br><img height=509 alt=logviewer.png src="http://www.blogjava.net/images/blogjava_net/mstar/pics2007/logviewer.png" width=776 border=0><br>你可以制定要监视的log文件，当然有哪些文件文件可以被监视，你必须在服务端的xml配置中文件设置，当然你也可以监视一个目录里的log文件，这对于而log文件是每天生成一个的情况很有用。你可以设定在浏览器上显示的行数，操作行数，屏幕会自动滚动。你还可以添加一些过滤器，过滤掉不想看见的行，我目前只做了到了过滤掉一些信息，当然如果你有兴趣，你也再添加一些更复杂的过滤器。过滤器的模式是用正则表达式表示的。<br><br>下面是点击&#8220;开始监听&#8221;，运行后样子<br><img height=598 alt=logviewer2.png src="http://www.blogjava.net/images/blogjava_net/mstar/pics2007/logviewer2.png" width=776 border=0><br>如果服务器上的catalina.2006-12-09.log文件发生变化，客户端的浏览器上log显示区也会自动的向上滚动。<br><br><br>下面我就大致的介绍一下如何用DWR2.0来实现这样的功能。在这里介绍的可能不是很详细，不清楚的地方请看我提供的源码。<br><br>先来介绍一下目录结构<br>├─lib&nbsp; -- 编译和测试用的第三方类库<br>├─webapp -- 部署目录<br>├─test -- 测试程序<br>├─java -- 主程序<br>└─build.xml -- ant构建文件<br><br>webapp下的文件和目录<br>│&nbsp; style.css&nbsp; -- 样式表文件<br>│&nbsp; index.html -- 主画面文件<br>│<br>├─WEB-INF<br>│&nbsp; │&nbsp; web.xml -- 部署配置文件<br>│&nbsp; │&nbsp; dwr.xml -- dwr的配置文件<br>│&nbsp; │&nbsp; conf.xml -- 我们这个应用程序配置文件，主要是配置log文件<br>│&nbsp; │<br>│&nbsp; ├─classes <br>│&nbsp; │<br>│&nbsp; └─lib <br>│<br>└─script -- javascript文件<br><br><br>index.html中就是我们上面的图片上能看到的页面元素。其中的控件的事件处理都写在\script\logviewer.js文件中。<br></p>
<p>当页面加载时执行startPoll()方法，复杂开始与服务器的通信，并且把log文件选择框初始化，把已经添加过滤器列表显示出来。 </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">&nbsp;startPoll()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;DWREngine.setActiveReverseAjax(</span> <span style="COLOR: #0000ff">true</span> <span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;LogManager.getLogFileNames(</span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">&nbsp;(data)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWRUtil.removeAllOptions(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">log_file</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWRUtil.addOptions(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">log_file</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,&nbsp;data);<br>&nbsp;&nbsp;&nbsp;&nbsp;});<br><br>&nbsp;&nbsp;&nbsp;&nbsp;LogManager.getFilters(</span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">(data)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">for</span> <span style="COLOR: #000000">&nbsp;(</span> <span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000">&nbsp;i&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;&nbsp;i&nbsp;</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">&nbsp;data.length;&nbsp;i</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addFilterDiv(data[i].pattern,&nbsp;data[i].id);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;});<br>}</span> </div>
<p><br>当点击&#8220;开始监听&#8221;按钮时调用服务端的LogManager的send方法，服务端开启监听线程，开始监听做为参数传递的文件，如果文件有变动就会把最近增加的行发送到浏览器上来。 <br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000">&nbsp;startWatch&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;clearLog();<br>&nbsp;&nbsp;&nbsp;&nbsp;LogManager.send(DWRUtil.getValue(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">log_file</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">));<br>}</span> </div>
<p><br></p>
<p>当点击&#8220;结束监听&#8221;按钮，调用LogManager的stop()方法，结束掉监听线程。<br></p>
<p>&#160;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">&nbsp;stopWatch()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;LogManager.stop();<br>}</span> </div>
<p>&#160;</p>
<p><br>当点击&#8220;清空日志&#8221;按钮，清除mainPanel中的所有子元素</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">&nbsp;clearLog()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000">&nbsp;mainPanel&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;$(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">main_panel</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">&nbsp;(mainPanel.hasChildNodes())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainPanel.removeChild(mainPanel.firstChild);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span> </div>
<p>当点击&#8220;添加过滤器&#8221;，填充输入框，要求输入做为过滤器的正则表达式，输入完成后，要做两件事：<br>1、LogManager.addFilter方法，把输入的正则表达式传送给服务端。<br>2、把这个正则表达式添加到页面上。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">&nbsp;addFilter()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">var</span> <span style="COLOR: #000000">&nbsp;regex&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;prompt(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">输入正则表达式</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,&nbsp;</span> <span style="COLOR: #000000">""</span> <span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(regex&nbsp;</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">null</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">&amp;&amp;</span> <span style="COLOR: #000000">&nbsp;regex&nbsp;</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">""</span> <span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LogManager.addFilter(regex,&nbsp;</span> <span style="COLOR: #0000ff">function</span> <span style="COLOR: #000000">&nbsp;(filterId)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addFilterDiv(regex,&nbsp;filterId);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span> </div>
注意这里，我们用到了DWR的回调模式，在调用服务端方法LogManager.addFilter成功后我们才调用客户端的addFilterDiv方法把这个输入的正则表达式显示到页面上。<br><br>如果你足够细心的话，应该会发现在这个js文件中有一个叫做addNewLine的方法在index.html中是没有被调用的。这个方法其实是给服务端的LogManager.send函数调用的。<br><br>上面这些内容就是服务端脚本的主要内容了，其实很简单。主要负责通过DWR与服务端通信和处理页面显示。<br><br>下面介绍服务端的核心类：LogManager<br><br>这个类主要就这样几个方法：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;停止监控<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;stop()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(watcher&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watcher.halt();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;发送log信息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;send(String&nbsp;filename)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebContext&nbsp;wctx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WebContextFactory.get();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;ScriptSession&nbsp;scriptSession&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wctx.getScriptSession();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(watcher&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watcher.halt();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watcher&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LogFileWatcher(filename);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watcher.addListener(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LogUpdateListener()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;onLogUpdate(List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;lines)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(String&nbsp;line&nbsp;:&nbsp;lines)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(checkFilters(line))&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptBuffer&nbsp;scriptBuffer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ScriptBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scriptBuffer.appendScript(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">addNewLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.appendData(line)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.appendScript(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scriptSession.addScript(scriptBuffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;watcher.start();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScriptBuffer&nbsp;scriptBuffer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ScriptBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scriptBuffer.appendScript(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">addNewLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.appendData(e.getMessage())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.appendScript(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scriptSession.addScript(scriptBuffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.warn(e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;取得指定的日志文件路径<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000">&nbsp;指定的日志文件路径<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;getLogFileNames()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;filenames&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLConfiguration&nbsp;config&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;getConfiguration();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;logfiles&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;config.getList(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">log-files.file</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(Object&nbsp;o&nbsp;:&nbsp;logfiles)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filenames.add((String)&nbsp;o);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(ConfigurationException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.warn(e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;filenames;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;取得指定的日志目录下的文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000">&nbsp;指定的日志目录下的文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;getLogFileNamesFromDir()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;filenames&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLConfiguration&nbsp;config&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;getConfiguration();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;dir&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;config.getString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">log-dir.dir</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(dir&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;rootDir&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;File(dir);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rootDir.exists())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rootDir.isFile())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filenames.add(rootDir.getPath().replace(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rootDir.isDirectory())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;patternString&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;config.getString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">log-dir.filter</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File[]&nbsp;files;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(patternString&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">patternString.equals(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">))&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rootDir.listFiles(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LogFileFilter(patternString));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rootDir.listFiles();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(File&nbsp;file&nbsp;:&nbsp;files)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filenames.add(file.getPath().replace(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(ConfigurationException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.warn(e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;filenames;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;添加一个过滤器，返回过滤器的id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;addFilter(String&nbsp;regex)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">&nbsp;(filters)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Filter&nbsp;filter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Filter(regex,&nbsp;SequenceGenerator.getInstance().next(),&nbsp;FilterType.INCLUDE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filters.add(filter);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;filter.getId();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;根据id删除一个过滤器<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;removeFilter(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">&nbsp;(filters)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filters.remove(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Filter(id));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;取得现在所有的过滤器列表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String,&nbsp;Object</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;getFilters()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String,&nbsp;Object</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String,&nbsp;Object</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000">&nbsp;(filters)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(Filter&nbsp;filter&nbsp;:&nbsp;filters)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String,&nbsp;Object</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;filterItem&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HashMap</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String,&nbsp;Object</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterItem.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;filter.getId());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterItem.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pattern</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;filter.getPattern().pattern());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.add(filterItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;result;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>对于大家都做过Java的朋友来说，这些代码应该很容易就能看懂，我就不多说了。大家主要注意一下ScriptSession类，这个类就是起到主要功能的类了。<br><br>其中的LogFileWatcher是一个Thread类，它是用来监视log文件的。<br><br>SequenceGenerator.java是用来生成过滤器的id的。<br><br>LogUpdateListener.java是一个接口，用于实现事件回调的。<br><br>然后看一个dwr的配置文件<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">create&nbsp;</span><span style="COLOR: #ff0000">creator</span><span style="COLOR: #0000ff">="new"</span><span style="COLOR: #ff0000">&nbsp;javascript</span><span style="COLOR: #0000ff">="LogManager"</span><span style="COLOR: #ff0000">&nbsp;scope</span><span style="COLOR: #0000ff">="session"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="class"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="org.devside.logviewer.LogManager"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="send"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="stop"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="getLogFileNames"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="getLogFileNamesFromDir"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="addFilter"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="removeFilter"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="getFilters"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>这里的配置文件和1.x几乎没什么两样，就是scope我这里设置成了session范围的。这样就可以多个人同时监视不同的log文件了。<br><br>web.xml文件也基本上是老样子<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="LogViewer"</span><span style="COLOR: #ff0000">&nbsp;version</span><span style="COLOR: #0000ff">="2.4"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="COLOR: #ff0000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Web&nbsp;Log&nbsp;Viewer</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">description</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Direct&nbsp;Web&nbsp;Remoter&nbsp;Servlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">description</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">DWR&nbsp;Servlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">dwr-invoker</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">org.directwebremoting.servlet.DwrServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">debug</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">pollAndCometEnabled</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">dwr-invoker</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/dwr/*</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">index.html</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span></div>
dwr的包名发生了变化，并且要开启反转ajax，就要把<span style="COLOR: #000000">pollAndCometEnabled参数设置为true。<br><br>总结，总体来说DWR2.0中的反转ajax还是很容易使用的，这也是dwr的一贯风格，不用知道过多的细节就能容易的实现ajax。dwr绝对是Java开发者的首选ajax框架。<br>另外我这个程序其实还是为了演示用的，如果想要用户实际开发可能还需要修改，比如安全性上面，性能上面。而性能上面的主要问题是客户端浏览器，如果服务端的log文件过大，而浏览器有不能即时的回收内存，就会造成客户端浏览器内存占用过大而死掉的问题。而服务端由于java的内容回收机制已经比较成熟应该不会有什么问题。我在ie6和firefox2都试过了，firefox效果能好一些。<br><br>源码下载：<br><a href="http://www.blogjava.net/Files/mstar/LogViewer.part1.rar"><u><font color=#6fbc4c>http://www.blogjava.net/Files/mstar/LogViewer.part1.rar</font></u></a><br><a href="http://www.blogjava.net/Files/mstar/LogViewer.part2.rar"><u><font color=#6fbc4c>http://www.blogjava.net/Files/mstar/LogViewer.part2.rar</font></u></a></span> 
<img src ="http://www.blogjava.net/jesson2005/aggbug/110954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-16 15:02 <a href="http://www.blogjava.net/jesson2005/articles/110954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax探索</title><link>http://www.blogjava.net/jesson2005/articles/110143.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Thu, 12 Apr 2007 05:06:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110143.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110143.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110143.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110143.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 面向 Java 开发人员的 Ajax: 探索 Google Web Toolkit            从单一 Java 代码库开发 Ajax 应用程序                                                                                                 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/jesson2005/articles/110143.html'>阅读全文</a><img src ="http://www.blogjava.net/jesson2005/aggbug/110143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-12 13:06 <a href="http://www.blogjava.net/jesson2005/articles/110143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GWT入门</title><link>http://www.blogjava.net/jesson2005/articles/110101.html</link><dc:creator>张金鹏</dc:creator><author>张金鹏</author><pubDate>Thu, 12 Apr 2007 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/jesson2005/articles/110101.html</guid><wfw:comment>http://www.blogjava.net/jesson2005/comments/110101.html</wfw:comment><comments>http://www.blogjava.net/jesson2005/articles/110101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jesson2005/comments/commentRss/110101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jesson2005/services/trackbacks/110101.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%">
            <h1><span style="COLOR: #999999">面向 Java 开发人员的 Ajax: </span>Google Web Toolkit 入门</h1>
            <img class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></td>
            <td class=no-print width=192><img height=18 alt=developerWorks src="http://www-128.ibm.com/developerworks/cn/i/dw.gif" width=192></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
            <td width="100%">
            <table class=no-print cellSpacing=0 cellPadding=0 width=160 align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=0 width=150 border=0>
                            <tbody>
                                <tr>
                                    <td class=v14-header-1-small>文档选项</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td class=no-padding width=150>
                                    <table cellSpacing=0 cellPadding=0 width=143 border=0>
                                        <img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8>
                                        <form name=email action=https://www.ibm.com/developerworks/secure/email-it.jsp>
                                            <input type=hidden value="Ajax 被用于创建更加动态和交互性更好的 Web 应用程序。Google Web Toolkit (简称GWT) 是 Google 推出的 Ajax 应用开发包，GWT 支持开发者使用Java 语言开发 Ajax 应用。本文中作者将介绍如何使用 GWT 开发 Ajax 应用的基本方法和步骤。" name=body><input type=hidden value="面向 Java 开发人员的 Ajax: Google Web Toolkit 入门" name=subject><input type=hidden value=cn name=lang> <script language=JavaScript type=text/javascript>
                                            <!--
                                            document.write('
                                            <tr valign="top">
                                                <td width="8"><img src="//www.ibm.com/i/c.gif" src_cetemp="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td>
                                                <td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" src_cetemp="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td>
                                                <td width="122">
                                                <p><a class="smallplainlink" href="javascript:document.email.submit();" href_cetemp="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p>
                                                </td>
                                            </tr>
                                            ');
                                            //-->
                                            </script>
                                            <tbody>
                                                <tr vAlign=top>
                                                    <td width=8><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></td>
                                                    <td width=16><img height=16 alt=将此页作为电子邮件发送 src="http://www.ibm.com/i/v14/icons/em.gif" width=16 vspace=3></td>
                                                    <td width=122>
                                                    <p><a class=smallplainlink href="javascript:document.email.submit();"><strong><font color=#5c81a7 size=2>将此页作为电子邮件发送</font></strong></a></p>
                                                    </td>
                                                </tr>
                                                <noscript>
                                                <tr valign="top">
                                                    <td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td class="small" width="122">
                                                    <p><span class="ast">未显示需要 JavaScript 的文档选项</span></p>
                                                    </td>
                                                </tr>
                                                </noscript>
                                            </form>
                                        </tbody>
                                    </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- 03/20/06 updated by gretchen --><br>
                        <table cellSpacing=0 cellPadding=0 width=150 border=0>
                            <tbody>
                                <tr>
                                    <td class=v14-header-2-small>拓展 Tomcat 应用</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td class=no-padding width=150>
                                    <table cellSpacing=0 cellPadding=0 width=143 border=0>
                                        <tbody>
                                            <tr vAlign=top>
                                                <td width=8><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></td>
                                                <td><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/fw_bold.gif" width=16 vspace=3 border=0></td>
                                                <td width=125>
                                                <p><a class=smallplainlink href="http://www-128.ibm.com/developerworks/cn/kickstart/webserver.html?S_TACT=105AGX52&amp;S_CMP=simpleart"><font color=#5c81a7 size=2>下载 IBM 开源 J2EE 应用服务器 WAS CE 新版本 V1.1</font></a> </p>
                                                </td>
                                            </tr>
                                        </tbody>
                                    </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br></td>
                    </tr>
                </tbody>
            </table>
            <p>级别: 初级</p>
            <p><a href="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/index.html#author"><font color=#996699>肖 菁</font></a>, 唯 J 族创始人<br></p>
            <p>2006 年 7 月 03 日</p>
            <blockquote>Ajax 被用于创建更加动态和交互性更好的 Web 应用程序。Google Web Toolkit (简称GWT) 是 Google 推出的 Ajax 应用开发包，GWT 支持开发者使用Java 语言开发 Ajax 应用。本文中作者将介绍如何使用 GWT 开发 Ajax 应用的基本方法和步骤。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p><a name=N10053><span class=atitle>Ajax简介</span></a></p>
            <p>Ajax是 Asynchronous JavaScript and XML（以及 DHTML 等）的缩写，由XHTML、CSS、JavaScript、XMLHttpRequest、XML等技术组合而成，是当前Web应用开发领域的热门技术，用于创建更加动态和交互性更好的Web应用程序，提升用户的浏览体验。</p>
            <p>Ajax的核心是JavaScript对象XmlHttpRequest。XmlHttpRequest处理所有服务器通信的对象，是一种支持异步请求的技术。简而言之，XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应，而不阻塞用户。</p>
            <p>Ajax并不是本文的中心关注点，因此这里不再赘述，请大家访问参考资源区的相关链接，了解更多关于Ajax技术和应用方面的知识。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10062><span class=atitle>为什么选择GWT？</span></a></p>
            <p>众所周知，即使对于Ajax技术非常熟悉的开发者而言，Ajax应用的开发和调试过程也不是一件容易的事情，更困难的是，到目前为止，一直没有出现合适的开发工具能够支持Ajax应用的开发和调试。</p>
            <p>与此相反的是，Java语言--企业应用开发的主流语言-的开发和调试过程却因为有各种各样开发工具的支持而简单的多，而且这样的开发工具我们可以免费获得，比如Eclipse、NetBeans。</p>
            <p>如果能够应用Java语言开发Ajax，Ajax应用开发的最大难题-开发工具的缺失-就将迎刃而解。这种情况下，我们就可以既充分利用Java语言的开发优势降低Ajax应用开发的难度，加快Ajax应用的开发速度，为Ajax的大规模应用创造可能，又可以充分发挥Ajax技术的优势，创建更加动态和交互性更好的Web应用程序，提升用户的浏览体验。</p>
            <p>Google Web Toolkit(简称GWT)的出现为我们提供了这种可能。GWT是Google推出的Ajax应用开发包，支持开发者使用Java语言开发Ajax应用。GWT框架本身是开源的，但是GWT中的开发工具仅仅提供开发用License，不允许分发。</p>
            <p>GWT提供了一组基于Java语言的开发包，这个开发包的设计参考Java AWT包设计，类命名规则、接口设计、事件监听等都和AWT非常类似。熟悉Java AWT的开发者不需要花费多大的力气就能够快速的理解GWT开发工具包，将更多地时间投入到GWT应用的开发过程中。</p>
            <p>开发出来的Java应用将由GWT开发包提供的编译工具编译后声生成对应的、应用了Ajax技术的Web应用，Java应用中出现的、和服务器之间的交互动作被自动生成的异步调用代码所代替。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N1007A><span class=atitle>GWT特性</span></a></p>
            <p>GWT除了支持将应用Java语言开发的应用转化为Ajax应用，同时提供了更多的高级特性，下面是这些特性的简单描述。</p>
            <p>1. GWT编译器</p>
            <p>GWT编译器是GWT的核心，负责完成将Java代码翻译很Ajax内容的工作。GWT编译器能够翻译Java语言的大部分特性。包括支持Java语言中的基本类型、违例处理等，支持java.lang包和java.util包中的绝大部分类和接口，支持正则表达式和序列化。</p>
            <p>2. 跨平台支持</p>
            <p>如果你使用GWT中提供的显示组件(比如Button)和组装组件(比如VerticalPanel)，GWT编译生成的Ajax应用能够支持大部分的浏览器和操作系统，比如Internet Explorer、Firefox等，也能够支持Linux、Windows等不同操作系统。这是因为GWT最大限度的将这些控件翻译成浏览器内置的类型。比如Button类编译后生成的是标准HTML：&lt;input type="button"&gt;。</p>
            <p>GWT建议使用CSS修饰页面元素的显示效果。GWT的类中很少提供访问页面元素样式属性的方法，我们可以直接在CSS文件中通过对应的样式名称来设置页面元素的默认显示效果。比如使用 .gwt-Button { font-size: 150%; } 使用Button元素的默认显示效果。</p>
            <p>3. 宿主模式(Hosted Mode)</p>
            <p>宿主模式是指我们和没有转换为Ajax应用的GWT应用交互的状态。当我们开发和调试时，我们就一直处在宿主模式下。在这种情况下，Java虚拟机使用GWT内置的浏览器运行GWT应用编译后的class内容，因此能够提供"编码、测试、调试"过程的最佳速度。</p>
            <p>我们可以运行com.google.gwt.dev.GWTShell启动宿主模式。</p>
            <p>4. Web模式(Web Mode)</p>
            <p>Web模式是指已经成功转化为Ajax应用的状态，这种状态下，我们已经开始通过Web方式来访问Ajax应用了。</p>
            <p>在Web模式下运行时，不再需要GWT工具包或者JVM的支持。</p>
            <p>5. 命令行工具</p>
            <p>GWT工具包中提供了几个非常适用的小工具来帮助我们更快的建立GWT应用开发环境：projectCreator、applicationCreator、junitCreator。</p>
            <ul>
                <li>projectCreator <br>创建在Eclipse中开发GWT应用所需要的项目基本文件和可选的Ant buildfile文件。
                <li>applicationCreator <br>applicationCreator命令用于创建基本的HelloWorld！应用和GWT应用开发环境。
                <li>junitCreator <br>生成junti测试代码。 </li>
            </ul>
            <p>通过上面的内容，我们已经了解了GWT工具集工作的基本原理和主要特性。有些迫不及待了吧，那么就请随我一起进入GWT应用开发的过程吧，享受应用Java语言开发Ajax应用带来的简单和便利。</p>
            <p>本文中所有的环境准备、实例开发和说明均针对Windows操作平台，如果使用其他的操作系统，请根据实际情况进行适当的调整。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N100C2><span class=atitle>环境准备</span></a></p>
            <p>1、 下载和安装JDK1.4.X </p>
            <p>GWT工具包的编译需要JDK支持，因此在安装GWT工具包之前请下载和安装合适的JDK。GWT工具支持Java语言1.4版本或者以下版本，因此JDK版本选择JDK1.4.X是比较合适的，不需要采用最新的JDK5.0或者更高版本。</p>
            <p>请访问java.sun.com网站上下载安装版本，下载后安装到C:/jdk目录下，本书中的后续内容中将使用%JAVA_HOME%变量来引用这个目录。</p>
            <p>您可以根据实际情况将JDK安装到任意目录下。但是在运行本文中例子的时候，请记住将对应的%JAVA_HOME%变量替换为您的实际安装目录。</p>
            <p>2、 下载和安装GWT</p>
            <p>请访问<a href="http://code.google.com/webtoolkit/"><font color=#996699>http://code.google.com/webtoolkit/</font></a>下载GWT的最新版本，将下载的压缩文件解压缩到C:/GWT目录下。本书中的后续内容中将使用%GWT_HOME%变量来引用这个目录。</p>
            <p>GWT工具包支持不同的操作系统，请根据自己的操作系统选择合适的安装包。</p>
            <p>您可以根据实际情况将GWT安装到任意目录下。但是在运行本文中例子的时候，请记住将对应的%GWT_HOME%变量替换为您的实际安装目录。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N100E4><span class=atitle>第一个例子-Hello World！</span></a></p>
            <p>下面的内容中我们将介绍如何使用GWT工具集来完成第一个GWT的例子-"Hello World！"，并且将使用GWT编译及将他转化为Ajax应用，在浏览器中完成测试。</p>
            <p>我们要完成的例子要实现的功能包括：</p>
            <p>1、 在页面上显示一个按钮</p>
            <p>2、 点击该按钮，默认情况下，我们将在按钮后面紧跟着显示字符串"Hello World!"。</p>
            <p>3、 如果点击按钮时，"Hello World!"字符串已经显示在浏览器中，我们要将他隐藏起来。我们现在开始使用GWT工具集完成"Hello World！"例子的开发，下面的步骤是完成"Hello World！"例子开发环境配置、应用开发、编译的基本步骤，同样适用于其他GWT应用的开发，只是根据实际情况可能有增减。</p>
            <p>1、 创建GWT应用开发环境</p>
            <p>从上面的GWT特性部分我们知道，GWT工具包中提供的applicationCreator命令行工具可以帮助我们创建GWT应用开发所需要的环境，因此我们可以直接使用applicationCreator帮助我们完成这项工作。</p>
            <p>打开命令行工具，进入C:/根目录下，执行"mkdi"命令创建新的文件目录HelloWorld。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>C:\&gt; mkdir HelloWorld
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>执行下面的命令将%JAVA_HOME%\bin目录和%GWT_HOME%目录加入到PATH路径中。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>C:\&gt;set path=%JAVA_HOME%\bin;%GWT_HOME%
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>请将命令行中的%JAVA_HOME%替换为实际环境中JDK的安装目录，将%GWT_HOME%替换为GWT工具包的安装目录。</p>
            <p>进入新创建的HelloWorld目录，然后运行applicationCreator命令创建GWT应用开发环境。</p>
            <p>applicationCreator.cmd命令支持的语法如下。</p>
            <p>ApplicationCreator [-eclipse projectName] [-out dir] [-overwrite] [-ignore] className 其中最重要的一个参数是classname，也就是我们创建的GWT应用中的主Java类，我们这里选择使用org.vivianj.gwt.client.HelloWorld。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>C:\HelloWorld&gt;applicationCreator.cmd org.vivianj.gwt.client.HelloWorld
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>根据GWT工具包的默认规则，GWT应用中的主Java类报名的最后一段必须是client。也就是说，只有xxx.client.Xxxx这样命名的Java类才能被识别为正确的GWT应用主类。</p>
            <p>ApplicationCreator工具运行的时候，屏幕上会打印如下内容。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>Created directory C:\HelloWorld\src
                        Created directory C:\HelloWorld\src\org\vivianj\gwt
                        Created directory C:\HelloWorld\src\org\vivianj\gwt\client
                        Created directory C:\HelloWorld\src\org\vivianj\gwt\public
                        Created file C:\HelloWorld\src\org\vivianj\gwt\HelloWorld.gwt.xml
                        Created file C:\HelloWorld\src\org\vivianj\gwt\public\HelloWorld.html
                        Created file C:\HelloWorld\src\org\vivianj\gwt\client\HelloWorld.java
                        Created file C:\HelloWorld\HelloWorld-shell.cmd
                        Created file C:\HelloWorld\HelloWorld-compile.cmd
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>2、 开发"Hello World！"例子</p>
            <p>使用ApplicationCreator工具的时候，ApplicationCreator工具其实已经帮我们生成了符合Hello World!例子要求的全部内容。为了不打断第一个例子的演示过程，我们先简单的了解一下ApplicationCreator工具的生成内容。我们将在将在测试过程后面做出更加详细的分析。</p>
            <p>图1中显示了ApplicationCreator工具执行后生成的目录结构。</p>
            <br><a name=N10146><strong>图1 GWT应用开发环境</strong></a><br><img height=176 alt="图1  GWT应用开发环境" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/images/image003.jpg" width=214 border=0> <br>
            <p>图1中的src\org\vivianj\gwt\client目录中的HelloWorld.java是GWT应用的主类；src\org\vivianj\gwt\public目录中的HelloWorld.html文件是例子的默认页面；src\org\vivianj\gwt目录下的HelloWorld.gwt.xml是GWT应用的配置文件，提供GWT应用中页面和主类的配置信息；根目录下的HelloWorld-compile.cmd文件用于提供将该GWT应用编译成Ajax的命令；根目录下的HelloWorld-shell.cmd文件用于启动宿主模式(Hosted Mode)，方便测试GWT应用。</p>
            <p>3、 在宿主模式下启动"Hello World！"例子</p>
            <p>我们可以直接在命令行中执行HelloWorld-shell.cmd来启动宿主模式(Hosted Mode)，运行新创建的"Hello World！"例子。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>C:\HelloWorld&gt;HelloWorld-shell.cmd
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>这个命令将启动两个可视化界面：Google Web Toolkit Development Shell（见图2）和GWT内置的GWT应用浏览器（见图3），GWT应用浏览器中将显示"Hello World！"例子的初始界面，如果我们点击界面上的"Click Me"按钮，按钮后面将会显示"Hello World!"字符串（见图4），如果再次单击页面上的"Click Me"按钮，按钮后面的"Hello World！"字符串会消失。</p>
            <br><a name=N1016D><strong>图2 Google Web Toolkit Development Shell运行界面</strong></a><br><img height=412 alt="图2  Google Web Toolkit Development Shell运行界面" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/images/image005.jpg" width=480 border=0> <br><br><a name=N1017F><strong>图3 "Hello World！"例子初始运行界面</strong></a><br><img height=359 alt="图3  Hello World！例子初始运行界面" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/images/image007.jpg" width=480 border=0> <br><br><a name=N10191><strong>图4 "Hello World！"例子-单击"Clieck Me"按钮后的界面</strong></a><br><img height=341 alt="图4  Hello World！例子-单击Clieck Me按钮后的界面" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/images/image009.jpg" width=456 border=0> <br>
            <p>4、 编译"Hello World！"例子</p>
            <p>要将GWT应用编译成Ajax应用，我们可以执行HelloWorld-compile.cmd。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>C:\HelloWorld&gt;HelloWorld-compile.cmd
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>命令运行时，界面上将会显示下面的内容。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>Output will be written into C:\HelloWorld\www\org.vivianj.gwt.HelloWorld
                        Copying all files found on public path
                        Compilation succeeded
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>其中的第一行显示生成的Ajax应用位于C:\HelloWorld\www\org.vivianj.gwt.HelloWorld目录下。</p>
            <br><a name=N101C1><strong>图5 "Hello World！"例子编译后的目录结构</strong></a><br><img height=322 alt="图5  Hello World！例子编译后的目录结构" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/images/image011.jpg" width=340 border=0> <br>
            <p>从上面的图中我们可以看到，新生成的www目录下有一个名为org.vivianj.gwt.HelloWorld的目录，它的命名规则是GWT主类全名(org.vivianj.gwt.client.HelloWorld)去掉其中的"client."。</p>
            <p>org.vivianj.gwt.HelloWorld目录下的HelloWorld.html文件就是"Hello World！"例子对应的页面，以.cache.html后缀结尾的文件就是"Hello World！"例子中对应的Ajax代码部分，而gwt.js文件则是GWT提供的、Ajax代码中需要用到的JavaScript公共函数。其他还有些辅助文件。</p>
            <p>5、 Web模式下测试"Hello World！"例子</p>
            <p>运行HelloWorld-compile.cmd后，GWT应用就已经被编译成Ajax应用了，不再依赖于JDK和GWT环境，而仅仅依赖于浏览器。</p>
            <p>我们打开IE浏览器，打开C:\HelloWorld\www\org.vivianj.gwt.HelloWorld\HelloWorld.html文件，就可以看到"Hello World！"例子在Web模式下的运行效果（见图6），单击页面上的"Click Me"按钮，按钮后面会出现"Hello World！"字符串（见图7），如果再次单击页面上的"Click Me"按钮，按钮后面的"Hello World！"字符串会消失。</p>
            <br><a name=N101E2><strong>图6 Web模式下运行"HelloWorld！"例子的默认效果</strong></a><br><img height=308 alt="图6  Web模式下运行 HelloWorld！例子的默认效果" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/images/image013.jpg" width=553 border=0> <br><br><a name=N101F4><strong>图7 Web模式下运行"HelloWorld！"例子-单击"Click Me"按钮后的效果</strong></a><br><img height=308 alt="图7  Web模式下运行 HelloWorld！例子-单击 Click Me按钮后的效果" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/images/image015.jpg" width=553 border=0> <br><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10204><span class=atitle>实例详细分析</span></a></p>
            <p>上面的步骤中，我们已经完成第一个GWT应用的编译和测试，下面我们来详细的介绍一下GWT应用开发过程中涉及的几个文件：显示页面HelloWorld.html、主类HelloWorld和配置文件HelloWorld.gwt.xml。</p>
            <p>1. 显示页面HelloWorld.html</p>
            <p>GWT应用中的HTML内容必须存放在public目录下，public目录的全路径是"org\vivianj\gwt\ublic"，是将主类HelloWorld的包名"org.vivianj.gwt.client"中的client替换为"public"后形成的目录结构。</p>
            <p>我们将主要介绍HelloWorld.html中和GWT相关的内容，HelloWorld.html文件的全部内容见清单1。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>24.    &lt;meta name='gwt:module' content='org.vivianj.gwt.HelloWorld'&gt;
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>在HelloWorld.html文件的第24行，我们使用meta标签指定了本页面和GWT模块" org.vivianj.gwt.HelloWorld"之间的联系，meta标签的name属性是不变的，而content属性则是GWT主类全名(org.vivianj.gwt.client.HelloWorld)去掉其中的"client."后的结果。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>40.	    &lt;script language="javascript" src="gwt.js"&gt;&lt;/script&gt;
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>在HelloWorld.html文件的第40行，我们使用script标记引入GWT工具提供的默认函数库。根据HTML语言的规定，我们可以选择在&lt;head&gt;&lt;/head&gt;之间加入这行代码，也可以选择在&lt;body&gt;&lt;/body&gt;之间加入这段代码。GWT建议在&lt;head&gt;&lt;/head&gt;之间加入这行代码，以便获得稍微快一些的起动速度。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>56.	&lt;td id="slot1"&gt;&lt;/td&gt;&lt;td id="slot2"&gt;&lt;/td&gt;
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>在HelloWorld.html文件的第56行，我们使用td标签定义了两个相邻的表格单元格，他们分别命名为"slot1"和"slot2"，根据"HelloWorld!"例子的要求，名为"slot1"的单元格中应该显示按钮，而名为"slot2"的单元格中则根据情况决定显示"HelloWorld!"字符串或者不显示任何内容。</p>
            <p>我们将在主类HelloWorld.java的源代码中使用RootPanel.get("slot1")来获得对该单元格的引用，请参考下面的"主类HelloWorld"部分的说明。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>43.	&lt;iframe id="__gwt_historyFrame" style="width:0;height:0;border:0"&gt;&lt;/iframe&gt;
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>在HelloWorld.html的第43行，我们使用iframe标签来设置当前页支持历史功能，iframe的属性必须和上面的内容保持一致，否则将不会起到任何效果。</p>
            <br><a name=N10249><strong>清单1 src\org\vivianj\gwt\public\public\HelloWorld.html</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>1.	&lt;html&gt;
                        2.		&lt;head&gt;
                        3.
                        4.			&lt;!--                                           --&gt;
                        5.			&lt;!-- Any title is fine                         --&gt;
                        6.			&lt;!--                                           --&gt;
                        7.			&lt;title&gt;Wrapper HTML for HelloWorld&lt;/title&gt;
                        8.
                        9.			&lt;!--                                           --&gt;
                        10.			&lt;!-- Use normal html, such as style            --&gt;
                        11.			&lt;!--                                           --&gt;
                        12.			&lt;style&gt;
                        13.				body,td,a,div,.p{font-family:arial,sans-serif}
                        14.				div,td{color:#000000}
                        15.				a:link,.w,.w a:link{color:#0000cc}
                        16.				a:visited{color:#551a8b}
                        17.				a:active{color:#ff0000}
                        18.			&lt;/style&gt;
                        19.
                        20.			&lt;!--                                           --&gt;
                        21.			&lt;!-- The module reference below is the link    --&gt;
                        22.			&lt;!-- between html and your Web Toolkit module  --&gt;
                        23.			&lt;!--                                           --&gt;
                        24.			&lt;meta name='gwt:module' content='org.vivianj.gwt.HelloWorld'&gt;
                        25.
                        26.		&lt;/head&gt;
                        27.
                        28.		&lt;!--                                           --&gt;
                        29.		&lt;!-- The body can have arbitrary html, or      --&gt;
                        30.		&lt;!-- you can leave the body empty if you want  --&gt;
                        31.		&lt;!-- to create a completely dynamic ui         --&gt;
                        32.		&lt;!--                                           --&gt;
                        33.		&lt;body&gt;
                        34.
                        35.			&lt;!--                                            --&gt;
                        36.			&lt;!-- This script is required bootstrap stuff.   --&gt;
                        37.			&lt;!-- You can put it in the HEAD, but startup    --&gt;
                        38.			&lt;!-- is slightly faster if you include it here. --&gt;
                        39.			&lt;!--                                            --&gt;
                        40.			&lt;script language="javascript" src="gwt.js"&gt;&lt;/script&gt;
                        41.
                        42.			&lt;!-- OPTIONAL: include this if you want history support --&gt;
                        43.			&lt;iframe id="__gwt_historyFrame"
                        style="width:0;height:0;border:0"&gt;&lt;/iframe&gt;
                        44.
                        45.			&lt;h1&gt;HelloWorld&lt;/h1&gt;
                        46.
                        47.			&lt;p&gt;
                        48.			This is an example of a host page for the HelloWorld application.
                        49.			You can attach a Web Toolkit module to any HTML page you like,
                        50.			making it easy to add bits of AJAX functionality to existing
                        pages
                        51.			without starting from scratch.
                        52.			&lt;/p&gt;
                        53.
                        54.			&lt;table align=center&gt;
                        55.				&lt;tr&gt;
                        56.					&lt;td id="slot1"&gt;&lt;/td&gt;&lt;td
                        id="slot2"&gt;&lt;/td&gt;
                        57.				&lt;/tr&gt;
                        58.			&lt;/table&gt;
                        59.		&lt;/body&gt;
                        60.	&lt;/html&gt;
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>2. 主类HelloWorld</p>
            <p>主类HelloWorld必须继承自com.google.gwt.core.client.EntryPoint类，并且覆盖其public void onModuleLoad()方法。</p>
            <p>在onModuleLoad()方法中，我们使用GWT中提供的默认显示组件(比如Button)和组装组件(比如VerticalPanel)来设计需要显示的界面，所有这些组件都位于com.google.gwt.user.client.ui包下面。这些组件的命名规则和Java AWT的命名规则基本类似，使用方式也和AWT的基本一致，不过GWT中提供了不少的新组建可供选择，比如可以直接用VerticalPanel来实现垂直方向的布局管理。</p>
            <p>HelloWorld.java中的19和20行，就声明了Button和Label两个显示组件。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>19.    final Button button = new Button("Click me");
                        20.    final Label label = new Label();
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>onModuleLoad()方法中，我们需要把生成的显示组件或者组装组建加入到显示页面的对应显示区域。首先，我们需要在页面上使用id属性为显示区域指定唯一的名称(参见清单1中的56行)。com.google.gwt.user.client.ui.RootPanel的静态方法get可以根据传入的字符串参数（参数值就是显示区域的id属性）获取页面上对应的显示区域。</p>
            <p>HelloWorld.java的36、37行，就使用了RootPanel的get方法分别获得页面上id为"slot1"、"slot2"的显示区域，然后调用add方法将生成的Button和Label对象加入到显示区域中。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>36.    RootPanel.get("slot1").add(button);
                        37.    RootPanel.get("slot2").add(label);
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>Ajax最重要的功能就是为用户提供更好的交互体验，GWT中使用和AWT中相同的事件监听机制完成客户端事件监听，GWT中支持的Listener接口包括ChangeListener、ClickListener等。我们可以通过各种各样的Listener接口获得用户界面上所发生的动作，通过处理这些动作来完成对应业务逻辑。</p>
            <p>HelloWorld.java中的第22行~29行的内容就实现了一个ClickListender接口，并且提供了对应的onClick方法实现，用于处理按钮点击后的业务逻辑（判断是否需要显示"Hello World!"字符串），然后调用Button对象的addClickListener方法增加监听器。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>22.    button.addClickListener(new ClickListener() {
                        23.          public void onClick(Widget sender) {
                        24.            if (label.getText().equals(""))
                        25.              label.setText("Hello World!");
                        26.            else
                        27.              label.setText("");
                        28.          }
                        29.    });
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>HelloWorld类的全部源代码内容见清单2。</p>
            <br><a name=N10289><strong>清单2 src\org\vivianj\gwt\client\HelloWorld.java</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>1.	package org.vivianj.gwt.client;
                        2.
                        3.	import com.google.gwt.core.client.EntryPoint;
                        4.	import com.google.gwt.user.client.ui.Button;
                        5.	import com.google.gwt.user.client.ui.ClickListener;
                        6.	import com.google.gwt.user.client.ui.Label;
                        7.	import com.google.gwt.user.client.ui.RootPanel;
                        8.	import com.google.gwt.user.client.ui.Widget;
                        9.
                        10.	/**
                        11.	 * Entry point classes define &lt;code&gt;onModuleLoad()&lt;/code&gt;.
                        12.	 */
                        13.	public class HelloWorld implements EntryPoint {
                        14.
                        15.	  /**
                        16.	   * This is the entry point method.
                        17.	   */
                        18.	  public void onModuleLoad() {
                        19.	    final Button button = new Button("Click me");
                        20.	    final Label label = new Label();
                        21.
                        22.	    button.addClickListener(new ClickListener() {
                        23.	      public void onClick(Widget sender) {
                        24.	        if (label.getText().equals(""))
                        25.	          label.setText("Hello World!");
                        26.	        else
                        27.	          label.setText("");
                        28.	      }
                        29.	    });
                        30.
                        31.	    // Assume that the host HTML has elements defined whose
                        32.	    // IDs are "slot1", "slot2".  In a real app, you probably would not want
                        33.	    // to hard-code IDs.  Instead, you could, for example, search for all
                        34.	    // elements with a particular CSS class and replace them with widgets.
                        35.	    //
                        36.	    RootPanel.get("slot1").add(button);
                        37.	    RootPanel.get("slot2").add(label);
                        38.	  }
                        39.	}
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>3. 配置文件HelloWorld.gwt.xml</p>
            <p>配置文件中包括两个元素。Inherits元素地设置GWT应用的继承信息，而entry-point元素的class属性则用于设置设置GWT应用的主类。</p>
            <br><a name=N10299><strong>清单3 src\org\vivianj\gwt\HelloWorld.gwt.xml</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>1.	&lt;module&gt;
                        2.
                        3.		&lt;!-- Inherit the core Web Toolkit stuff.                  --&gt;
                        4.		&lt;inherits name='com.google.gwt.user.User'/&gt;
                        5.
                        6.		&lt;!-- Specify the app entry point class.                   --&gt;
                        7.		&lt;entry-point class='org.vivianj.gwt.client.HelloWorld'/&gt;
                        8.
                        9.	&lt;/module&gt;
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N102A3><span class=atitle>结束语</span></a></p>
            <p>Ajax是当前热门的Web应用开发技术，Java是企业应用开发中的主流技术，GWT框架将这两种技术合二为一，是我们能够应用Java语言来开发Ajax，在保留Ajax技术的优点基础上，解决了Ajax应用开发、调试困难的缺点。</p>
            <p>本文中介绍了GWT的基本知识、主要特性，提供了"HelloWorld！"例子说明使用Java和GWT框架开发Ajax应用的开发、编译、测试过程，并且通过对"HelloWorld！"例子中涉及文件的分析，讲解了使用GWT框架开发Ajax应用的技术细节和约束条件。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-intro/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N102AF><span class=atitle>下载资源</span></a></p>
            <ul>
                <li>JDK下载地址： <a href="http://java.sun.com/"><font color=#5c81a7>http://java.sun.com</font></a>
                <li></li>
            </ul>
            <br><br>
            <p><a name=resources><span class=atitle>参考资料 </span></a></p>
            <strong>学习</strong><br>
            <ul>
                <li>GWT 在线资源： <a href="http://code.google.com/webtoolkit/gettingstarted.html"><font color=#5c81a7>http://code.google.com/webtoolkit/gettingstarted.html</font></a> <br><br>
                <li>developerWorks 网站 Ajax 技术资源中心：<a href="http://www.ibm.com/developerworks/cn/xml/ajax/"><font color=#5c81a7>http://www.ibm.com/developerworks/cn/xml/ajax/</font></a>。 <br><br></li>
            </ul>
            <br><strong>获得产品和技术</strong><br>
            <ul>
                <li>JDK 下载地址：<a href="http://java.sun.com/"><font color=#5c81a7>http://java.sun.com</font></a> <br><br>
                <li>GWT 下载地址：<a href="http://code.google.com/webtoolkit/"><font color=#996699>http://code.google.com/webtoolkit/</font></a> <br><br></li>
            </ul>
            <br><strong>讨论</strong><br>
            <ul>
                <li>GWT 在线FAQ：<a href="http://code.google.com/webtoolkit/faq.html"><font color=#5c81a7>http://code.google.com/webtoolkit/faq.html</font></a> <br><br>
                <li>GWT 开发者论坛：<a href="http://groups.google.com/group/Google-Web-Toolkit"><font color=#5c81a7>http://groups.google.com/group/Google-Web-Toolkit</font></a>。 </li>
            </ul>
            <br><br>
            <p><a name=author><span class=atitle>关于作者</span></a></p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td colSpan=3><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width="100%"></td>
                    </tr>
                    <tr vAlign=top align=left>
                        <td>
                        <p>&nbsp;</p>
                        </td>
                        <td><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width=4></td>
                        <td width="100%">
                        <p>肖菁，<a href="http://www.vivianj.org/"><font color=#5c81a7>唯 J 族创始人</font></a>，开源项目<a href="http://buildfiledesign.sourceforge.net/"><font color=#5c81a7>BuildFileDesigner</font></a>、<a href="http://v-security.sourceforge.net/"><font color=#5c81a7>V-Security</font></a> 创始人，Open Source 推广人，主要研究 J2EE 编程技术、Web Service 技术以及他们在 WebSphere、WebLogic、 Apache 平台上的实现，拥有 IBM 的 Developing With Websphere Studio 证书。</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jesson2005/aggbug/110101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jesson2005/" target="_blank">张金鹏</a> 2007-04-12 10:46 <a href="http://www.blogjava.net/jesson2005/articles/110101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>