﻿<?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-zkjbeyond-随笔分类-DWR</title><link>http://www.blogjava.net/zkjbeyond/category/11348.html</link><description>原创专栏 开源学习</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 15:26:31 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 15:26:31 GMT</pubDate><ttl>60</ttl><item><title>ajax blog 搬家</title><link>http://www.blogjava.net/zkjbeyond/archive/2006/08/21/64760.html</link><dc:creator>原创专栏 开源学习</dc:creator><author>原创专栏 开源学习</author><pubDate>Mon, 21 Aug 2006 04:52:00 GMT</pubDate><guid>http://www.blogjava.net/zkjbeyond/archive/2006/08/21/64760.html</guid><wfw:comment>http://www.blogjava.net/zkjbeyond/comments/64760.html</wfw:comment><comments>http://www.blogjava.net/zkjbeyond/archive/2006/08/21/64760.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zkjbeyond/comments/commentRss/64760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zkjbeyond/services/trackbacks/64760.html</trackback:ping><description><![CDATA[BlogJava做为java的专业blog，偶在这老写javascript  ajax的东西，有些不合适。<br /><br />朋友给了个blog,专门放ajax的文章吧！以后这专门写关于java的东西吧。<br /><a href="http://zkj.wisekernel.net">http://zkj.wisekernel.net</a><br /><br />谢谢支持。<img src ="http://www.blogjava.net/zkjbeyond/aggbug/64760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zkjbeyond/" target="_blank">原创专栏 开源学习</a> 2006-08-21 12:52 <a href="http://www.blogjava.net/zkjbeyond/archive/2006/08/21/64760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr2.0 milestone 1 的些新功能</title><link>http://www.blogjava.net/zkjbeyond/archive/2006/04/20/42031.html</link><dc:creator>原创专栏 开源学习</dc:creator><author>原创专栏 开源学习</author><pubDate>Wed, 19 Apr 2006 16:12:00 GMT</pubDate><guid>http://www.blogjava.net/zkjbeyond/archive/2006/04/20/42031.html</guid><wfw:comment>http://www.blogjava.net/zkjbeyond/comments/42031.html</wfw:comment><comments>http://www.blogjava.net/zkjbeyond/archive/2006/04/20/42031.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zkjbeyond/comments/commentRss/42031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zkjbeyond/services/trackbacks/42031.html</trackback:ping><description><![CDATA[   
一直关注DWR项目,我们项目中有些功能有它来实现,总体下来效果不错.一直期待2.0的发布.我一般不等正式版本发布是不会仔细看的,在javaeye
有人提到 DWR version 2.0 milestone 1 is released 了<span class="postbody"><a href="http://getahead.ltd.uk/dwr/changelog/dwr20m1" target="_blank">http://getahead.ltd.uk/dwr/changelog/dwr20m1</a> .下载了看了看.<br /><br />主要特征修改如下:<br /><strong>Reverse Ajax</strong><br />DWR 1.x允许用javascript代码异步调用java代码. DWR 2.0 允许你用java代码调用javascript代码。 Reverse Ajax 可以使你更方便的建立特有通信类应用程序. It can use polling or <a class="" title="" href="http://alex.dojotoolkit.org/?p=545" target="_blank">Comet</a> (long-lived HTTP) queries. <br /><br />发行包里有Chat example 的例子可以直接运行.<br /> <font face="Courier New"><span class="java_type">OutboundVariable</span><span class="java_plain"> ov </span><span class="java_operator">=</span><span class="java_plain"> wctx</span><span class="java_separator">.</span><span class="java_plain">toJavascript</span><span class="java_separator">(</span><span class="java_plain">messages</span><span class="java_separator">);<br /></span></font><span class="java_plain"></span>把java对象转化成javascript代码,在客户端eval()方法执行.(google maps也用了这种方式)<br />服务器把这段javascript代码发到在当前页面的用户,更新页面. 注意这里不是传统web页的拉模式,而是推模式.<br /><h2><font size="3">Cross Domain Ajax: <code>&lt;script&gt;</code> tag manipulation</font></h2><p>大家写ajax+webservice或javascript调用其它web domain的web应用时，可能会遇到麻烦，可能你也有了解决方法。但dwr2.0提供了个<font face="Courier New">&lt;script&gt;</font> tag。可以直接使用<br /><strong>The <code>&lt;signatures&gt;</code> Element<br /></strong>如果你DWR2.0跑在jdk5.0下，<font face="Courier New">signatures将不需要，将由JDK5 generic types提供转换时的疑惑。<br /><strong>DWRUtil Updates<br /><br /></strong>javascript脚本的修改。（略）</font></p><strong>New Attribute Scope - Script<br /></strong><font face="Courier New">（略）<br /></font><strong>Refactoring</strong><br /><font face="Courier New">代码重构，改动较大，包都换成org.directwebremoting<br /></font><strong>Security and Stability<br /></strong>除了支持<strong>j2eeSecurity外，可以用web容器的session来控制权限。</strong><br /><br /><br />从代码角度看dwr2.0可能要集成dojo的一些东西，对spring的集成力度加大。野心不小啊。</span><img src ="http://www.blogjava.net/zkjbeyond/aggbug/42031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zkjbeyond/" target="_blank">原创专栏 开源学习</a> 2006-04-20 00:12 <a href="http://www.blogjava.net/zkjbeyond/archive/2006/04/20/42031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读了遍DWR1.1官方文档，提取的些东西</title><link>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37032.html</link><dc:creator>原创专栏 开源学习</dc:creator><author>原创专栏 开源学习</author><pubDate>Thu, 23 Mar 2006 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37032.html</guid><wfw:comment>http://www.blogjava.net/zkjbeyond/comments/37032.html</wfw:comment><comments>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37032.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zkjbeyond/comments/commentRss/37032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zkjbeyond/services/trackbacks/37032.html</trackback:ping><description><![CDATA[
		<span class="postbody">1、java的方法避免用 java 和 javascript的关键字。 如 try()方法 或 delete()方法。 <br />2、在你的java类中不要出现重载 avoid overloaded methods. <br />3、
在生产环境下，你可以把deprecated.js engine.js util.js
合并成一个，并放到web容器内，直接在htm,jsp中引用。
（对于java代码转换成的javascript代码也可以这么做，免得每次生成javascript代码浪费时间） <br />4、研究一下Bean
Converters。POJOjava对象必须严格按照 getProperty() setProperty()定义。Bean
Converters是按照 java对象的 get set方法工作的。DWR1.1加了Object Converters,是按private
int property;这类属性工作的。 <br />&lt;convert converter="bean" match="example.Fred"/&gt; <br />&lt;param name="exclude" value="property1, property2"/&gt; <br />&lt;/convert&gt; <br />当你这样配置时，java对象转化成的javascript对象不包括property1和property2。 <br />&lt;convert converter="bean" match="example.Fred"/&gt; <br />&lt;param name="include" value="property1, property2"/&gt; <br />&lt;/convert&gt; <br />反过来java对象转化成的javascript对象直包括property1和property2。 <br />5、&lt;convert converter="collection" match="java.util.Collection"/&gt; <br />&lt;convert converter="map" match="java.util.Map"/&gt; <br />这也是容易出问题的地方. <br />如 <br />package example; <br />public class Person{ <br />private String name; <br />get ... set <br />private List relationPerson; <br />public List setRelationPerson(List relationPerson){ <br />this.relationPerson=relationPerson; <br />} <br />} <br />&lt;convert converter="bean" match="example.Person"/&gt; <br />&lt;/convert&gt; <br />&lt;signatures&gt; <br />&lt;![CDATA[ <br />import java.util.Set; <br />import example.Person; <br /><br />Person.setRelationPerson(List&lt;Person&gt;); <br />]]&gt; <br />&lt;/signatures&gt; <br /><br />在jdk1.5泛型中有写法区别 <br /><br /><br />6、另外在Set,List等做为方法参数时也会出现混淆。返回集合类型不会出现问题，想想就知道了。 <br />如
在Test类中有 public Set testBeanSetParam(Set test)
这个方法，客户端得到的javascript方法可能是Test.testBeanSetParam(p0,callback);当我们
javascript调用这个方法时，鬼才知道怎么确定p0的类型,也不可能知道Set集合中该放什么类型的java对象，所以dwr的
special signatures syntax 确定这些集合和内容的类型 <br />&lt;signatures&gt; <br />&lt;![CDATA[ <br />import java.util.Set; <br />import example.Test; <br /><br />Test.testBeanSetParam(Set&lt;TestBean&gt;); <br />&lt;!--Test.stringStringMapParam(Map&lt;String, String&gt;);--&gt; <br />]]&gt; <br />&lt;/signatures&gt; <br />7、Creators <br />&lt;allow&gt; <br />&lt;create creator="..." javascript="..." scope="..."&gt; <br />&lt;param name="..." value="..."/&gt; <br />&lt;auth method="..." role="..."/&gt; <br />&lt;exclude method="..."/&gt; <br />&lt;include method="..."/&gt; <br />&lt;/create&gt; <br />... <br />&lt;/allow&gt; <br />为了更少的暴露业务方法，最好配置include属性。 <br />dwr支持new ,script,struts....几种集成方法，也支持static方法的调用，我觉得最好的是spring,其他感觉是处理遗留问题处理。 <br />8、engine_js 作为dwr框架客户端核心，主要完成xmlHttp或iframe的构造，我们没必要关心它如何实现。有几点创新的我们可以学习下。 <br />Call Batching 我们可以把几个客户端请求一起放送到服务器端，减少了网络交互，但要注意依存关系和他们处理的顺序。 <br />Call Ordering 同步异步调整。一般用默认的就好了。注意依存关系。 <br />Remoting Hooks 钩子，"small AOP" <br />依存关系解释。 如果 request1() request2()两个业务逻辑方法，request2方法需要用到request1方法从服务器端返回的结果。如果调用request2时，request1还没处理或还没请求。 下拉框连动可能有这个问题。 <br />9、util.js propotype.js有些重复，这让我很难受。只能改代码了，可别坏了开元协议。 <br />10、如果你的回调方法想加其他参数 <br />var dataFromBrowser = ...; <br />var callbackProxy = function(dataFromServer) { <br />callbackFunc(dataFromServer, dataFromBrowser); <br />}; <br />var callMetaData = { callback:callbackProxy }; <br />Remote.method(params, callMetaData); <br />11、dwr1.1 <br />1.1只能算一个bug消除版本，没有什么大的功能调整。源代码结构做了些调整。2.0有新的特征加入。 <br /><br />It
has a far broader scope; the major new features are accessibility
enhancements, and what now appears to be called 'Comet'.
在文档中提到了“Comet”，估计与DWR2.0作者想法类似。 <br /><br /><a href="http://forum.javaeye.com/viewtopic.php?t=19089" target="_blank">http://forum.javaeye.com/viewtopic.php?t=19089</a><br /><br />楼主叫server push。 <br /><br /><a href="http://alex.dojotoolkit.org/?p=545" target="_blank">http://alex.dojotoolkit.org/?p=545</a> 给正名了，叫 Comet</span>
		<span class="postbody">
		</span>
		<span class="gensmall">
		</span>
<img src ="http://www.blogjava.net/zkjbeyond/aggbug/37032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zkjbeyond/" target="_blank">原创专栏 开源学习</a> 2006-03-23 13:18 <a href="http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr配置篇web.xml</title><link>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37030.html</link><dc:creator>原创专栏 开源学习</dc:creator><author>原创专栏 开源学习</author><pubDate>Thu, 23 Mar 2006 05:17:00 GMT</pubDate><guid>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37030.html</guid><wfw:comment>http://www.blogjava.net/zkjbeyond/comments/37030.html</wfw:comment><comments>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37030.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zkjbeyond/comments/commentRss/37030.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zkjbeyond/services/trackbacks/37030.html</trackback:ping><description><![CDATA[
		<span class="postbody">1、最小配置 <br /></span>
		<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>java代码: </b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="font-family: 'Courier New',Courier,monospace;">
												<br />&lt;servlet&gt; <br />  &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />  &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 />  &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />  &lt;url-pattern&gt;/dwr<span style="color: rgb(102, 102, 255);">/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt;</span></div>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />2、当我们想看DWR自动生成的测试页（Using debug/test mode）时，可在</span>
		<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>java代码: </b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="font-family: 'Courier New',Courier,monospace;">
												<br />servlet中加 <br />&lt;init-param&gt; <br />  &lt;param-name&gt;debug&lt;/param-name&gt; <br />  &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;</div>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">这个参数DWR默认是false.如果选择true.我们可以通过url <a href="http://localhost:port/app/dwr" target="_blank">http://localhost:port/app/dwr</a> ,你就可以看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑，在正式环境下你一定把这个参数设为false. <br />3、logging信息配置。 <br />在
无java.util.logging的jdk1.3下运行DWR,我们不希望强制用户加一个logging包，而是用HttpServlet.log
()方法来输出日志。如果classpath中包括logging jar包，DWR自动切换用logging输出日志。 <br />如果用HttpServlet.log()方法，以下配置是有效的。 <br /></span>
		<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>java代码: </b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="font-family: 'Courier New',Courier,monospace;">
												<br />&lt;init-param&gt; <br />&lt;param-name&gt;logLevel&lt;/param-name&gt; <br />&lt;param-value&gt;DEBUG&lt;/param-value&gt; <br />&lt;/init-param&gt;</div>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">有效的值是 FATAL, ERROR, WARN (the default), INFO and DEBUG <br /><br />我是喜欢用log4j输出日志，那么在log4j.properties下加，log4j.logger.uk.ltd.getahead.dwr = debug。这样可以看DWR的调试日志。 <br />4、多dwr.xml文件的配置 <br />可能有几种情况，我们一一列举。 一个servlet,多个dwr.xml配置文件；多个servlet，每个servlet对应一个或多个dwr.xml. <br />一个servlet,多个dwr.xml配置文件； <br /></span>
		<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>java代码: </b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="font-family: 'Courier New',Courier,monospace;">
												<br />&lt;servlet&gt; <br />    &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />    &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;init-param&gt; <br />      &lt;param-name&gt;config-<span style="color: rgb(0, 0, 0);" ?="">1</span>&lt;/param-name&gt; <br />      &lt;param-value&gt;WEB-INF/dwr1.<span style="color: rgb(0, 0, 0);">xml</span>&lt;/param-value&gt; <br />    &lt;/init-param&gt; <br />    &lt;init-param&gt; <br />      &lt;param-name&gt;config-<span style="color: rgb(0, 0, 0);" ?="">2</span>&lt;/param-name&gt; <br />      &lt;param-value&gt;WEB-INF/dwr2.<span style="color: rgb(0, 0, 0);">xml</span>&lt;/param-value&gt; <br />    &lt;/init-param&gt; <br />&lt;/servlet&gt;</div>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">在
这种配置下，param-name的值必须以config开头。param-name可以有&gt;=0个。如果没有param-name，那么将会读取
WEB-INF/dwr.xml。如果有大于零个param-name，那么WEB-INF/dwr.xml文件将不会被读取。 <br /><br />多个servlet，每个servlet对应一个或多个dwr.xml <br /></span>
		<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>java代码: </b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="font-family: 'Courier New',Courier,monospace;">
												<br />&lt;servlet&gt; <br />   &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />    &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;!--用classes/dwr.<span style="color: rgb(0, 0, 0);">xml</span>--&gt; <br />&lt;/servlet&gt; <br />&lt;servlet&gt; <br />   &lt;servlet-name&gt;dwr-invoker1&lt;/servlet-name&gt; <br />   &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;init-param&gt; <br />     &lt;param-name&gt;config-admin&lt;/param-name&gt; <br />     &lt;param-value&gt;WEB-INF/dwr1.<span style="color: rgb(0, 0, 0);">xml</span>&lt;/param-value&gt; <br />   &lt;/init-param&gt; <br />   &lt;init-param&gt; <br />     &lt;param-name&gt;debug&lt;/param-name&gt; <br />     &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 />&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<span style="color: rgb(102, 102, 255);">/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br />&lt;servlet-mapping&gt; <br />   &lt;servlet-name&gt;dwr-invoker1&lt;/servlet-name&gt; <br />   &lt;url-pattern&gt;/dwr1/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt;</span></div>
										<br />
								</td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">在这种情况下，我们可以根据J2EE security来控制权限，针对不同url,加不同的角色。 <br />5、dwr的几个扩展点（Plug-ins） <br />DWR对以下接口提供的默认的实现，用户可以继承DWR的默认实现类来达到我们想要的效果。但这至少需要我们读了DWR源码才能做这些工作(dwr源码很是清晰，有兴趣可以学习一下)，以后可能补存这部分。 <br /></span>
		<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>java代码: </b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<div style="font-family: 'Courier New',Courier,monospace;">
												<br />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);">AccessControl</span>    <br />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);">Configuration</span><br />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);">ConverterManager</span><br />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);">CreatorManager</span><br />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);">Processor</span><br />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);">ExecutionContext</span></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/zkjbeyond/aggbug/37030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zkjbeyond/" target="_blank">原创专栏 开源学习</a> 2006-03-23 13:17 <a href="http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr学习1</title><link>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37029.html</link><dc:creator>原创专栏 开源学习</dc:creator><author>原创专栏 开源学习</author><pubDate>Thu, 23 Mar 2006 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37029.html</guid><wfw:comment>http://www.blogjava.net/zkjbeyond/comments/37029.html</wfw:comment><comments>http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37029.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zkjbeyond/comments/commentRss/37029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zkjbeyond/services/trackbacks/37029.html</trackback:ping><description><![CDATA[  这段时间较闲,研究了一番dwr.发现dwr实现的AJAX有些地方确实很是先进.比如动态生成javascript代码;隐藏的http协议;javascript于java代码交互的是javascript对象(或字符串)等. <br />以下是我临时译的一些东西.本来想全译,发现dwr实在是简单,就随便写了.英文居差,现一把. <br /><br />1、DWR: Easy AJAX for JAVA <br /><br />作为一个java open source library,DWR可以帮助开发人员完成应用AJAX技术的web程序。它可以让浏览器上的javascript方法调用运行在web服务器上java方法。 <br /><br />DWR主要由两部门组成。javascript与web服务器通信并更新web页；运行在web服务器的Servlet处理请求并把响应发回浏览器。 <br /><br />DWR
采用新颖的方法实现了AJAX(本来也没有确切的定义)，在java代码基础上动态的生成javascript代码。web开发者可以直接调用这些
javascript代码，然而真正的代码是运行在web服务器上的java code。出与安全考虑，开发者必须配置哪些java
class暴露给DWR.(dwr.xml) <br /><br />这种从(java到javascript)调用机制给用户一种感觉，好象常规的RPC机制，或RMI or SOAP.但是它运行在web上，不需要任何浏览器插件。 <br /><br />DWR
不认为浏览器和web服务器之间协议重要，把系统界面放在首位。最大挑战是java method
call的同步特征与ajax异步特性之间的矛盾。在异步模型里，结果只有在方法结束后才有效。DWR解决了这个问题，把回调函数当成参数传给方法，处理
完成后，自动调用回调方法。 <br /><br />这个图表显示了，通过javascript事件，DWR能改变select的内容，当然这些内容由
java代码返回。 javascript函数Data.getOptions(populateList)由DWR动态生成，这个函数会调用java
class
Data类的方法。DWR处理如何远程调用，包括转换所有的参数和返回的结果（javascript\java）。java方法执行完后，执行回调方法
populateList。在整个过程中我们就想在用本地的方法一样。 <br /><br />2、Getting Started <br /><br />废话少说，试试就ok了。 <br />web.xml <br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br />&lt;!DOCTYPE
web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"&gt; <br /><br />&lt;web-app id="dwr"&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;/servlet&gt; <br />&lt;servlet-mapping&gt; <br />&lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />&lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br />&lt;/web-app&gt; <br /><br />dwr.xml 与web.xml同目录 <br />&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br />&lt;!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"&gt; <br />&lt;dwr&gt; <br />&lt;allow&gt; <br />&lt;create creator="new" javascript="JDate"&gt; <br />&lt;param name="class" value="java.util.Date"/&gt; <br />&lt;/create&gt; <br />&lt;/allow&gt; <br />&lt;/dwr&gt; <br /><br />index.html <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;DWR - Test Home&lt;/title&gt; <br />&lt;script type='text/javascript' src='dwr/interface/JDate.js'&gt;&lt;/script&gt; <br />&lt;script type='text/javascript' src='dwr/engine.js'&gt;&lt;/script&gt; <br />&lt;script&gt; <br />function init(){ <br />JDate.getYear(load); <br />} <br />function load(data){ <br />alert(data+1900+'年') <br />} <br />&lt;/script&gt; <br />&lt;/head&gt; <br />&lt;body onload="init()"&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br /><br />dwr.jar 下载放lib下 <br /><br />完了，什么，够了，就这些。访问ok! <br />3、Examples <br /><a href="http://www.aboutmyhealth.org/" target="_blank">http://www.aboutmyhealth.org/</a> 这不是Google Suggest吗!ok. <br />4、源码浅析 <br />dwr的设计很象webwork2的设计,隐藏http协议,扩展性，兼容性及强。 <br /><br />通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作滴。 <br /><br /><table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"><tbody><tr><td><span class="genmed"><b>java代码: </b></span></td></tr><tr><td class="code"><div style="font-family: 'Courier New',Courier,monospace;"><br />web.<span style="color: rgb(0, 0, 0);">xml</span>配置 <br />&lt;servlet&gt; <br />    &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />    &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 />    &lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt; <br />    &lt;url-pattern&gt;/dwr<span style="color: rgb(102, 102, 255);">/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt;</span></div><br /></td></tr></tbody></table><span class="postbody"><br />这样所有的/dwr/*所有请求都由这个servlet来处理，它到底处理了些什么能。我们还以上面最简单的例子来看。 <br />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()方法中已经初始化了。 <br /></span><table align="center" border="0" cellpadding="3" cellspacing="1" width="90%"><tbody><tr><td><span class="genmed"><b>java代码: </b></span></td></tr><tr><td class="code"><div style="font-family: 'Courier New',Courier,monospace;"><br /><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">public</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">void</span> handle<span style="color: rgb(0, 0, 0);">(</span>HttpServletRequest req, HttpServletResponse resp<span style="color: rgb(0, 0, 0);">)</span><br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">throws</span><span style="color: rgb(170, 170, 221);" ?="">IOException</span><br />    <span style="color: rgb(0, 0, 0);">{</span><br />        <span style="color: rgb(170, 170, 221);" ?="">String</span> pathinfo = req.<span style="color: rgb(0, 0, 0);">getPathInfo</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">if</span><span style="color: rgb(0, 0, 0);">(</span>pathinfo == <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">null</span> || pathinfo.<span style="color: rgb(0, 0, 0);">length</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">)</span> == <span style="color: rgb(0, 0, 0);" ?="">0</span> || pathinfo.<span style="color: rgb(0, 0, 0);">equals</span><span style="color: rgb(0, 0, 0);">(</span>"/"<span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">)</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            resp.<span style="color: rgb(0, 0, 0);">sendRedirect</span><span style="color: rgb(0, 0, 0);">(</span>req.<span style="color: rgb(0, 0, 0);">getContextPath</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">)</span> + req.<span style="color: rgb(0, 0, 0);">getServletPath</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">)</span> + <span style="color: rgb(0, 0, 255);">'/'</span> + "index.<span style="color: rgb(0, 0, 0);">html</span>"<span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">else</span><br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">if</span><span style="color: rgb(0, 0, 0);">(</span>pathinfo != <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">null</span> &amp;&amp; pathinfo.<span style="color: rgb(0, 0, 0);">equalsIgnoreCase</span><span style="color: rgb(0, 0, 0);">(</span>"/index.<span style="color: rgb(0, 0, 0);">html</span>"<span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">)</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            doIndex<span style="color: rgb(0, 0, 0);">(</span>req, resp<span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">else</span><br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">if</span><span style="color: rgb(0, 0, 0);">(</span>pathinfo != <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">null</span> &amp;&amp; pathinfo.<span style="color: rgb(0, 0, 0);">startsWith</span><span style="color: rgb(0, 0, 0);">(</span>"/test/"<span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">)</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            doTest<span style="color: rgb(0, 0, 0);">(</span>req, resp<span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">else</span><br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">if</span><span style="color: rgb(0, 0, 0);">(</span>pathinfo != <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">null</span> &amp;&amp; pathinfo.<span style="color: rgb(0, 0, 0);">equalsIgnoreCase</span><span style="color: rgb(0, 0, 0);">(</span>"/engine.<span style="color: rgb(0, 0, 0);">js</span>"<span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">)</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            doFile<span style="color: rgb(0, 0, 0);">(</span>resp, "engine.<span style="color: rgb(0, 0, 0);">js</span>", "text/javascript"<span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">else</span><br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">if</span><span style="color: rgb(0, 0, 0);">(</span>pathinfo != <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">null</span> &amp;&amp; pathinfo.<span style="color: rgb(0, 0, 0);">equalsIgnoreCase</span><span style="color: rgb(0, 0, 0);">(</span>"/util.<span style="color: rgb(0, 0, 0);">js</span>"<span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">)</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            doFile<span style="color: rgb(0, 0, 0);">(</span>resp, "util.<span style="color: rgb(0, 0, 0);">js</span>", "text/javascript"<span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">else</span><br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">if</span><span style="color: rgb(0, 0, 0);">(</span>pathinfo != <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">null</span> &amp;&amp; pathinfo.<span style="color: rgb(0, 0, 0);">equalsIgnoreCase</span><span style="color: rgb(0, 0, 0);">(</span>"/deprecated.<span style="color: rgb(0, 0, 0);">js</span>"<span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">)</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            doFile<span style="color: rgb(0, 0, 0);">(</span>resp, "deprecated.<span style="color: rgb(0, 0, 0);">js</span>", "text/javascript"<span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">else</span><br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">if</span><span style="color: rgb(0, 0, 0);">(</span>pathinfo != <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">null</span> &amp;&amp; pathinfo.<span style="color: rgb(0, 0, 0);">startsWith</span><span style="color: rgb(0, 0, 0);">(</span>"/<span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">interface</span>/"<span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">)</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            doInterface<span style="color: rgb(0, 0, 0);">(</span>req, resp<span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">else</span><br />        <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">if</span><span style="color: rgb(0, 0, 0);">(</span>pathinfo != <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">null</span> &amp;&amp; pathinfo.<span style="color: rgb(0, 0, 0);">startsWith</span><span style="color: rgb(0, 0, 0);">(</span>"/exec"<span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">)</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            doExec<span style="color: rgb(0, 0, 0);">(</span>req, resp<span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">else</span><br />        <span style="color: rgb(0, 0, 0);">{</span><br />            log.<span style="color: rgb(0, 0, 0);">warn</span><span style="color: rgb(0, 0, 0);">(</span>"Page not found. <span style="color: rgb(0, 0, 0);">In</span> debug/test mode <span style="font-weight: bold; color: rgb(153, 0, 102);" ?="">try</span> viewing /<span style="color: rgb(0, 0, 0);">[</span>WEB-APP<span style="color: rgb(0, 0, 0);">]</span>/dwr/"<span style="color: rgb(0, 0, 0);">)</span>; <br />            resp.<span style="color: rgb(0, 0, 0);">sendError</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);" ?="">404</span><span style="color: rgb(0, 0, 0);">)</span>; <br />        <span style="color: rgb(0, 0, 0);">}</span><br />    <span style="color: rgb(0, 0, 0);">}</span></div><br /></td></tr></tbody></table><span class="postbody"><br />哦。这些恍然大悟。dwr/*处理的请求也就这几种。 <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 /><a href="http://localhost:port/simpledwr/dwr/interface/JDate.js%E7%9C%8B%E7%9C%8B%E5%90%A7%E3%80%82" target="_blank">http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。</a><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的设计构思很是巧妙。 <br />第一、把java类转化为javascript类由dwr自动完成，只需简单的配置。 <br />第二、应用起来极其简单。开发者不要该服务器代码就可以集成。 <br />第三、容易测试。和webwork一样，隐藏的http协议。 <br />第四、及强扩展性。例如与spring集成，只需修改一点代码。 <br />第五、性能。就我与jason,等简单比较，dwr性能可能是最好的。 <br />第六、自动把java对象转化为javascript对象，并且及易扩展。[/code]</span><br /><img src ="http://www.blogjava.net/zkjbeyond/aggbug/37029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zkjbeyond/" target="_blank">原创专栏 开源学习</a> 2006-03-23 13:16 <a href="http://www.blogjava.net/zkjbeyond/archive/2006/03/23/37029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>