﻿<?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-LiuTing-随笔分类-Ajax学习</title><link>http://www.blogjava.net/LiuTing/category/22603.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 21 May 2007 01:23:59 GMT</lastBuildDate><pubDate>Mon, 21 May 2007 01:23:59 GMT</pubDate><ttl>60</ttl><item><title>DWRUtils API 使用方法</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118676.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118676.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118676.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118676.html</trackback:ping><description><![CDATA[<a>$("precloneNode1suf") 取得该对象;<br><br>DWRUtil.selectRange("selectRangeBasic", 5, 15) 选中selectRangeBasic文本框里面从第五个字符到第15个字符之间的字符.<br><br>DWRUtil._getSelection("selectRangeBasic") 得到selectRangeBasic文本框里选中的字符.<br><br>var arrayFive = [ 'One', 'Two', 'Three', 'Four', 'Five' ];<br>DWRUtil.addOptions('addOptionsBasic', arrayFive); 将数组添加到下拉菜单里面去;<br><br>DWRUtil.getValue('addOptionsBasic') 得到 addOptionsBasic 对象的值;<br>DWRUtil.getValue("precloneNode1Inner1suf", { textContent:true }); 后面加个参数,在 precloneNode1Inner1suf元素为"UL" 时,它返回了元素里面得值,也就是说去掉了HTML标签部分.<br><br>DWRUtil.getText('addOptionsBasic') 得到下拉框 addOptionsBasic 显示的文本;<br><br>var arrayObject = [<br>{ name:'One', value:'1' },<br>{ name:'Two', value:'2' },<br>{ name:'Three', value:'3' },<br>{ name:'Four', value:'4' },<br>{ name:'Five', value:'5' }<br>];<br>DWRUtil.addOptions('addOptionsObject1', arrayObject, "name"); 将数组添加到下拉菜单里面去;后面的参数是确定那个是给用户显示的文本,同时也是值;<br><br>DWRUtil.addOptions('addOptionsObject1', arrayObject, "name","value"); 同上,不过后面参数是: 3=文本;4=值;<br><br>var map = { one:1, two:2, three:3, four:4, five:5 };<br>DWRUtil.addOptions('addOptionsMap1', map); 同上, one 是值;1 是文本;<br>DWRUtil.addOptions('addOptionsMap1', map,true); 同上, 1 是值;one 是文本;<br><br>-------------------------------------------------------------------------------------<br>&lt;ul id="removeItems"&gt;<br>&lt;li&gt;One&lt;/li&gt;&lt;li&gt;Two&lt;/li&gt;&lt;li&gt;Three&lt;/li&gt;&lt;li&gt;Four&lt;/li&gt;&lt;li&gt;Five&lt;/li&gt;<br>&lt;/ul&gt;<br><br>如果是列表显示,如上;则上面所有方法和select 下拉框使用一样;<br>-------------------------------------------------------------------------------------<br>DWRUtil.cloneNode('cloneNode1', { idPrefix:'pre', idSuffix:'suf' });克隆一个节点,参数一为要克隆的节点的id,第二个参数是在克隆的节点id前面加pre,后面加suf.(注意:如果该节点有子节点的话,子节点的名字也一样加)<br><br>DWRUtil.addRows(id, array, cellfuncs, [options]);<br>原理:<br><br>for each member in array<br>for each function in cellfuncs<br>create cell from cellfunc(array[i])<br>循环数组,循环函数,建立单元调用函数;(顺序决定)<br><br>例如:<br>DWRUtil.addRows('addRowsBasic', arrayFive, [<br>function(data) { return data; },<br>function(data) { return data.toUpperCase(); },<br>function(data) {<br>var input = document.createElement("input");<br>input.setAttribute("type", "button");<br>input.setAttribute("value", "DOM Test");<br>input.setAttribute("onclick", "alert('" + data + "');");<br>return input;<br>},<br>function(data) { return "&lt;input type='button' value='innerHTML Test' onclick='alert(\"" + data + "\");'&gt;"; }<br>]);<br><br>高级部分:<br>第四个参数为对单元的高级操作,主要下面的两个方法;<br>function defaultRowCreator(options) {<br>return document.createElement("tr");<br>};<br><br>function defaultCellCreator(options) {<br>return document.createElement("td");<br>};<br><br>例子:<br>DWRUtil.addRows( "demo2",[ 'Africa', 'America', 'Asia', 'Australasia', 'Europe' ] , cellFuncs, {<br>rowCreator:function(options) {<br>var row = document.createElement("tr");<br>var index = options.rowIndex * 50;<br>row.style.color = "rgb(" + index + ",0,0)";<br>return row;<br>},<br>cellCreator:function(options) {<br>var td = document.createElement("td");<br>var index = 255 - (options.rowIndex * 50);<br>td.style.backgroundColor = "rgb(" + index + ",255,255)";<br>td.style.fontWeight = "bold";<br>return td;<br>}<br>});<br><br>其中 options 参数的属性可用的为:(没试过,自己试试吧)<br><br>rowData: the element value from the array (the same for all cells in a row) <br>rowIndex: the key (if map) or index (if array) from the collection <br>rowNum: The row number counting from 0 in this section (so if you are using tbody, it counts rows in the tbody and not the whole table) <br>data: The 'computed' data value for the cell (cellCreators only) <br>cellNum: The cell number that we are altering counting from 0 (cellCreators only) <br><br><br>DWRUtil.setValues(); 批量设置值;<br>var settings = {<br>setValuesDiv:"setValuesDiv",<br>setValuesSpan:"setValuesSpan",<br>setValuesSelect:"two",<br>setValuesText:"setValuesText",<br>setValuesPassword:"AB",<br>setValuesTextarea:"setValuesTextarea",<br>setValuesButton1:"B1-Two",<br>setValuesButton2:"B2-Two",<br>setValuesRadio1:true,<br>setValuesRadio2:false,<br>setValuesRadio3:"one",<br>setValuesRadio4:"two",<br>setValuesCheckbox1:true,<br>setValuesCheckbox2:false<br>};<br>DWRUtil.setValues(settings);<br><br>DWRUtil.getValues(empty);批量获取值;<br>var empty = {<br>setValuesDiv:null,<br>setValuesSpan:null,<br>setValuesSelect:null,<br>setValuesText:null,<br>setValuesPassword:null,<br>setValuesTextarea:null,<br>setValuesButton1:null,<br>setValuesButton2:null,<br>setValuesRadio1:null,<br>setValuesRadio2:null,<br>setValuesRadio3:null,<br>setValuesRadio4:null,<br>setValuesCheckbox1:null,<br>setValuesCheckbox2:null<br>};<br>DWRUtil.getValues(empty);<br><br>DWRUtil.useLoadingMessage("Ping");//类似gmail那个样子,在右上角显示加载"ping";可用自定样式,具体查询;</a><a href="http://getahead.ltd.uk/dwr/browser/util/useloadingmessage" target=_blank><u><font color=#0000ff>http://getahead.ltd.uk/dwr/browser/util/useloadingmessage</font></u></a><br><br>DWRUtil.toDescriptiveString("id",数字);弹出调试信息,数字为0,1,2.一级比一级高.<br><br>DWRUtil.onReturn(event, submitFunction);一般在form表单里面,防止在文本框上按回车就提交表单.<br>例如:<br>&lt;input type="text"<br>onkeypress="DWRUtil.onReturn(event, submitFunction)"/&gt;<br>&lt;input type="button" onclick="submitFunction()"/&gt; 
<img src ="http://www.blogjava.net/LiuTing/aggbug/118676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:46 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR框架实现Ajax</title><link>http://www.blogjava.net/LiuTing/archive/2007/05/20/118675.html</link><dc:creator>LiuTing</dc:creator><author>LiuTing</author><pubDate>Sun, 20 May 2007 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/LiuTing/archive/2007/05/20/118675.html</guid><wfw:comment>http://www.blogjava.net/LiuTing/comments/118675.html</wfw:comment><comments>http://www.blogjava.net/LiuTing/archive/2007/05/20/118675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/LiuTing/comments/commentRss/118675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/LiuTing/services/trackbacks/118675.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax是时下比较流行的一种web界面设计新思路,其核心思想是从浏览器获取XMLHttp对象与服务器端进行交互. DWR（Direct&nbsp;Web&nbsp;Remoting）就是实现了这种Ajax技术的一种web框架. 最近做的项目中我也将它用上了,感觉很是方便,比如动态生成javascript代码,隐藏的http协议,java代码和javascript交互的是javascript的对象(或字符串).&nbsp; 下面是我整理的文档.<br>&nbsp; DWR主要由两部门组成。javascript与web服务器通信并更新web页；运行在web服务器的Servlet处理请求并把响应发回浏览器。<br><br>&nbsp;&nbsp; 1&nbsp; .&nbsp;&nbsp;配置web.xml<br>&lt;servlet&gt; <br>&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br>&nbsp; &lt;servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt;uk.<span style="COLOR: rgb(0,0,0)">ltd</span>.<span style="COLOR: rgb(0,0,0)">getahead</span>.<span style="COLOR: rgb(0,0,0)">dwr</span>.<span style="COLOR: rgb(0,0,0)">DWRServlet</span>&lt;/servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt; <br>&lt;/servlet&gt; <br>&lt;servlet-mapping&gt; <br>&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br>&nbsp; &lt;url-pattern&gt;/dwr<span style="COLOR: rgb(102,102,255)">/*&lt;/url-pattern&gt; <br>&lt;/servlet-mapping&gt;<br></span><br>&nbsp; 2&nbsp;&nbsp;&nbsp; 当我们想看dwr自动生成的测试页时,可在java代码<br>servlet中加 <br>&lt;init-param&gt; <br>&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt; <br>&nbsp; &lt;param-value&gt;<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">true</span>&lt;/param-value&gt; <br>&lt;/init-param&gt;<br><br><span class=postbody>这个参数DWR默认是false.如果选择true.我们可以通过url <a href="http://localhost:port/app/dwr" target=_blank><font color=#366900>http://localhost:port/app/dwr</font></a> ,你就可以看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑，在正式环境下你一定把这个参数设为false.<br></span><br>3&nbsp; log信息配置<br><br>我喜欢用log4j输出日志,那么在log4j.properties下加，log4j.logger.uk.ltd.getahead.dwr = debug。这样可以看DWR的调试日志。 <br><br>4&nbsp; 配置dwr.xml (和web.xml同目录)<br>&nbsp; <br>&lt;create creator="new" javascript="JDate"&gt; <br>&lt;param name="class" value="java.util.Date"/&gt; <br>&lt;/create&gt; </p>
<p>这里的多数元素都是可选的 - 你真正必须知道的是指定一个creator和一个javascript名字。</p>
<p><strong>creator属性</strong> 是必须的 - 它用来指定使用那种创造器。</p>
<p>默认情况下DWR1.1有8种创造器。它们是：</p>
<ul>
    <li><a href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#new"><u><font color=#800080>new</font></u></a>: 用Java的new关键字创造对象。
    <li><a title="None Creator on Creators" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#none"><u><font color=#800080>none</font></u></a>: 它不创建对象，看下面的原因。 (v1.1+)
    <li><a title="Scripted Creator" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#scripted"><u><font color=#800080>scripted</font></u></a>: 通过BSF使用脚本语言创建对象，例如BeanShell或Groovy。
    <li><a title="Spring Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#spring"><u><font color=#800080>spring</font></u></a>: 通过Spring框架访问Bean。
    <li><a title="JSF Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#JSF"><u><font color=#800080>jsf</font></u></a>: 使用JSF的Bean。 (v1.1+)
    <li><a title="Struts Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#Struts"><u><font color=#800080>struts</font></u></a>: 使用Struts的FormBean。 (v1.1+)
    <li><a title="Beehive Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#pageflow"><u><font color=#800080>pageflow</font></u></a>: 访问Beehive或Weblogic的PageFlow。 (v1.1+) </li>
</ul>
<p><strong>javascript属性</strong> 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。</p>
<p><strong>scope属性</strong> 非常类似servlet规范中的scope。 它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。</p>
<p>scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写。</p>
<p><strong>param元素</strong> 被用来指定创造器的其他参数，每种构造器各有不同。例如，"new"创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。</p>
<p><strong>include和exclude元素</strong> 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝"；如果是exclude列表则暗示默认的访问策略是"允许"。</p>
<p><br>5 dwr.jar下载后放lib下<br><br>源码浅析<br><br>dwr的设计很象webwork2的设计,隐藏http协议,扩展性，兼容性及强。</p>
<p>通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作的。<br><br>&lt;servlet&gt; <br>&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br>&nbsp; &lt;servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt;uk.<span style="COLOR: rgb(0,0,0)">ltd</span>.<span style="COLOR: rgb(0,0,0)">getahead</span>.<span style="COLOR: rgb(0,0,0)">dwr</span>.<span style="COLOR: rgb(0,0,0)">DWRServlet</span>&lt;/servlet-<span style="FONT-WEIGHT: bold; COLOR: rgb(153,0,102)" ?="">class</span>&gt; <br>&lt;/servlet&gt; <br>&lt;servlet-mapping&gt; <br>&nbsp; &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br>&nbsp; &lt;url-pattern&gt;/dwr<span style="COLOR: rgb(102,102,255)">/*&lt;/url-pattern&gt; <br>&lt;/servlet-mapping&gt;<br></span><br><font color=#6666ff>这样/dwr/*下的所有的请求都是由这个servlet来处理,到底生理了什么呢,我们还是以例子来说明吧.<br><br><font color=#000000>1 web服务器启动，DWRServlet init()方法调用，init主要做了以下工作。 <br>设置日志级别、实例化DWR用到的单例类（这些类在jvm中只有一个实例对象）、读去配置文件（包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml）。<br>2 请求处理<br>DWRServlet.doGet, doPost方法都调用processor.handle(req, resp)方法处理。Processor对象在init()方法中已经初始化了。&nbsp;<br><br>代码<br>public void handle(HttpServletRequest req, HttpServletResponse resp)&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String pathinfo = req.getPathInfo();&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo == null || pathinfo.length() == 0 || pathinfo.equals("/"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resp.sendRedirect(req.getContextPath() + req.getServletPath() + '/' + "index.html");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.equalsIgnoreCase("/index.html"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doIndex(req, resp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.startsWith("/test/"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doTest(req, resp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.equalsIgnoreCase("/engine.js"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doFile(resp, "engine.js", "text/javascript");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.equalsIgnoreCase("/util.js"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doFile(resp, "util.js", "text/javascript");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.equalsIgnoreCase("/deprecated.js"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doFile(resp, "deprecated.js", "text/javascript");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.startsWith("/interface/"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doInterface(req, resp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pathinfo != null &amp;&amp; pathinfo.startsWith("/exec"))&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doExec(req, resp);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.warn("Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/");&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resp.sendError(404);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }&nbsp; <br><br>dwr/*处理的请求也就这几种。<br><br>（1）dwr/index.html，dwr/test/这种只能在debug模式下使用，调试用。 <br>dwr/engine.js，dwr/util.js，dwr/deprecated.js当这个请求到达，从dwr.jar包中读取文件流，响应回去。（重复请求有缓存） <br>（2）当dwr/interface/这种请求到来，（例如我们在index.html中的 &lt;script type='text/javascript' src='dwr/interface/JDate.js'&gt;&lt;/script&gt;）DWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的 <br>&lt;create creator="new" javascript="JDate"&gt; <br>&lt;param name="class" value="java.util.Date"/&gt; <br>&lt;/create&gt; <br>java.util.Date转化为javascript函数。 <br>http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。 <br>细节也比较简单，通过java反射，把方法都写成javascript特定的方法。（我觉得这些转换可以放到缓存里，下次调用没必要再生成一遍，不知道作者为什么没这样做）。 <br>（3）dwr/exec <br>javascript调用方法时发送这种请求，可能是XMLHttpRequest或IFrame发送。 <br>当然，javascript调用的方法签名与java代码一致，包括参数，还有javascript的回调方法也传到了服务器端，在服务器端很容易实现。回调方法的java的执行结果 返回类似 &lt;script&gt;callMethod(结果)&lt;script&gt;的javascript字符串,在浏览器执行。哈，一切就这么简单，巧妙。<br><br>我这里还有DWR中文文档.&nbsp;<a href="http://www.blogjava.net/Files/LiuTing/DWR">http://www.blogjava.net/Files/LiuTing/DWR</a>中文文档.rar</font><br><br></font><br><br><br></p>
<img src ="http://www.blogjava.net/LiuTing/aggbug/118675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/LiuTing/" target="_blank">LiuTing</a> 2007-05-20 12:45 <a href="http://www.blogjava.net/LiuTing/archive/2007/05/20/118675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>