<wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
24</wbr><wbr style="LINE-HEIGHT: 1.3em">
25</wbr><wbr style="LINE-HEIGHT: 1.3em">
26</wbr><wbr style="LINE-HEIGHT: 1.3em">
27</wbr><wbr style="LINE-HEIGHT: 1.3em">
28</wbr><wbr style="LINE-HEIGHT: 1.3em">
29</wbr><wbr style="LINE-HEIGHT: 1.3em">
30</wbr><wbr style="LINE-HEIGHT: 1.3em">
31</wbr><wbr style="LINE-HEIGHT: 1.3em">
32</wbr><wbr style="LINE-HEIGHT: 1.3em">
33</wbr><wbr style="LINE-HEIGHT: 1.3em">
34</wbr><wbr style="LINE-HEIGHT: 1.3em">
35</wbr><wbr style="LINE-HEIGHT: 1.3em">
36</wbr><wbr style="LINE-HEIGHT: 1.3em">
37</wbr><wbr style="LINE-HEIGHT: 1.3em">
38</wbr><wbr style="LINE-HEIGHT: 1.3em">
39</wbr><wbr style="LINE-HEIGHT: 1.3em">
40</wbr><wbr style="LINE-HEIGHT: 1.3em">
41</wbr><wbr style="LINE-HEIGHT: 1.3em">
42</wbr><wbr style="LINE-HEIGHT: 1.3em">
43</wbr><wbr style="LINE-HEIGHT: 1.3em">
44</wbr><wbr style="LINE-HEIGHT: 1.3em">
45</wbr><wbr style="LINE-HEIGHT: 1.3em">
46</wbr><wbr style="LINE-HEIGHT: 1.3em">
47</wbr><wbr style="LINE-HEIGHT: 1.3em">
48</wbr><wbr style="LINE-HEIGHT: 1.3em">
49</wbr><wbr style="LINE-HEIGHT: 1.3em">
50</wbr><wbr style="LINE-HEIGHT: 1.3em">
51</wbr><wbr style="LINE-HEIGHT: 1.3em">
52</wbr><wbr style="LINE-HEIGHT: 1.3em">
53</wbr><wbr style="LINE-HEIGHT: 1.3em">
54</wbr><wbr style="LINE-HEIGHT: 1.3em">
55</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>package</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> onlyfun.caterpillar;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.io.IOException;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.io.PrintWriter;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.util.LinkedList;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.util.List;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.ServletException;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.http.HttpServletRequest;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.http.HttpServletResponse;
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>class</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> ChatRoomServlet <wbr>extends</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.http.HttpServlet <wbr>implements</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.Servlet {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>static</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> LinkedList<Message> messages = <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> LinkedList<Message>();
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> ChatRoomServlet() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>super</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> List<Message> addMessage(String text) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (text != <wbr>null</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> && text.trim().length() > 0) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
messages.addFirst( <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Message(text));
<wbr>while</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (messages.size() > 10) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
messages.removeLast();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> messages;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> List<Message> getMessages() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> messages;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>protected</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>void</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> doPost(HttpServletRequest request, HttpServletResponse response) <wbr>throws</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> ServletException, IOException {</wbr><wbr style="LINE-HEIGHT: 1.3em">
List<Message> list = <wbr>null</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">;
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">( "send"</wbr><wbr style="LINE-HEIGHT: 1.3em">.equals(request.getParameter( "task"</wbr><wbr style="LINE-HEIGHT: 1.3em">))) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
list = addMessage(request.getParameter( "msg"</wbr><wbr style="LINE-HEIGHT: 1.3em">));
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>else</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">( "query"</wbr><wbr style="LINE-HEIGHT: 1.3em">.equals(request.getParameter( "task"</wbr><wbr style="LINE-HEIGHT: 1.3em">))) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
list = getMessages();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
PrintWriter out = response.getWriter();
response.setContentType( "text/xml"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
response.setHeader( "Cache-Control"</wbr><wbr style="LINE-HEIGHT: 1.3em">, "no-cache"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
out.println( "<response>"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
<wbr>for</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">( <wbr>int</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> i = 0; i < list.size(); i++) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
String msg = list.get(i).getText();
out.println( "<message>"</wbr><wbr style="LINE-HEIGHT: 1.3em"> + msg + "</message>"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
out.println( "</response>"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
Message物件如下…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>package</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> onlyfun.caterpillar;
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>class</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Message {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>long</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> id = System.currentTimeMillis();
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> String text;
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Message(String newtext) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
text = newtext;
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (text.length() > 256) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
text = text.substring(0, 256);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
text = text.replace( '<'</wbr><wbr style="LINE-HEIGHT: 1.3em">, '['</wbr><wbr style="LINE-HEIGHT: 1.3em">);
text = text.replace( '&'</wbr><wbr style="LINE-HEIGHT: 1.3em">, '_'</wbr><wbr style="LINE-HEIGHT: 1.3em">);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>long</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> getId() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> id;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> String getText() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> text;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
Servlet接受訊息新增與查詢,判斷的方式是檢查請求參數task是send或query。
Servlet會以XML傳回目前List當中的訊息,客戶端可以查詢或插入新訊息時,取得目前List中的訊息,接著在web.xml中設定一下…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
<?xml version= "1.0"</wbr><wbr style="LINE-HEIGHT: 1.3em"> encoding= "UTF-8"</wbr><wbr style="LINE-HEIGHT: 1.3em">?>
<web-app id= "WebApp_ID"</wbr><wbr style="LINE-HEIGHT: 1.3em"> version= "2.4"</wbr><wbr style="LINE-HEIGHT: 1.3em"> xmlns= "http://java.sun.com/xml/ns/j2ee"</wbr><wbr style="LINE-HEIGHT: 1.3em"> xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"</wbr><wbr style="LINE-HEIGHT: 1.3em"> xsi:schemaLocation= "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<servlet>
<description>
</description>
<display-name>
ChatRoomServlet</display-name>
<servlet-name>ChatRoomServlet</servlet-name>
<servlet-class>
onlyfun.caterpillar.ChatRoomServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChatRoomServlet</servlet-name>
<url-pattern>/ChatRoomServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
在網頁中,使用者可以在輸入訊息後按下按鈕送出資訊,並在XML回應取得時,將訊息以一列一列的表格方式顯示出來,另外還設定了週期性的輪詢,即使不輸入新訊息,也可以週期性的取得新的聊天訊息…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
24</wbr><wbr style="LINE-HEIGHT: 1.3em">
25</wbr><wbr style="LINE-HEIGHT: 1.3em">
26</wbr><wbr style="LINE-HEIGHT: 1.3em">
27</wbr><wbr style="LINE-HEIGHT: 1.3em">
28</wbr><wbr style="LINE-HEIGHT: 1.3em">
29</wbr><wbr style="LINE-HEIGHT: 1.3em">
30</wbr><wbr style="LINE-HEIGHT: 1.3em">
31</wbr><wbr style="LINE-HEIGHT: 1.3em">
32</wbr><wbr style="LINE-HEIGHT: 1.3em">
33</wbr><wbr style="LINE-HEIGHT: 1.3em">
34</wbr><wbr style="LINE-HEIGHT: 1.3em">
35</wbr><wbr style="LINE-HEIGHT: 1.3em">
36</wbr><wbr style="LINE-HEIGHT: 1.3em">
37</wbr><wbr style="LINE-HEIGHT: 1.3em">
38</wbr><wbr style="LINE-HEIGHT: 1.3em">
39</wbr><wbr style="LINE-HEIGHT: 1.3em">
40</wbr><wbr style="LINE-HEIGHT: 1.3em">
41</wbr><wbr style="LINE-HEIGHT: 1.3em">
42</wbr><wbr style="LINE-HEIGHT: 1.3em">
43</wbr><wbr style="LINE-HEIGHT: 1.3em">
44</wbr><wbr style="LINE-HEIGHT: 1.3em">
45</wbr><wbr style="LINE-HEIGHT: 1.3em">
46</wbr><wbr style="LINE-HEIGHT: 1.3em">
47</wbr><wbr style="LINE-HEIGHT: 1.3em">
48</wbr><wbr style="LINE-HEIGHT: 1.3em">
49</wbr><wbr style="LINE-HEIGHT: 1.3em">
50</wbr><wbr style="LINE-HEIGHT: 1.3em">
51</wbr><wbr style="LINE-HEIGHT: 1.3em">
52</wbr><wbr style="LINE-HEIGHT: 1.3em">
53</wbr><wbr style="LINE-HEIGHT: 1.3em">
54</wbr><wbr style="LINE-HEIGHT: 1.3em">
55</wbr><wbr style="LINE-HEIGHT: 1.3em">
56</wbr><wbr style="LINE-HEIGHT: 1.3em">
57</wbr><wbr style="LINE-HEIGHT: 1.3em">
58</wbr><wbr style="LINE-HEIGHT: 1.3em">
59</wbr><wbr style="LINE-HEIGHT: 1.3em">
60</wbr><wbr style="LINE-HEIGHT: 1.3em">
61</wbr><wbr style="LINE-HEIGHT: 1.3em">
62</wbr><wbr style="LINE-HEIGHT: 1.3em">
63</wbr><wbr style="LINE-HEIGHT: 1.3em">
64</wbr><wbr style="LINE-HEIGHT: 1.3em">
65</wbr><wbr style="LINE-HEIGHT: 1.3em">
66</wbr><wbr style="LINE-HEIGHT: 1.3em">
67</wbr><wbr style="LINE-HEIGHT: 1.3em">
68</wbr><wbr style="LINE-HEIGHT: 1.3em">
69</wbr><wbr style="LINE-HEIGHT: 1.3em">
70</wbr><wbr style="LINE-HEIGHT: 1.3em">
71</wbr><wbr style="LINE-HEIGHT: 1.3em">
72</wbr><wbr style="LINE-HEIGHT: 1.3em">
73</wbr><wbr style="LINE-HEIGHT: 1.3em">
74</wbr><wbr style="LINE-HEIGHT: 1.3em">
75</wbr><wbr style="LINE-HEIGHT: 1.3em">
76</wbr><wbr style="LINE-HEIGHT: 1.3em">
77</wbr><wbr style="LINE-HEIGHT: 1.3em">
78</wbr><wbr style="LINE-HEIGHT: 1.3em">
79</wbr><wbr style="LINE-HEIGHT: 1.3em">
80</wbr><wbr style="LINE-HEIGHT: 1.3em">
81</wbr><wbr style="LINE-HEIGHT: 1.3em">
82</wbr><wbr style="LINE-HEIGHT: 1.3em">
83</wbr><wbr style="LINE-HEIGHT: 1.3em">
84</wbr><wbr style="LINE-HEIGHT: 1.3em">
85</wbr><wbr style="LINE-HEIGHT: 1.3em">
86</wbr><wbr style="LINE-HEIGHT: 1.3em">
87</wbr><wbr style="LINE-HEIGHT: 1.3em">
88</wbr><wbr style="LINE-HEIGHT: 1.3em">
89</wbr><wbr style="LINE-HEIGHT: 1.3em">
90</wbr><wbr style="LINE-HEIGHT: 1.3em">
91</wbr><wbr style="LINE-HEIGHT: 1.3em">
92</wbr><wbr style="LINE-HEIGHT: 1.3em">
93</wbr><wbr style="LINE-HEIGHT: 1.3em">
94</wbr><wbr style="LINE-HEIGHT: 1.3em">
95</wbr><wbr style="LINE-HEIGHT: 1.3em">
96</wbr><wbr style="LINE-HEIGHT: 1.3em">
97</wbr><wbr style="LINE-HEIGHT: 1.3em">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<html>
<head>
<meta http-equiv= "Content-Type"</wbr><wbr style="LINE-HEIGHT: 1.3em"> content= "text/html; charset=BIG5"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<title>Chat Room</title>
<script type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
var xmlHttp;
function createXMLHttpRequest() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (window.ActiveXObject) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
xmlHttp = <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> ActiveXObject( "Microsoft.XMLHTTP"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>else</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (window.XMLHttpRequest) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
xmlHttp = <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> XMLHttpRequest();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function sendMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var msg = document.getElementById( "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">).value;
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">(msg == ""</wbr><wbr style="LINE-HEIGHT: 1.3em">) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
refreshMessage();
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
var param = "task=send&msg="</wbr><wbr style="LINE-HEIGHT: 1.3em"> + msg;
ajaxRequest(param);
document.getElementById( "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">).value = ""</wbr><wbr style="LINE-HEIGHT: 1.3em">;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function queryMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var param = "task=query"</wbr><wbr style="LINE-HEIGHT: 1.3em">;
ajaxRequest(param);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function ajaxRequest(param) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var url = "ChatRoomServlet?timestamp"</wbr><wbr style="LINE-HEIGHT: 1.3em"> + <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Date().getTime();
createXMLHttpRequest();
xmlHttp.onreadystatechange = refreshMessage;
xmlHttp.open( "POST"</wbr><wbr style="LINE-HEIGHT: 1.3em">, url, <wbr>true</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">);
xmlHttp.setRequestHeader( "Content-Type"</wbr><wbr style="LINE-HEIGHT: 1.3em">,
"application/x-www-form-urlencoded;"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
xmlHttp.send(param);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function refreshMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">(xmlHttp.readyState == 4) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">(xmlHttp.status == 200) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var messages = xmlHttp.responseXML.getElementsByTagName( "message"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
var table_body = document.getElementById( "dynamicUpdateArea"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
var length = table_body.childNodes.length;
<wbr>for</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (var i = 0; i < length; i++) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
table_body.removeChild(table_body.childNodes[0]);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
var length = messages.length;
<wbr>for</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">(var i = length - 1; i >= 0 ; i--) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var message = messages[i].firstChild.data;
var row = createRow(message);
table_body.appendChild(row);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
setTimeout( "queryMessage()"</wbr><wbr style="LINE-HEIGHT: 1.3em">, 2000);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function createRow(message) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var row = document.createElement( "tr"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
var cell = document.createElement( "td"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
var cell_data = document.createTextNode(message);
cell.appendChild(cell_data);
row.appendChild(cell);
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> row;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
</script>
</head>
<body>
<p>
Your Message:
<input id= "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
<input type= "button"</wbr><wbr style="LINE-HEIGHT: 1.3em"> value= "Send"</wbr><wbr style="LINE-HEIGHT: 1.3em">
onclick= "sendMessage()"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
</p>
<p>Messages:</p>
<table align= "left"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<tbody id= "dynamicUpdateArea"</wbr><wbr style="LINE-HEIGHT: 1.3em">></tbody>
</table>
</body>
</html>
簡單抓個畫面…
</wbr><wbr>
</wbr><wbr>
直接用AJAX,後端用JSP/Servlet,您要對請求參數做些判斷,看看是新增訊息或查詢,並要自行輸出XML,有的沒的…
改成DWR的話,就很簡單了,寫個簡單的Java物件…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>package</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> onlyfun.caterpillar;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.util.LinkedList;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.util.List;
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>class</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Chat {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>static</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> LinkedList<Message> messages = <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> LinkedList<Message>();
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> List addMessage(String text) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (text != <wbr>null</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> && text.trim().length() > 0) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
messages.addFirst( <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Message(text));
<wbr>while</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (messages.size() > 10) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
messages.removeLast();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> messages;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> List getMessages() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> messages;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
接著…在dwr.xml中開放一下…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
<?xml version= "1.0"</wbr><wbr style="LINE-HEIGHT: 1.3em"> encoding= "UTF-8"</wbr><wbr style="LINE-HEIGHT: 1.3em">?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</wbr><wbr style="LINE-HEIGHT: 1.3em"> "http://www.getahead.ltd.uk/dwr/dwr10.dtd"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<dwr>
<allow>
<create creator= "new"</wbr><wbr style="LINE-HEIGHT: 1.3em"> javascript= "Chat"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<param name= "class"</wbr><wbr style="LINE-HEIGHT: 1.3em"> value= "onlyfun.caterpillar.Chat"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
</create>
<convert converter= "bean"</wbr><wbr style="LINE-HEIGHT: 1.3em"> match= "onlyfun.caterpillar.Message"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
</allow>
</dwr>
使用者取得訊息時,是直接傳回List物件,而List中裝的是Message物件,Message物件是自訂物件,conterver設定為 bean,表示DWR會自動將Message的getter名稱轉換為傳回客戶端的JavaScript物件中的屬性,例如Message中有 getText(),則在客戶端可以用message.text這樣的方式來存取。
接著是簡單的客戶端網頁…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
24</wbr><wbr style="LINE-HEIGHT: 1.3em">
25</wbr><wbr style="LINE-HEIGHT: 1.3em">
26</wbr><wbr style="LINE-HEIGHT: 1.3em">
27</wbr><wbr style="LINE-HEIGHT: 1.3em">
28</wbr><wbr style="LINE-HEIGHT: 1.3em">
29</wbr><wbr style="LINE-HEIGHT: 1.3em">
30</wbr><wbr style="LINE-HEIGHT: 1.3em">
31</wbr><wbr style="LINE-HEIGHT: 1.3em">
32</wbr><wbr style="LINE-HEIGHT: 1.3em">
33</wbr><wbr style="LINE-HEIGHT: 1.3em">
34</wbr><wbr style="LINE-HEIGHT: 1.3em">
35</wbr><wbr style="LINE-HEIGHT: 1.3em">
36</wbr><wbr style="LINE-HEIGHT: 1.3em">
37</wbr><wbr style="LINE-HEIGHT: 1.3em">
38</wbr><wbr style="LINE-HEIGHT: 1.3em">
39</wbr><wbr style="LINE-HEIGHT: 1.3em">
40</wbr><wbr style="LINE-HEIGHT: 1.3em">
41</wbr><wbr style="LINE-HEIGHT: 1.3em">
42</wbr><wbr style="LINE-HEIGHT: 1.3em">
43</wbr><wbr style="LINE-HEIGHT: 1.3em">
44</wbr><wbr style="LINE-HEIGHT: 1.3em">
45</wbr><wbr style="LINE-HEIGHT: 1.3em">
46</wbr><wbr style="LINE-HEIGHT: 1.3em">
47</wbr><wbr style="LINE-HEIGHT: 1.3em">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<html>
<head>
<meta http-equiv= "Content-Type"</wbr><wbr style="LINE-HEIGHT: 1.3em"> content= "text/html; charset=BIG5"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<title>Insert title here</title>
<script src= "dwr/interface/Chat.js"</wbr><wbr style="LINE-HEIGHT: 1.3em"> type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">></script>
<script src= "dwr/engine.js"</wbr><wbr style="LINE-HEIGHT: 1.3em"> type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">></script>
<script src= "dwr/util.js"</wbr><wbr style="LINE-HEIGHT: 1.3em"> type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">></script>
<script type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
function sendMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var text = DWRUtil.getValue( "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
DWRUtil.setValue( "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">, ""</wbr><wbr style="LINE-HEIGHT: 1.3em">);
Chat.addMessage(text, gotMessages);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function gotMessages(messages) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var chatlog = ""</wbr><wbr style="LINE-HEIGHT: 1.3em">;
<wbr>for</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (var data in messages) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
chatlog = "<div>"</wbr><wbr style="LINE-HEIGHT: 1.3em"> + messages[data].text +
"</div>"</wbr><wbr style="LINE-HEIGHT: 1.3em"> + chatlog;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
DWRUtil.setValue( "chatlog"</wbr><wbr style="LINE-HEIGHT: 1.3em">, chatlog);
setTimeout( "queryMessage()"</wbr><wbr style="LINE-HEIGHT: 1.3em">, 2000);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function queryMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
Chat.getMessages(gotMessages);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
</script>
</head>
<body>
<p>
Your Message:
<input id= "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
<input type= "button"</wbr><wbr style="LINE-HEIGHT: 1.3em"> value= "Send"</wbr><wbr style="LINE-HEIGHT: 1.3em">
onclick= "sendMessage()"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
</p>
<p>Messages:</p>
<div id= "chatlog"</wbr><wbr style="LINE-HEIGHT: 1.3em">></div>
</body>
</html>
當List物件傳回時,它成為gotMessages(messages)中的messages物件,而messages物件中包括 Message物件轉換後對應的JavaScript物件,由於我們已經設定了Converter,所以可以用messages[data].text來 取得傳回的訊息…
簡單抓個畫面…
</wbr><wbr>
</wbr><wbr>
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
24</wbr><wbr style="LINE-HEIGHT: 1.3em">
25</wbr><wbr style="LINE-HEIGHT: 1.3em">
26</wbr><wbr style="LINE-HEIGHT: 1.3em">
27</wbr><wbr style="LINE-HEIGHT: 1.3em">
28</wbr><wbr style="LINE-HEIGHT: 1.3em">
29</wbr><wbr style="LINE-HEIGHT: 1.3em">
30</wbr><wbr style="LINE-HEIGHT: 1.3em">
31</wbr><wbr style="LINE-HEIGHT: 1.3em">
32</wbr><wbr style="LINE-HEIGHT: 1.3em">
33</wbr><wbr style="LINE-HEIGHT: 1.3em">
34</wbr><wbr style="LINE-HEIGHT: 1.3em">
35</wbr><wbr style="LINE-HEIGHT: 1.3em">
36</wbr><wbr style="LINE-HEIGHT: 1.3em">
37</wbr><wbr style="LINE-HEIGHT: 1.3em">
38</wbr><wbr style="LINE-HEIGHT: 1.3em">
39</wbr><wbr style="LINE-HEIGHT: 1.3em">
40</wbr><wbr style="LINE-HEIGHT: 1.3em">
41</wbr><wbr style="LINE-HEIGHT: 1.3em">
42</wbr><wbr style="LINE-HEIGHT: 1.3em">
43</wbr><wbr style="LINE-HEIGHT: 1.3em">
44</wbr><wbr style="LINE-HEIGHT: 1.3em">
45</wbr><wbr style="LINE-HEIGHT: 1.3em">
46</wbr><wbr style="LINE-HEIGHT: 1.3em">
47</wbr><wbr style="LINE-HEIGHT: 1.3em">
48</wbr><wbr style="LINE-HEIGHT: 1.3em">
49</wbr><wbr style="LINE-HEIGHT: 1.3em">
50</wbr><wbr style="LINE-HEIGHT: 1.3em">
51</wbr><wbr style="LINE-HEIGHT: 1.3em">
52</wbr><wbr style="LINE-HEIGHT: 1.3em">
53</wbr><wbr style="LINE-HEIGHT: 1.3em">
54</wbr><wbr style="LINE-HEIGHT: 1.3em">
55</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>package</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> onlyfun.caterpillar;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.io.IOException;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.io.PrintWriter;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.util.LinkedList;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.util.List;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.ServletException;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.http.HttpServletRequest;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.http.HttpServletResponse;
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>class</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> ChatRoomServlet <wbr>extends</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.http.HttpServlet <wbr>implements</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> javax.servlet.Servlet {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>static</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> LinkedList<Message> messages = <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> LinkedList<Message>();
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> ChatRoomServlet() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>super</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> List<Message> addMessage(String text) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (text != <wbr>null</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> && text.trim().length() > 0) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
messages.addFirst( <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Message(text));
<wbr>while</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (messages.size() > 10) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
messages.removeLast();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> messages;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> List<Message> getMessages() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> messages;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>protected</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>void</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> doPost(HttpServletRequest request, HttpServletResponse response) <wbr>throws</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> ServletException, IOException {</wbr><wbr style="LINE-HEIGHT: 1.3em">
List<Message> list = <wbr>null</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">;
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">( "send"</wbr><wbr style="LINE-HEIGHT: 1.3em">.equals(request.getParameter( "task"</wbr><wbr style="LINE-HEIGHT: 1.3em">))) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
list = addMessage(request.getParameter( "msg"</wbr><wbr style="LINE-HEIGHT: 1.3em">));
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>else</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">( "query"</wbr><wbr style="LINE-HEIGHT: 1.3em">.equals(request.getParameter( "task"</wbr><wbr style="LINE-HEIGHT: 1.3em">))) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
list = getMessages();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
PrintWriter out = response.getWriter();
response.setContentType( "text/xml"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
response.setHeader( "Cache-Control"</wbr><wbr style="LINE-HEIGHT: 1.3em">, "no-cache"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
out.println( "<response>"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
<wbr>for</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">( <wbr>int</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> i = 0; i < list.size(); i++) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
String msg = list.get(i).getText();
out.println( "<message>"</wbr><wbr style="LINE-HEIGHT: 1.3em"> + msg + "</message>"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
out.println( "</response>"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
Message物件如下…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>package</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> onlyfun.caterpillar;
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>class</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Message {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>long</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> id = System.currentTimeMillis();
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> String text;
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Message(String newtext) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
text = newtext;
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (text.length() > 256) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
text = text.substring(0, 256);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
text = text.replace( '<'</wbr><wbr style="LINE-HEIGHT: 1.3em">, '['</wbr><wbr style="LINE-HEIGHT: 1.3em">);
text = text.replace( '&'</wbr><wbr style="LINE-HEIGHT: 1.3em">, '_'</wbr><wbr style="LINE-HEIGHT: 1.3em">);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>long</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> getId() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> id;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> String getText() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> text;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
Servlet接受訊息新增與查詢,判斷的方式是檢查請求參數task是send或query。
Servlet會以XML傳回目前List當中的訊息,客戶端可以查詢或插入新訊息時,取得目前List中的訊息,接著在web.xml中設定一下…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
<?xml version= "1.0"</wbr><wbr style="LINE-HEIGHT: 1.3em"> encoding= "UTF-8"</wbr><wbr style="LINE-HEIGHT: 1.3em">?>
<web-app id= "WebApp_ID"</wbr><wbr style="LINE-HEIGHT: 1.3em"> version= "2.4"</wbr><wbr style="LINE-HEIGHT: 1.3em"> xmlns= "http://java.sun.com/xml/ns/j2ee"</wbr><wbr style="LINE-HEIGHT: 1.3em"> xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"</wbr><wbr style="LINE-HEIGHT: 1.3em"> xsi:schemaLocation= "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<servlet>
<description>
</description>
<display-name>
ChatRoomServlet</display-name>
<servlet-name>ChatRoomServlet</servlet-name>
<servlet-class>
onlyfun.caterpillar.ChatRoomServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ChatRoomServlet</servlet-name>
<url-pattern>/ChatRoomServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>
在網頁中,使用者可以在輸入訊息後按下按鈕送出資訊,並在XML回應取得時,將訊息以一列一列的表格方式顯示出來,另外還設定了週期性的輪詢,即使不輸入新訊息,也可以週期性的取得新的聊天訊息…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
24</wbr><wbr style="LINE-HEIGHT: 1.3em">
25</wbr><wbr style="LINE-HEIGHT: 1.3em">
26</wbr><wbr style="LINE-HEIGHT: 1.3em">
27</wbr><wbr style="LINE-HEIGHT: 1.3em">
28</wbr><wbr style="LINE-HEIGHT: 1.3em">
29</wbr><wbr style="LINE-HEIGHT: 1.3em">
30</wbr><wbr style="LINE-HEIGHT: 1.3em">
31</wbr><wbr style="LINE-HEIGHT: 1.3em">
32</wbr><wbr style="LINE-HEIGHT: 1.3em">
33</wbr><wbr style="LINE-HEIGHT: 1.3em">
34</wbr><wbr style="LINE-HEIGHT: 1.3em">
35</wbr><wbr style="LINE-HEIGHT: 1.3em">
36</wbr><wbr style="LINE-HEIGHT: 1.3em">
37</wbr><wbr style="LINE-HEIGHT: 1.3em">
38</wbr><wbr style="LINE-HEIGHT: 1.3em">
39</wbr><wbr style="LINE-HEIGHT: 1.3em">
40</wbr><wbr style="LINE-HEIGHT: 1.3em">
41</wbr><wbr style="LINE-HEIGHT: 1.3em">
42</wbr><wbr style="LINE-HEIGHT: 1.3em">
43</wbr><wbr style="LINE-HEIGHT: 1.3em">
44</wbr><wbr style="LINE-HEIGHT: 1.3em">
45</wbr><wbr style="LINE-HEIGHT: 1.3em">
46</wbr><wbr style="LINE-HEIGHT: 1.3em">
47</wbr><wbr style="LINE-HEIGHT: 1.3em">
48</wbr><wbr style="LINE-HEIGHT: 1.3em">
49</wbr><wbr style="LINE-HEIGHT: 1.3em">
50</wbr><wbr style="LINE-HEIGHT: 1.3em">
51</wbr><wbr style="LINE-HEIGHT: 1.3em">
52</wbr><wbr style="LINE-HEIGHT: 1.3em">
53</wbr><wbr style="LINE-HEIGHT: 1.3em">
54</wbr><wbr style="LINE-HEIGHT: 1.3em">
55</wbr><wbr style="LINE-HEIGHT: 1.3em">
56</wbr><wbr style="LINE-HEIGHT: 1.3em">
57</wbr><wbr style="LINE-HEIGHT: 1.3em">
58</wbr><wbr style="LINE-HEIGHT: 1.3em">
59</wbr><wbr style="LINE-HEIGHT: 1.3em">
60</wbr><wbr style="LINE-HEIGHT: 1.3em">
61</wbr><wbr style="LINE-HEIGHT: 1.3em">
62</wbr><wbr style="LINE-HEIGHT: 1.3em">
63</wbr><wbr style="LINE-HEIGHT: 1.3em">
64</wbr><wbr style="LINE-HEIGHT: 1.3em">
65</wbr><wbr style="LINE-HEIGHT: 1.3em">
66</wbr><wbr style="LINE-HEIGHT: 1.3em">
67</wbr><wbr style="LINE-HEIGHT: 1.3em">
68</wbr><wbr style="LINE-HEIGHT: 1.3em">
69</wbr><wbr style="LINE-HEIGHT: 1.3em">
70</wbr><wbr style="LINE-HEIGHT: 1.3em">
71</wbr><wbr style="LINE-HEIGHT: 1.3em">
72</wbr><wbr style="LINE-HEIGHT: 1.3em">
73</wbr><wbr style="LINE-HEIGHT: 1.3em">
74</wbr><wbr style="LINE-HEIGHT: 1.3em">
75</wbr><wbr style="LINE-HEIGHT: 1.3em">
76</wbr><wbr style="LINE-HEIGHT: 1.3em">
77</wbr><wbr style="LINE-HEIGHT: 1.3em">
78</wbr><wbr style="LINE-HEIGHT: 1.3em">
79</wbr><wbr style="LINE-HEIGHT: 1.3em">
80</wbr><wbr style="LINE-HEIGHT: 1.3em">
81</wbr><wbr style="LINE-HEIGHT: 1.3em">
82</wbr><wbr style="LINE-HEIGHT: 1.3em">
83</wbr><wbr style="LINE-HEIGHT: 1.3em">
84</wbr><wbr style="LINE-HEIGHT: 1.3em">
85</wbr><wbr style="LINE-HEIGHT: 1.3em">
86</wbr><wbr style="LINE-HEIGHT: 1.3em">
87</wbr><wbr style="LINE-HEIGHT: 1.3em">
88</wbr><wbr style="LINE-HEIGHT: 1.3em">
89</wbr><wbr style="LINE-HEIGHT: 1.3em">
90</wbr><wbr style="LINE-HEIGHT: 1.3em">
91</wbr><wbr style="LINE-HEIGHT: 1.3em">
92</wbr><wbr style="LINE-HEIGHT: 1.3em">
93</wbr><wbr style="LINE-HEIGHT: 1.3em">
94</wbr><wbr style="LINE-HEIGHT: 1.3em">
95</wbr><wbr style="LINE-HEIGHT: 1.3em">
96</wbr><wbr style="LINE-HEIGHT: 1.3em">
97</wbr><wbr style="LINE-HEIGHT: 1.3em">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<html>
<head>
<meta http-equiv= "Content-Type"</wbr><wbr style="LINE-HEIGHT: 1.3em"> content= "text/html; charset=BIG5"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<title>Chat Room</title>
<script type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
var xmlHttp;
function createXMLHttpRequest() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (window.ActiveXObject) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
xmlHttp = <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> ActiveXObject( "Microsoft.XMLHTTP"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>else</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (window.XMLHttpRequest) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
xmlHttp = <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> XMLHttpRequest();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function sendMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var msg = document.getElementById( "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">).value;
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">(msg == ""</wbr><wbr style="LINE-HEIGHT: 1.3em">) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
refreshMessage();
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
var param = "task=send&msg="</wbr><wbr style="LINE-HEIGHT: 1.3em"> + msg;
ajaxRequest(param);
document.getElementById( "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">).value = ""</wbr><wbr style="LINE-HEIGHT: 1.3em">;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function queryMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var param = "task=query"</wbr><wbr style="LINE-HEIGHT: 1.3em">;
ajaxRequest(param);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function ajaxRequest(param) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var url = "ChatRoomServlet?timestamp"</wbr><wbr style="LINE-HEIGHT: 1.3em"> + <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Date().getTime();
createXMLHttpRequest();
xmlHttp.onreadystatechange = refreshMessage;
xmlHttp.open( "POST"</wbr><wbr style="LINE-HEIGHT: 1.3em">, url, <wbr>true</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">);
xmlHttp.setRequestHeader( "Content-Type"</wbr><wbr style="LINE-HEIGHT: 1.3em">,
"application/x-www-form-urlencoded;"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
xmlHttp.send(param);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function refreshMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">(xmlHttp.readyState == 4) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">(xmlHttp.status == 200) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var messages = xmlHttp.responseXML.getElementsByTagName( "message"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
var table_body = document.getElementById( "dynamicUpdateArea"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
var length = table_body.childNodes.length;
<wbr>for</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (var i = 0; i < length; i++) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
table_body.removeChild(table_body.childNodes[0]);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
var length = messages.length;
<wbr>for</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em">(var i = length - 1; i >= 0 ; i--) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var message = messages[i].firstChild.data;
var row = createRow(message);
table_body.appendChild(row);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
setTimeout( "queryMessage()"</wbr><wbr style="LINE-HEIGHT: 1.3em">, 2000);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function createRow(message) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var row = document.createElement( "tr"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
var cell = document.createElement( "td"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
var cell_data = document.createTextNode(message);
cell.appendChild(cell_data);
row.appendChild(cell);
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> row;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
</script>
</head>
<body>
<p>
Your Message:
<input id= "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
<input type= "button"</wbr><wbr style="LINE-HEIGHT: 1.3em"> value= "Send"</wbr><wbr style="LINE-HEIGHT: 1.3em">
onclick= "sendMessage()"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
</p>
<p>Messages:</p>
<table align= "left"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<tbody id= "dynamicUpdateArea"</wbr><wbr style="LINE-HEIGHT: 1.3em">></tbody>
</table>
</body>
</html>
簡單抓個畫面…
</wbr><wbr>

直接用AJAX,後端用JSP/Servlet,您要對請求參數做些判斷,看看是新增訊息或查詢,並要自行輸出XML,有的沒的…
改成DWR的話,就很簡單了,寫個簡單的Java物件…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>package</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> onlyfun.caterpillar;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.util.LinkedList;
<wbr>import</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> java.util.List;
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>class</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Chat {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>private</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> <wbr>static</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> LinkedList<Message> messages = <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> LinkedList<Message>();
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> List addMessage(String text) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>if</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (text != <wbr>null</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> && text.trim().length() > 0) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
messages.addFirst( <wbr>new</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> Message(text));
<wbr>while</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (messages.size() > 10) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
messages.removeLast();
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> messages;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>public</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> List getMessages() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
<wbr>return</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> messages;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
接著…在dwr.xml中開放一下…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
<?xml version= "1.0"</wbr><wbr style="LINE-HEIGHT: 1.3em"> encoding= "UTF-8"</wbr><wbr style="LINE-HEIGHT: 1.3em">?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</wbr><wbr style="LINE-HEIGHT: 1.3em"> "http://www.getahead.ltd.uk/dwr/dwr10.dtd"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<dwr>
<allow>
<create creator= "new"</wbr><wbr style="LINE-HEIGHT: 1.3em"> javascript= "Chat"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<param name= "class"</wbr><wbr style="LINE-HEIGHT: 1.3em"> value= "onlyfun.caterpillar.Chat"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
</create>
<convert converter= "bean"</wbr><wbr style="LINE-HEIGHT: 1.3em"> match= "onlyfun.caterpillar.Message"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
</allow>
</dwr>
使用者取得訊息時,是直接傳回List物件,而List中裝的是Message物件,Message物件是自訂物件,conterver設定為 bean,表示DWR會自動將Message的getter名稱轉換為傳回客戶端的JavaScript物件中的屬性,例如Message中有 getText(),則在客戶端可以用message.text這樣的方式來存取。
接著是簡單的客戶端網頁…
1</wbr><wbr style="LINE-HEIGHT: 1.3em">
2</wbr><wbr style="LINE-HEIGHT: 1.3em">
3</wbr><wbr style="LINE-HEIGHT: 1.3em">
4</wbr><wbr style="LINE-HEIGHT: 1.3em">
5</wbr><wbr style="LINE-HEIGHT: 1.3em">
6</wbr><wbr style="LINE-HEIGHT: 1.3em">
7</wbr><wbr style="LINE-HEIGHT: 1.3em">
8</wbr><wbr style="LINE-HEIGHT: 1.3em">
9</wbr><wbr style="LINE-HEIGHT: 1.3em">
10</wbr><wbr style="LINE-HEIGHT: 1.3em">
11</wbr><wbr style="LINE-HEIGHT: 1.3em">
12</wbr><wbr style="LINE-HEIGHT: 1.3em">
13</wbr><wbr style="LINE-HEIGHT: 1.3em">
14</wbr><wbr style="LINE-HEIGHT: 1.3em">
15</wbr><wbr style="LINE-HEIGHT: 1.3em">
16</wbr><wbr style="LINE-HEIGHT: 1.3em">
17</wbr><wbr style="LINE-HEIGHT: 1.3em">
18</wbr><wbr style="LINE-HEIGHT: 1.3em">
19</wbr><wbr style="LINE-HEIGHT: 1.3em">
20</wbr><wbr style="LINE-HEIGHT: 1.3em">
21</wbr><wbr style="LINE-HEIGHT: 1.3em">
22</wbr><wbr style="LINE-HEIGHT: 1.3em">
23</wbr><wbr style="LINE-HEIGHT: 1.3em">
24</wbr><wbr style="LINE-HEIGHT: 1.3em">
25</wbr><wbr style="LINE-HEIGHT: 1.3em">
26</wbr><wbr style="LINE-HEIGHT: 1.3em">
27</wbr><wbr style="LINE-HEIGHT: 1.3em">
28</wbr><wbr style="LINE-HEIGHT: 1.3em">
29</wbr><wbr style="LINE-HEIGHT: 1.3em">
30</wbr><wbr style="LINE-HEIGHT: 1.3em">
31</wbr><wbr style="LINE-HEIGHT: 1.3em">
32</wbr><wbr style="LINE-HEIGHT: 1.3em">
33</wbr><wbr style="LINE-HEIGHT: 1.3em">
34</wbr><wbr style="LINE-HEIGHT: 1.3em">
35</wbr><wbr style="LINE-HEIGHT: 1.3em">
36</wbr><wbr style="LINE-HEIGHT: 1.3em">
37</wbr><wbr style="LINE-HEIGHT: 1.3em">
38</wbr><wbr style="LINE-HEIGHT: 1.3em">
39</wbr><wbr style="LINE-HEIGHT: 1.3em">
40</wbr><wbr style="LINE-HEIGHT: 1.3em">
41</wbr><wbr style="LINE-HEIGHT: 1.3em">
42</wbr><wbr style="LINE-HEIGHT: 1.3em">
43</wbr><wbr style="LINE-HEIGHT: 1.3em">
44</wbr><wbr style="LINE-HEIGHT: 1.3em">
45</wbr><wbr style="LINE-HEIGHT: 1.3em">
46</wbr><wbr style="LINE-HEIGHT: 1.3em">
47</wbr><wbr style="LINE-HEIGHT: 1.3em">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<html>
<head>
<meta http-equiv= "Content-Type"</wbr><wbr style="LINE-HEIGHT: 1.3em"> content= "text/html; charset=BIG5"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
<title>Insert title here</title>
<script src= "dwr/interface/Chat.js"</wbr><wbr style="LINE-HEIGHT: 1.3em"> type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">></script>
<script src= "dwr/engine.js"</wbr><wbr style="LINE-HEIGHT: 1.3em"> type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">></script>
<script src= "dwr/util.js"</wbr><wbr style="LINE-HEIGHT: 1.3em"> type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">></script>
<script type= "text/javascript"</wbr><wbr style="LINE-HEIGHT: 1.3em">>
function sendMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var text = DWRUtil.getValue( "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">);
DWRUtil.setValue( "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">, ""</wbr><wbr style="LINE-HEIGHT: 1.3em">);
Chat.addMessage(text, gotMessages);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function gotMessages(messages) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
var chatlog = ""</wbr><wbr style="LINE-HEIGHT: 1.3em">;
<wbr>for</wbr><wbr></wbr></wbr><wbr style="LINE-HEIGHT: 1.3em"> (var data in messages) {</wbr><wbr style="LINE-HEIGHT: 1.3em">
chatlog = "<div>"</wbr><wbr style="LINE-HEIGHT: 1.3em"> + messages[data].text +
"</div>"</wbr><wbr style="LINE-HEIGHT: 1.3em"> + chatlog;
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
DWRUtil.setValue( "chatlog"</wbr><wbr style="LINE-HEIGHT: 1.3em">, chatlog);
setTimeout( "queryMessage()"</wbr><wbr style="LINE-HEIGHT: 1.3em">, 2000);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
function queryMessage() {</wbr><wbr style="LINE-HEIGHT: 1.3em">
Chat.getMessages(gotMessages);
}</wbr><wbr style="LINE-HEIGHT: 1.3em">
</script>
</head>
<body>
<p>
Your Message:
<input id= "text"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
<input type= "button"</wbr><wbr style="LINE-HEIGHT: 1.3em"> value= "Send"</wbr><wbr style="LINE-HEIGHT: 1.3em">
onclick= "sendMessage()"</wbr><wbr style="LINE-HEIGHT: 1.3em">/>
</p>
<p>Messages:</p>
<div id= "chatlog"</wbr><wbr style="LINE-HEIGHT: 1.3em">></div>
</body>
</html>
當List物件傳回時,它成為gotMessages(messages)中的messages物件,而messages物件中包括 Message物件轉換後對應的JavaScript物件,由於我們已經設定了Converter,所以可以用messages[data].text來 取得傳回的訊息…
簡單抓個畫面…
</wbr><wbr>
