﻿<?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-wml-文章分类-DOJO</title><link>http://www.blogjava.net/wml/category/12735.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 07:35:02 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 07:35:02 GMT</pubDate><ttl>60</ttl><item><title>转：DOJO Book 第一章补充 I/O </title><link>http://www.blogjava.net/wml/articles/56492.html</link><dc:creator>wml</dc:creator><author>wml</author><pubDate>Tue, 04 Jul 2006 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/wml/articles/56492.html</guid><description><![CDATA[
		<div class="postTitle">
				<a href="http://blog.csdn.net/burnetzhong/archive/2006/06/28/845865.aspx">
						<img height="13" src="http://blog.csdn.net/images/trans.gif" width="15" border="0" /> Dojo book第一章补充 I/O </a>
		</div>
		<div class="postText">译者序：<br />Dojo book目前还在不断更新和补充中，我会尽量跟上原著的脚步，给大家最新的信息。<br />更新我会用随笔写出来，同时也会更新原文章。<br /><hr width="100%" size="2" /><strong>I/O<br /><br />dojo.io.blind介绍</strong><br /><br />在我们制作dojo的时候，目的是让用户和开发者都能享受到DHTML程序。在很多朋友的支持下，特别是Aaron Boodman和Mark Anderson，我们已经找到了解决可用性的方法。我们提供了一个单独的易用的API和一个包装类，这个类只需要两个文件。dojo.io包提供了对XMLHTTP和一些其他更复杂的传输结构的支持。<br /><br />在dojo.io 包中我们一般最常使用的是dojo.io.bind()方法。dojo.io.blind()是一个标准的异步的请求API，它包含了各种传输层 （transport layers），包括queues of iFrames,XMLHTTP,mod_pubsub,LivePage等等。Dojo会试图为当前的请求选择最合适的传输方法，因为在做网站时一般不 会使用到其他传输，所以我们只用到XMLHTTP。dojo接受一个匿名的类，但是在知道这个类的属性的情况下，把它作为方法参数（function argument）。下面的代码是创建一个请求（request），这个请求会从URL返回原始的字符串。<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">dojo.io.bind({<br />    url: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">http://foo.bar.com/sampleData.txt</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />    load: </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(type, data, evt){ </span><span style="COLOR: rgb(0,128,0)">/*</span><span style="COLOR: rgb(0,128,0)">do something w/ the data </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"> },<br />    mimetype: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">text/plain</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br />});</span></div><br />这就是全部，你提供了一个数据地址，还有一个当你得到返回值时要执行的function。但是如果在请求过程中出错了怎么办呢？我们再来创建一个register来解决：<br /><br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">dojo.io.bind({<br />    url: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">http://foo.bar.com/sampleData.txt</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />    load: </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(type, data, evt){ </span><span style="COLOR: rgb(0,128,0)">/*</span><span style="COLOR: rgb(0,128,0)">do something w/ the data </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"> },<br />    error: </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(type, error){ </span><span style="COLOR: rgb(0,128,0)">/*</span><span style="COLOR: rgb(0,128,0)">do something w/ the error</span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"> },<br />    mimetype: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">text/plain</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br />});</span></div><br />同样也可以只创建一个单独的handler来解决：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">dojo.io.bind({<br />    url: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">http://foo.bar.com/sampleData.txt</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />    handle: </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(type, data, evt){<br />        </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)">(type </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><span style="COLOR: rgb(0,0,0)">load</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">){<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> do something with the data object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">        }</span><span style="COLOR: rgb(0,0,255)">else</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)">(type </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><span style="COLOR: rgb(0,0,0)">error</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">){<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> here, "data" is our error object</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> respond to the error here</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">        }</span><span style="COLOR: rgb(0,0,255)">else</span><span style="COLOR: rgb(0,0,0)">{<br />            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> other types of events might get passed, handle them here</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">        }<br />    },<br />    mimetype: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">text/plain</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br />});</span></div><br />下面的代码提交一段javascript程序段，然后让服务器运行它，一般我们这么做是为了加速程序运行，注意<u>mimetype：<br /></u><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">dojo.io.bind({<br />    url: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">http://foo.bar.com/sampleData.js</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />    load: </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(type, evaldObj){ </span><span style="COLOR: rgb(0,128,0)">/*</span><span style="COLOR: rgb(0,128,0)"> do something </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"> },<br />    mimetype: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">text/javascript</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br />});</span></div><u><br /></u>如果你想确保程序使用XMLHTTP，可以这样写：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">dojo.io.bind({<br />    url: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">http://foo.bar.com/sampleData.js</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />    load: </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(type, evaldObj){ </span><span style="COLOR: rgb(0,128,0)">/*</span><span style="COLOR: rgb(0,128,0)"> do something </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"> },<br />    mimetype: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">text/plain</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">, </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> get plain text, don't eval()</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">    transport: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">XMLHTTPTransport</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br />});</span></div>Being a jack-of-all-trades, <tt class="docutils literal"><span class="pre">bind()</span></tt> also supports the submission of forms via a request (with the single caveat that it won't do file upload over XMLHTTP):<br />作为一个jack-of-all-trades（万事通），bind()同样支持来自于表单提交的数据。<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">dojo.io.bind({<br />    url: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">http://foo.bar.com/processForm.cgi</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />    load: </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(type, evaldObj){ </span><span style="COLOR: rgb(0,128,0)">/*</span><span style="COLOR: rgb(0,128,0)"> do something </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"> },<br />    formNode: document.getElementById(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">formToSubmit</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">)<br />});</span></div>以上只是一些最基本的，其实这些可以不用全部由开发者自定义。<br /><br /><strong>RPC</strong><br />你可以看到，Dojo通过dojo.io.bind提供了简单，强大的方法使用多种多样的I/O functions。但是在开发过程中，程序员会调用很多很多I/O，这同时会给服务器和客户端加重负担。Dojo的RPC服务就是为了减少负担，易用，精简代码而生的。<br /><br />RPC 的全名是Remote Procedre Calls,或者Remote Method Invocation,（译者：远程method调用）。最基本的，RPC允许开发者调用在远程服务器上的方法（method）。Dojo不仅提供了基本 的RPC client包，而且还扩展了它，使它支持JSON-RPC服务和YAHOO服务。同时你也可以自己写出相对于其他服务的类。<br /><br />我们假定有一个需要调用服务器端程序的小程序，假设要调用add(x,y)和subtract(x,y)。在没有特殊情况的条件下，我们的客户端会这样写：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">add </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(x,y) {<br /><br />    request </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> {x: x, y: y};<br /><br />    dojo.io.bind({<br />            url: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">add.php</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />            load: onAddResults,<br />            mimetype: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">text/plain</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />        content: request<br />    });<br />}<br /><br />subtract </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)">(x,y) {<br /><br />    request </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> {x: x, y: y};<br />    <br />    dojo.io.bind({<br />            url: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">subract</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">,<br />            load: onSubtractResults,<br />            mimetype: </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">text/plain</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)"><br />        content: request<br />    });<br />}</span></div><br /><br />你 看，这不是很难。但是无论是我们让服务器运行add和subtract还是让客户端自己计算，这只是一个非常简单的程序。如果我们要调用在服务器上30个 不同method会怎么样呢？我猜我们可能要重复的写几乎一样的代码一遍又一遍，每次都要创建一个请求类（request object),设定URL，设定变量等等。这不仅容易出错，而且还很枯燥。<br />Dojo的RPC客户端简化了这个过程： 
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">{<br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">serviceType</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><span style="COLOR: rgb(0,0,0)">JSON-RPC</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">, <br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">serviceURL</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><span style="COLOR: rgb(0,0,0)">rpcProcessor.php</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">, <br />    </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">methods</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">:[ <br />        {<br />            </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">name</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><span style="COLOR: rgb(0,0,0)">add</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">, <br />            </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">parameters</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">:[<br />                {</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">name</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><span style="COLOR: rgb(0,0,0)">x</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">},<br />                {</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">name</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><span style="COLOR: rgb(0,0,0)">y</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">}    <br />            ]<br />        },<br />        {<br />            </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">name</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><span style="COLOR: rgb(0,0,0)">subtract</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">, <br />            </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">parameters</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">:[<br />                {</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">name</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><span style="COLOR: rgb(0,0,0)">x</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">},<br />                {</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">name</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><span style="COLOR: rgb(0,0,0)">y</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">}    <br />            ]<br />        }<br /><br />    ]<br />}</span></div><br />以上就是对于服务器的定义。一旦定义创建完毕，其他的事情就简单了，我们还可以创建一个类：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> myObject </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> dojo.rpc.JsonService</span><span style="COLOR: rgb(0,0,0)">?</span><span style="COLOR: rgb(0,0,0)">(defintion);</span></div>要使用服务器的方法：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">myObject.add(</span><span style="COLOR: rgb(0,0,0)">3</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)">5</span><span style="COLOR: rgb(0,0,0)">);</span></div><br />我 敢打赌你会在想“我不是只调用方法就够了，我还有得到计算的结果。”你是对的，但这也是非常容易的。服务器端的myObject.add()会返回一个延 缓类（deferred object）。Twisted Python用户可能对延缓类（deferred object）很熟悉，延缓类（deferred object）允许开发者根据返回数据的类型附加一个或更多的回叫（callbacks）和错误处理（errbacks）。这里有一个简单的例子：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> myDeferred </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> myObject.add(</span><span style="COLOR: rgb(0,0,0)">3</span><span style="COLOR: rgb(0,0,0)">,</span><span style="COLOR: rgb(0,0,0)">5</span><span style="COLOR: rgb(0,0,0)">);<br />myDeferred.addCallback(myCallbackMethod);</span></div><br />我 们把mycallbackmethod作为回叫添加到我们的延缓类mydeferred。这时，8会被传递进mycallbackmethod。另一方 面，我们也可以添加一个errback method来处理服务器返回的出错信息。我们随意添加回叫方法（callback），多少都可以，它们会按照我们定义的顺序被调用。<br /><br />以 上的例子都是围绕dojo.rpc.JsonService展开的。我们还可以使用dojo.rpc.YahooService，规范和结构都是一样的。 这两个类都是继承了dojo.rpc.RpcService。要创建自己的类会在第二章中详细介绍。（译者：第二章原著还没有完成）<br /></div>
<img src ="http://www.blogjava.net/wml/aggbug/56492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wml/" target="_blank">wml</a> 2006-07-04 11:04 <a href="http://www.blogjava.net/wml/articles/56492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：DOJO Book 第一章</title><link>http://www.blogjava.net/wml/articles/56489.html</link><dc:creator>wml</dc:creator><author>wml</author><pubDate>Tue, 04 Jul 2006 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/wml/articles/56489.html</guid><description><![CDATA[
		<div class="postTitle">
				<a href="http://blog.csdn.net/burnetzhong/archive/2006/06/21/818324.aspx">
						<img height="13" src="http://blog.csdn.net/images/authorship.gif" width="15" border="0" /> Dojo.Book中文版</a>
		</div>
		<div class="postText">
				<div class="entry">
						<p>英文版<a href="http://d/Administrator%CE%C4%B5%B5%BA%CD%CA%D5%B2%D8%BC%D0/http%7C//manual.dojotoolkit.org/WikiHome/DojoDotBook" target="_blank">:http://manual.dojotoolkit.org/WikiHome/DojoDotBook</a><br />翻译: <a href="http://blog.csdn.net/burnetzhong/" target="_blank">Burnet </a></p>
						<p>译者序:随着web2.0的热潮,google,yahoo等各大web供应商争先恐后的退出自己的ajax开发包,意图争夺ajax标准.究竟鹿死谁手?有人看好Yui,有人喜欢GWT,还有人对这些都嗤之以鼻,认为自己写javascript才是王道.</p>
						<p>好了,谁优谁劣暂放一边,现在我要给大家的是由IBM研发的dojo开发工具(toolkit)的开发首册,由我来翻译.</p>
						<p>最后说一句题外话,本人出国已久,虽然平时经常上CSDN之类的论坛,但是对中文术语还不是非常精通,所以有的时候翻译一些术语的时候不太准确,我 会把那些我拿不准的术语在后面标注上英文,还有本书作者风格比较幽默，有些不能直译中文，也没有必要翻译，我会尽我所能，目的是让大家能掌握Dojo<font color="#990000">。</font></p>
						<p align="center"> </p>
						<p align="center">
								<font color="#990000">做人要厚道，转载请著名专自<a href="http://burnet.wordpress.com/" target="_blank">Burnet's Blog</a>。</font>
						</p>
						<hr />
						<strong>
								<u>介绍：</u>
						</strong>
						<blockquote>
								<p>这里将给你对于dojo的启蒙课程。你可能会跟自己说"这段可以跳过了，因为我已经很了解javascript并且对网站开发很了解了。“不过这里有个机会让你认识到其实你的知识并不是那么扎实，还有很多基础的东西需要学习。</p>
								<p>当 我们给人们介绍dojo的时候，遇到了两种难题。有些用户已经使用DHTML很久，并且对javascript有了很深的理解，他们清楚 javascript能作什么，不能做什么，在脑海里存在定型思维，有些时候，更难让这些人明白dojo。第二种难题就是对于那些新手，他们太缺乏经验和 对javascript的了解了。</p>
								<p>我鼓励这两种朋友都读一下介绍内容，甚至你可以不全看。</p>
								<p>
										<strong>什么是Dojo？</strong>
								</p>
								<blockquote>
										<p>其实总结Dojo到底是什么是非常困难的。我说总结Dojo是很困难的，是因为Dojo是一个可扩展的代码集合 （expandable collection of code)。扩展不只是来自于众多开发者，并且你会发现你可以根据你自己的需要扩展自己的一套东西。就是说，你把目光放在Dojo身上的原因是因为 Dojo可以和javascript取长补短。</p>
										<p>在开发客户端（client－side development）总共有3个主要部分：events，重复使用DHTML blocks，客户端和服务器传递信息。Dojo在这三方面都很在行，并且使他们变的很容易。</p>
								</blockquote>
								<p>
										<strong>历史</strong>
								</p>
								<blockquote>
										<p>译者注：历史我是真不想翻译了，如果有人很感兴趣的话，可以给我留言，我有时间会翻译的。</p>
										<p>。。。。。。。。。。。。</p>
								</blockquote>
								<p>
										<strong>什么是工具（Toolkit）?</strong>
								</p>
								<blockquote>
										<p>很多人认为结构（framework），库（library），工具是同一个意思。但是弄清楚它们之间的区别，对于以后的理解很有帮助。</p>
										<p>
												<strong>Framework</strong>
										</p>
										<p>在软件开发中，为了让其他的项目可以分享和合作，通常定义一个结构（framework）。一个结构通常包含支持程序（support programs），库和一个脚本程序。你可能认识到Dojo就是framework的一个部分，但并不是framework的本身。</p>
										<p>
												<strong>Library</strong>
										</p>
										<p>库文件定义了很多可以引用的方法（function），它们是在任何位置都可以运行的，并不是我们平常自己在程序中定义的方法。看了这些，你可能会说“嘿！dojo就是库的集合！”。你应该是对的，但是，dojo比一个库的集合要包含得多很多。</p>
										<p>
												<strong>Toolkit</strong>
										</p>
										<p>看 过前文，你可能还在琢磨到底dojo是作什么的。很明显，他不是一个结构（framework），它是一个工具（toolkit）或者是一个库？最后让我 来解答一下，通常库都是之前定义好的，你可以引用到你的程序中并使用它们，但是在dojo中，我们在这个库外面加了一层封包系统。这样就使它跟一般的库有 些不一样。</p>
										<p>在这个系统中，我们把库分成很多部分。有核心方法（core functions），还有很多其他不常用的子库（sub library）。这就使你使用dojo的时候感觉它很简洁。下面会有更具体的分析，会让你更加明白dojo。</p>
								</blockquote>
								<p>
										<strong>Dojo会给你什么</strong>
								</p>
								<blockquote>
										<p>曾经，Netscape盛行一时，大部分人都在使用，所以当时Netscape给出了一个网站制作的标准。好景不长，后来出现了微软的IE，IE当时强过Netscape，成为了新的标准。但是这个标准跟W3C有一定的差别，所以在人们制作网站时，开始向IE新标准靠拢。</p>
										<p>很多年过去了，IE依旧不败，而且并没有更新很多。一样多的bug，缺少标准化。慢慢的网虫们开始使用firefox，opera，safari，它们为了跟上W3C的标准，所以更新得很快。</p>
										<p>很多同样的功能，但是对于不同的浏览器需要写不同的代码，这对我们来说意味着什么？意味着我们要做出一个完美的网站是很苦难的。这时一个程序员会去做什么呢？</p>
										<p>
												<strong>知识补充</strong>
										</p>
										<p>如果光使用静态html制作网站，当然不会出现上面的问题，但是这也意味这网站不可能具有交互性，最多的也只是提供一个表单（form）让用户提交，然后再返回一个新的页面显示数据。</p>
										<p>Javascript的出现正是为了解决这些难题。</p>
										<p>
												<strong>解决所有问题</strong>
										</p>
										<p>Dojo不仅是存在于抽象层，并且也是独立存在的。不只是提供一些库，一些方法，一些功能，而且让的代码更加简洁，保证你的代码只包含所需要的部分。</p>
										<p>Dojo会让你的生活更加简单，因为他替你链接了很多东西，把你的复杂项目分成一些小问题，让你的代码更简洁，更有效率，并且可以更好的重复使用。</p>
								</blockquote>
						</blockquote>
						<hr />
						<br />
						<blockquote>
						</blockquote>
						<p>
								<strong>第一章：开始使用Dojo</strong>
						</p>
						<blockquote>
								<p>Dojo有很多版本，你可以一下子不知道该选择哪个，这里可以让你放心，无论你使用的是什么版本，本书中的例子你都可以运行。</p>
								<p>
										<a href="http://download.dojotoolkit.org/release-0.3.1/dojo-0.3.1-ajax.zip" target="_blank">下载Dojo</a>
								</p>
								<p>
										<font color="#990000">（译者注：这个是我使用的版本，zip文件，你也可以自己到<a href="http://d/Administrator%CE%C4%B5%B5%BA%CD%CA%D5%B2%D8%BC%D0/Dojoa%D6%F7%D2%B3" target="_blank">Dojoa主页</a>进行下载。）</font>
								</p>
								<p>
										<strong>Dojo模块（Modules）</strong>
								</p>
								<blockquote>
										<p>Dojo的库定义使用了模块，就像JAVA一样。这样可以让你只引用自己需要的部分，而不是全部，保证了浏览速度。</p>
										<p>例如Dojo的event包定义在模块dojo.event中。</p>
										<p>
												<font color="#990000">（译者注：此部分原著甚是啰嗦，我给精简了一下，有兴趣的朋友可以参见原文。）</font>
										</p>
										<p>引用模块格式：</p>
										<blockquote>
												<p>
														<strong>dojo.require("dojo.module[.sub module]");</strong>
												</p>
										</blockquote>
										<p>例如我们想引用lite effects systems，</p>
										<blockquote>
												<p>
														<strong>dojo.require("dojo.lfx");</strong>
												</p>
										</blockquote>
										<p>这会引入所有lfx下的子模块，当然你也可以使用dojo.lfx.*，如果想单独引用lfx下的toggle模块：</p>
										<blockquote>
												<p>
														<strong>dojo.require("dojo.lfx.toggle");</strong>
												</p>
										</blockquote>
								</blockquote>
								<p>
										<strong>Widgets</strong>
								</p>
								<blockquote>
										<p>什么是widget呢？一个按钮 ，一个图片，这都是widget，最常见的html widget有链接，按钮，输入框。</p>
										<p>使用Dojo可以改变widget ，例如在日期输入框旁边加上一个彩色日历，让用户可以选择日期，与此同时Dojo并不会破坏你原始的输入框，因为Dojo是扩展了你的html而不是替换了它。</p>
										<p>使用widget的优势主要三点：</p>
										<ul>
												<li>跨平台：使用Dojo widget，无论使用任何浏览器，都会准确的得到正确效果。 
</li>
												<li>自动退化：一些老浏览器可能对javascript支持并不是那么完美，Dojo也可以让它们显示出正确的内容，例如前面彩色日历的例子，如果浏览器不支持，那么Dojo会自动将日历退化到一个简单的选择框，或者其他（根据不同widget而定）。 
</li>
												<li>扩展性：你可以利用Dojo提供的widget创造出新的widget，在这个过程中你并不需要从库中复制任何代码或者修改库中的代码。 </li>
										</ul>
										<p>
												<strong>如何使用Widget</strong>
										</p>
										<p>Widget有很多使用方法。Widget会搜索整个网页框架，然后自动把应该添加的内容加入到当中。</p>
										<p>下面是个简单的例子，我们也可以看出WIdget是怎样自动退化的，因为我们并没有给ComboBox定义选择项，而只是一个value，而且所以最后显示出来的只象是一个简单的inputbox<strong>，</strong>如果用户禁用了javascript，显示结果也会一样。</p>
										<blockquote>
												<p>
														<strong>&lt;input dojoType="ComboBox" value="default" dataUrl="comboBoxData.js"&gt;</strong>
												</p>
										</blockquote>
										<p>但是如果我们只想使用W3C标准（<font color="#990000">译者注：没有那些额外的tag，例如dojoType</font>），我们可以用下面的方法。</p>
										<blockquote>
												<p>
														<strong>&lt;input class="dojo-ComboBox?" value="default" dataUrl="comboBoxData.js"&gt;</strong>
												</p>
												<p>
														<strong>&lt;dojo:ComboBox? value="default" dataUrl="comboBoxData.js"&gt;</strong>
												</p>
										</blockquote>
										<p>你可能注意到了dataUrl，他的作用是把comboBoxData.js中的内容加到comboBox中，但是现在comboBoxData.js中没用任何内容。（<font color="#990000">译者注：当然你可以随意改变dataUrl的内容，名字不是固定的。</font>）</p>
										<p>下面是一个select的例子：</p>
										<blockquote>
												<p>
														<strong>&lt;select dojoType="combobox"&gt;<br />&lt;option value="foo"&gt;foo&lt;/option&gt;<br />&lt;option value="bar"&gt;bar&lt;/option&gt;<br />&lt;option value="baz"&gt;baz&lt;/option&gt;<br />&lt;option value="thud"&gt;thud&lt;/option&gt;<br />&lt;/select&gt;</strong>
												</p>
										</blockquote>
										<p>从上面的例子中，你知道了很多事情，但却好像没什么用处，这里只是想告诉你其实dojo并没有那么复杂。</p>
								</blockquote>
								<p>
										<strong>后退和前进</strong>
								</p>
								<blockquote>
										<p>动态网页程序（dynamic web application）避免了频繁的刷新页面，不过通常也带来后退和前进按钮会失去作用。更多的，有的时候，用户可能很难把网页加入收藏夹。</p>
										<p>Dojo提供了一个解决办法，让网页程序处理浏览器的后退和前进，并且提供给浏览器一个唯一的地址。这个解决办法就是使用dojo.undo.browser。</p>
										<p>
												<strong>使用dojo.undo.browser</strong>
										</p>
										<p>在dojo 0.2.2版本中，并没有dojo.undo.browser，这是在0.3以后的版本中才加入的。</p>
										<p>首先，需要使用dojo.undo.browser.setInitialStae(state)设定当浏览器第一次载入网页的状态。</p>
										<blockquote>
												<p>
														<strong>理论</strong>
												</p>
												<p>动 态网页程序会调用XMLHTTPRequest和DOM来更新网页内容而避免了刷新，更新浏览历史，并且也不会改变浏览器的地址栏。这就意味着当用户点击 了后退按钮，整个网页程序丢失了当前运行的状态（state）。而且即使用户想把当前的网页内容加入收藏夹，也是不可能的，因为收藏夹不会记录网页程序运 行的状态，而只会简单的记录下网页程序的地址（URL）。</p>
												<p>开发者可以使用dojo.undo.browser包得到用户点击后退和前进的事件（event），然后根据这些事件来更新页面内容。 dojo.undo.browser通过使用一个隐藏的表单（hidden IFRAME）或者一个唯一的标签（fragment identifier）传递浏览的历史记录。（<font color="#990000">译者注：可以想像成一个cookie或者一个session，但是这个session信息是存储在hidden IFRAME或者标签中</font>） 例如：</p>
												<blockquote>
														<p>
																<strong>http://some.domain.com/my/path/to/page.html#<em>fragmentIdentifier</em></strong>
														</p>
												</blockquote>
												<p>（<font color="#990000">译者注：#fragmentIdentifier就是标签记录）</font></p>
										</blockquote>
										<p>因为当改变标签的时候并不会使网页刷新，所以非常适合记录当前网页程序的状态。当然开发者可以自定义一个更容易读懂的标签，并且使用户可以把它加入收藏夹。</p>
										<p>dojo.undo.browser允许开发者创建一个相对于运行状态的对象（state object），这个对象会得到回叫（callback）当用户点击后退或者前进按钮。</p>
										<p>
												<strong>开发</strong>
										</p>
										<p>下面是使用dojo.undo.browser之前必须作的一些事情：</p>
										<blockquote>
												<p>1：在djConfig中设置<strong>preventBackButtonFix: false</strong>。这样保证了隐藏的表单（hidden IFRAME）将会添加到页面当中，如果不加入这段，dojo.undo.browser不会正常工作。</p>
												<p>
														<font color="#990000">译者注：设置方法就是在header中加入如下代码：</font>
												</p>
												<blockquote>
														<p>
																<font color="#990000">
																		<strong>&lt;script language="JavaScript" type="text/javascript"&gt;<br />djConfig = { isDebug: true, preventBackButtonFix: false };<br />&lt;/script&gt; </strong>
																</font>
														</p>
												</blockquote>
												<p>2: 加入<strong>dojo.require("dojo.undo.browser");</strong></p>
										</blockquote>
										<p>设定网页程序的初始状态：</p>
										<blockquote>
												<p>
														<strong>dojo.undo.browser.setInitialState(state);</strong>
												</p>
										</blockquote>
										<p>当用户每次点击前进或者后退，state对象都会被调用。</p>
										<p>然后我们需要给state对象创建几个方法（function）</p>
										<ul>
												<li>得到后退提示：<strong>back（）</strong>，<strong>backButtion（）</strong>或者<strong>handle（type）</strong>，type可以是“back”或者是“forward”。 
</li>
												<li>得到前进提示：<strong>forward（），forwardButton（）</strong>或者<strong>handle(type）</strong>，type如上。 </li>
										</ul>
										<p>下面是个简单的例子：</p>
										<blockquote>
												<p>
														<strong>var state = {<br />back: function() { alert("Back was clicked!"); },<br />forward: function() { alert("Forward was clicked!"); }<br />}; </strong>
												</p>
										</blockquote>
										<p>注册一个state对象使用下面的方法：</p>
										<blockquote>
												<p>
														<strong>dojo.undo.browser.addToHistory(state);</strong>
												</p>
										</blockquote>
										<p>如 果向改变浏览器的地址（URL），引用state对象的changeUrl属性。如果changeUrl是true，dojo.undo.browser 就将产生一个唯一的标签，如果changeUrl被定义为任何其他的值（不包括undefined，null，0和空string），那么这个值就会被使 用为标签。这样用户就可以把当前页加入收藏夹了。</p>
										<p>
												<strong>提示</strong>
										</p>
								</blockquote>
								<ul>
										<li>如果你要使用changeUrl，即使你不设定自己的标签，也至少定义为true。 
</li>
										<li>如果你要在本机测试，不要使用IE。因为当IE访问本地文件时不会创建历史列表ifram_history.html。请把网页上传到服务器上测试。 
</li>
										<li>Safari2.0.3+：只有后退按钮可以正常工作，并且只有当changeUrl没用使用的时候。 
</li>
										<li>Opera 8.5.3：不会正常运行。 </li>
								</ul>
								<blockquote>
										<p>这里有一个网上的例子：</p>
										<p>
												<a href="http://archive.dojotoolkit.org/nightly/tests/undo/test_browser.html" target="_blank">http://archive.dojotoolkit.org/nightly/tests/undo/test_browser.html</a>
										</p>
								</blockquote>
								<p>
										<strong>发布Dojo</strong>
								</p>
								<blockquote>
										<p>
												<font color="#990000">译者注：此部分的英文版还没有完成，所以暂不翻译了，以后一定会补上。</font>
										</p>
								</blockquote>
						</blockquote>
						<hr />
				</div>
		</div>
<img src ="http://www.blogjava.net/wml/aggbug/56489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wml/" target="_blank">wml</a> 2006-07-04 11:01 <a href="http://www.blogjava.net/wml/articles/56489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>