﻿<?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-财哥的地盘-文章分类-javaScript</title><link>http://www.blogjava.net/java-my-love/category/30298.html</link><description>家穷人丑,一米四九</description><language>zh-cn</language><lastBuildDate>Fri, 04 Apr 2008 00:36:42 GMT</lastBuildDate><pubDate>Fri, 04 Apr 2008 00:36:42 GMT</pubDate><ttl>60</ttl><item><title>DWR帮助说明－如何编写通用的单行编辑框(转)</title><link>http://www.blogjava.net/java-my-love/articles/190362.html</link><dc:creator>杨景</dc:creator><author>杨景</author><pubDate>Wed, 02 Apr 2008 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/java-my-love/articles/190362.html</guid><wfw:comment>http://www.blogjava.net/java-my-love/comments/190362.html</wfw:comment><comments>http://www.blogjava.net/java-my-love/articles/190362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-my-love/comments/commentRss/190362.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-my-love/services/trackbacks/190362.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体">也许朋友们会以为这是</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">官方</span><span style="font-family: 宋体">发布的什么帮助，但非常遗憾这不是。现在不少朋友在使用</span>DWR<span style="font-family: 宋体">开发项目，我也是其中之一，但苦于关于</span>DWR<span style="font-family: 宋体">的帮助文档实在太少，很多问题都不得不自己去钻研</span>DWR<span style="font-family: 宋体">的源码才能解决或理解。经过一段时间的苦苦钻研，总结出那么一点点心得，现在从</span>DWR<span style="font-family: 宋体">源码实现的角度详细讲解</span>DWR<span style="font-family: 宋体">的使用，写出来与大家分享。今天我谈一谈如何编写通用的单行编辑框</span><span style="font-family: 宋体">。</span>
<p style="text-indent: 21pt"><span style="font-family: 宋体">当我们需要编辑某行数据的时候，可以将该行的数据设置到一个已经设计好的单行编辑框中进行编辑。在编辑完成以后，点击&#8220;保存&#8221;按钮，</span>DWR<span style="font-family: 宋体">可以采用</span>ajax<span style="font-family: 宋体">的方式访问服务器，将数据保存到数据库中。怎样设计一个单行编辑框呢？让我们一步一步来完成吧。</span></p>
<h2><span style="font-size: x-small"><span style="font-size: small">1<span style="font-family: 宋体">、设计页面。</span></span></span></h2>
<span style="font-family: 宋体">设计好一个单行编辑框的页面，为值对象中的每一个属性设计一个数据输入框，如单行文本框、多行编辑框、下拉框、单选框等等。设计这些数据输入框的同时应当将它们的</span>id<span style="font-family: 宋体">设置成与值对象对应的属性名相同的名称。这里我想特别说明的是下拉框，因为下拉框中的下拉部分应当是一个从数据库中查出来的下拉列表。</span>DWR<span style="font-family: 宋体">为下拉框设计了一个非常便利的函数</span><span style="font-size: 10pt; font-family: 'Courier New'">addOptions()</span><span style="font-size: 10pt; font-family: 宋体">，函数</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">addOptions</span><span style="font-size: 10pt; color: black; font-family: 宋体">的完整写法如下</span><span style="font-size: 10pt; font-family: 宋体">：</span><span style="font-size: 10pt; font-family: 宋体">
<div>
<div>
<div>Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://fangang.javaeye.com/blog/119791#"><img alt="复制代码" src="http://fangang.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol>
    <li>addoptions(eleid,&nbsp;data,&nbsp;valueprop,&nbsp;textprop);&nbsp;&nbsp;</li>
</ol>
</div>
&nbsp;<span style="font-size: 10pt; font-family: 宋体">在该函数中，</span><span style="font-size: 10pt; font-family: 'Courier New'">eleid</span><span style="font-size: 10pt; font-family: 宋体">是下拉框的</span><span style="font-size: 10pt; font-family: 'Courier New'">id</span><span style="font-size: 10pt; font-family: 宋体">。</span><span style="font-size: 10pt; font-family: 'Courier New'">data</span><span style="font-size: 10pt; font-family: 宋体">是下拉框需要显示的下拉列表的数据集，它通常需要包含至少两行数据，一行是下拉框</span><span style="font-size: 10pt; font-family: 'Courier New'">value</span><span style="font-size: 10pt; font-family: 宋体">部分的数据，即需要存数据库的数据，另一行是下拉框</span><span style="font-size: 10pt; font-family: 'Courier New'">text</span><span style="font-size: 10pt; font-family: 宋体">部分的数据，即仅仅用于在下拉列表中显示的数据。比如，我们有一个选择部门的下拉框，</span><span style="font-size: 10pt; font-family: 'Courier New'">value</span><span style="font-size: 10pt; font-family: 宋体">部分对应的应当部门编号，而</span><span style="font-size: 10pt; font-family: 'Courier New'">text</span><span style="font-size: 10pt; font-family: 宋体">部分应当是部门名称。清楚了</span><span style="font-size: 10pt; font-family: 'Courier New'">data</span><span style="font-size: 10pt; font-family: 宋体">，</span><span style="font-size: 10pt; font-family: 'Courier New'">valueprop</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">textprop</span><span style="font-size: 10pt; font-family: 宋体">就好说了，</span><span style="font-size: 10pt; font-family: 'Courier New'">valueprop</span><span style="font-size: 10pt; font-family: 宋体">就是</span><span style="font-size: 10pt; font-family: 'Courier New'">value</span><span style="font-size: 10pt; font-family: 宋体">部分的属性名，</span><span style="font-size: 10pt; font-family: 'Courier New'">textprop</span><span style="font-size: 10pt; font-family: 宋体">就是</span><span style="font-size: 10pt; font-family: 'Courier New'">text</span><span style="font-size: 10pt; font-family: 宋体">部分的属性名。因此，写一个选择部门的下拉框应当这样写：</span><span style="font-size: 10pt; font-family: 宋体">
<div>
<div>
<div>Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://fangang.javaeye.com/blog/119791#"><img alt="复制代码" src="http://fangang.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol>
    <li>DepartmentBus.findDepartment( &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;function(resultset){&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addoptions(&#8216;department&#8217;,resultset.collection, &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8217;departmentId&#8217;,&#8217;departmentName&#8217;);});&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">DepartmentBus.findDepartment(
function(resultset){
addoptions(&#8216;department&#8217;,resultset.collection,
&#8217;departmentId&#8217;,&#8217;departmentName&#8217;);});
</pre>
<p>&nbsp;&nbsp;<span style="font-size: 10pt; font-family: 宋体">另外一个关键的问题我想特别提一下，就是值对象的主键。我在设计</span><span style="font-size: 10pt; font-family: 'Courier New'">hibernate</span><span style="font-size: 10pt; font-family: 宋体">的值对象的时候倡导的是使用无意义的主键。既然是无意义的主键，那么我们不应当将主键值展示给用户。因此我在设计页面的时候通常是将主键对应的标签设计成一个</span><span style="font-size: 10pt; font-family: 'Courier New'">hidden</span><span style="font-size: 10pt; font-family: 宋体">标签。如果主键标签为空，在提交数据保存的时候，</span><span style="font-size: 10pt; font-family: 'Courier New'">hibernate</span><span style="font-size: 10pt; font-family: 宋体">将执行插入操作；如果不为空，执行的将是更新操作。因此，通常不需要分别设计插入页面和更新页面，可以将它们合二为一（一些因特殊原因必须将插入页面和更新页面拆开来编写的情况应当另当别论）。</span></p>
</span></span>
<h2><span style="font-size: 10pt; font-family: 'Courier New'">2</span><span style="font-size: 10pt; font-family: 宋体">、设计清除函数</span></h2>
<span style="font-size: 10pt; font-family: 宋体">如果你需要设计一个添加功能，则需要显示一个没有显示任何值的空单行编辑框。然而使用</span><span style="font-size: 10pt; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; font-family: 宋体">设计页面，我们的思维需要发生一个转变，那就是不要随便刷新页面。什么意思呢？当你打开一个单行编辑框添加一条数据并保存以后，又需要添加另一条数据。如果不刷新页面，则该页面此时还依然显示的是上一条数据的内容，我们就需要设计一个页面清除函数。如果我们在</span><span style="font-size: 10pt; font-family: 'Courier New'">dwr.xml</span><span style="font-size: 10pt; font-family: 宋体">文件中是一个一个注册值对象，那么写清除函数就非常简单了。具体编辑如下：</span><span style="font-size: 10pt; font-family: 宋体">
<div>
<div>
<div>Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://fangang.javaeye.com/blog/119791#"><img alt="复制代码" src="http://fangang.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol>
    <li>var&nbsp;department&nbsp;=&nbsp;new&nbsp;Department(); &nbsp;&nbsp;</li>
    <li>dwr.util.setValues(department);&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">var department = new Department();
dwr.util.setValues(department);</pre>
<p>&nbsp;<span style="font-size: 10pt; color: black; font-family: 宋体">第一行产生一个空值对象，第二行使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setValues()</span><span style="font-size: 10pt; color: black; font-family: 宋体">将页面清空。</span></p>
</span>
<h2><span style="font-size: 10pt; color: black; font-family: 'Courier New'">3</span><span style="font-size: 10pt; color: black; font-family: 宋体">、设计编辑函数</span></h2>
<p><span style="font-size: 10pt; color: black; font-family: 宋体">当我们在列表显示框中选择了某行并点击&#8220;编辑&#8221;按钮以后，需要一个编辑函数将该行的数据设置到单行编辑框中。用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">怎样设计编辑函数呢？前面提到，在列表显示框装载查询结果集的时候，我们同时也将结果集放置到了一个叫</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">objCache</span><span style="font-size: 10pt; color: black; font-family: 宋体">页面端数据缓存中。当用户点击&#8220;编辑&#8221;按钮时，需要将该行的行好以参数的形式传递给编辑函数，然后编辑函数将到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">objCache</span><span style="font-size: 10pt; color: black; font-family: 宋体">中取得该行的值对象，最后使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">setValues()</span><span style="font-size: 10pt; color: black; font-family: 宋体">将该值对象设置到单行编辑框中。</span></p>
<h2><span style="font-size: 10pt; color: black; font-family: 'Courier New'">4</span><span style="font-size: 10pt; color: black; font-family: 宋体">、设计保存函数</span></h2>
<span style="font-size: 10pt; color: black; font-family: 宋体">当编辑数据完成以后，点击&#8220;保存&#8221;按钮以后，需要执行一个保存函数来执行保存。在设计保存函数的时候，首先需要从页面中取出数据并放置到值对象中。为了完成该功能，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">提供了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">getValues()</span><span style="font-size: 10pt; color: black; font-family: 宋体">函数。在使用该函数的时候，我们必须写产生一个空值对象，然后将该对象作为参数传递给</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">getValues()</span><span style="font-size: 10pt; color: black; font-family: 宋体">，则页面中的数据就植入到了该对象中。最后，使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">的特有方式，调用服务器端的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">java</span><span style="font-size: 10pt; color: black; font-family: 宋体">对象中的函数，执行保存。在执行保存的过程这，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">还专门提供了事务处理的功能，当然我从来没有测试过该事务处理的能力。总结保存函数应当如下编写：</span><span style="font-size: 10pt; color: black; font-family: 宋体">
<div>
<div>
<div>Js代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://fangang.javaeye.com/blog/119791#"><img alt="复制代码" src="http://fangang.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol>
    <li>var&nbsp;department&nbsp;=&nbsp;new&nbsp;Department();&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>dwr.util.getValues(department);&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li>
    <li>dwr.engine.beginBatch(); &nbsp;&nbsp;</li>
    <li>DepartmentBus.updateDepartment(department); &nbsp;&nbsp;</li>
    <li>dwr.engine.endBatch(); &nbsp;&nbsp;</li>
    <li>objCache[curid]&nbsp;=&nbsp;obj;&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">var department = new Department();
dwr.util.getValues(department);
dwr.engine.beginBatch();
DepartmentBus.updateDepartment(department);
dwr.engine.endBatch();
objCache[curid] = obj;</pre>
<p>&nbsp;<span style="font-size: 10pt; color: black; font-family: 宋体">回顾保存函数，我们可以抽象出部分代码，以便简化保存函数的编写并提高代码复用度。代码中的第</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">2</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">3</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">5</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">6</span><span style="font-size: 10pt; color: black; font-family: 宋体">行都可以抽象成一个通用的函数进行编写。而代码中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">4</span><span style="font-size: 10pt; color: black; font-family: 宋体">行则是个性化的代码，应当在具体编写每个功能的时候分别去实现。也就是说保存函数被我分成了通用函数和具体实现函数两部分，具体的实现见我的示例。</span></p>
</span>
<h2><span style="font-size: 10pt; color: black; font-family: 'Courier New'">5</span><span style="font-size: 10pt; color: black; font-family: 宋体">、设计删除函数</span> </h2>
<p style="text-indent: 21pt"><span style="font-size: 10pt; color: black; font-family: 宋体">当我们在列表显示框中选择了某行并点击&#8220;删除&#8221;按钮的时候，我们需要设计一个删除函数来删除该行数据。删除函数的设计与保存函数的设计比较近似，这里我就不再累赘了，朋友们自己思考吧。</span></p>
 <img src ="http://www.blogjava.net/java-my-love/aggbug/190362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-my-love/" target="_blank">杨景</a> 2008-04-02 14:19 <a href="http://www.blogjava.net/java-my-love/articles/190362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR帮助说明－dwr的bug及其解决方法(转)</title><link>http://www.blogjava.net/java-my-love/articles/190360.html</link><dc:creator>杨景</dc:creator><author>杨景</author><pubDate>Wed, 02 Apr 2008 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/java-my-love/articles/190360.html</guid><wfw:comment>http://www.blogjava.net/java-my-love/comments/190360.html</wfw:comment><comments>http://www.blogjava.net/java-my-love/articles/190360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-my-love/comments/commentRss/190360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-my-love/services/trackbacks/190360.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体">使用</span>DWR<span style="font-family: 宋体">开始开发项目到现在，感觉真的经历了一段很长的路，因为其间遇到了很多的问题需要解决，一点儿不顺利。这个过程差不多总是这样的：写一小段程序，一运行就出错了，是什么原因呢，看了半天错误提示，不明白。怎么办，到</span>DWR<span style="font-family: 宋体">官方网站去看看吧，也许可以解决问题。如果不能，就把错误提示粘到百度去搜索一下国内网站吧。如果还不能，就到谷歌里去搜索一下国外网站。如果这些都不行，只能用最土的办法，设断点跟源码了。可以说</span>DWR<span style="font-family: 宋体">是我所用过的目前资料最少的一个框架，也是自身问题最多的一个框架。我所遇到过的很多问题都是通过跟踪源码的方式才发现和解决问题的。现在我就把发现到并解决的问题跟大家共享一下吧。当然它们中的有些问题不一定就是</span>DWR<span style="font-family: 宋体">的事，也有</span>hibernate<span style="font-family: 宋体">的问题。</span></p>
<h2><span style="font-family: 黑体">一、转换一对多值对象出现的问题</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">我在《</span><a title="永久链接：DWR帮助文档－dwr.xml文件的配置" href="http://fangang.javaeye.com/blog/119767">DWR帮助文档－dwr.xml文件的配置</a><span style="font-family: 宋体">》一文中提到，我们应当把在</span>dwr<span style="font-family: 宋体">中用到的所有值对象都注册到</span>dwr.xml<span style="font-family: 宋体">配置文件中。在配置值对象的时候，有</span>2<span style="font-family: 宋体">种方式：使用</span>model.*<span style="font-family: 宋体">这种通配符的方式一次性将多个值对象进行注册；使用</span>hibernate3<span style="font-family: 宋体">或</span>hibernate2<span style="font-family: 宋体">的方式一个一个注册值对象。同时我也提到，使用第一种方式注册虽然简便，但存在不利于编写前端页面和性能差的问题，不推荐使用；使用第二种方式注册有利于程序的编写和性能的提高，但在</span>dwr<span style="font-family: 宋体">中存在</span>bug<span style="font-family: 宋体">。这样的</span>bug<span style="font-family: 宋体">是什么呢？我们不妨举一个实例来说明。假如在项目中存在部门和员工的值对象，并且是一对多的关系（每一个员工都只能在一个部门，但多个员工可以在用一个部门），那么</span>hibernate<span style="font-family: 宋体">在查询员工的时候会返回一个员工值对象的集合，集合中的每一个员工值对象都有一个部门属性，对应一个部门值对象，但多个员工值对象对应的可能是一个部门值对象。这个关系很清晰，也应该没有什么疑问，但在</span>dwr<span style="font-family: 宋体">将其转换为</span>js<span style="font-family: 宋体">中的对象的过程中却会发生错误。错误的提示是这样的：</span></p>
<div>
<ol>
    <li>directwebremoting.extend.MarshallException:&nbsp;Error&nbsp;marshalling&nbsp;com.htxx.demo.model.Employee:&nbsp;Ignoring&nbsp;request&nbsp;to&nbsp;inline&nbsp;on&nbsp;reference&nbsp;for:&nbsp;Object:s0:{departmentId=Simple:"001",&nbsp;departmentName=Simple:""u4EBA"u529B"u8D44"u6E90"u90E8",&nbsp;employees=Simple:null}.&nbsp;See&nbsp;the&nbsp;logs&nbsp;for&nbsp;more&nbsp;details. &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.convert.BasicObjectConverter.convertOutbound(BasicObjectConverter.java:200) &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:192) &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>...&nbsp;&nbsp;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>Caused&nbsp;by:&nbsp;java.lang.IllegalStateException:&nbsp;Ignoring&nbsp;request&nbsp;to&nbsp;inline&nbsp;on&nbsp;reference&nbsp;for:&nbsp;Object:s0:{departmentId=Simple:"001",&nbsp;departmentName=Simple:""u4EBA"u529B"u8D44"u6E90"u90E8",&nbsp;employees=Simple:null} &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.dwrp.AbstractOutboundVariable.getReferenceVariable(AbstractOutboundVariable.java:148) &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.dwrp.DefaultConverterManager.convertOutbound(DefaultConverterManager.java:181) &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.convert.BasicObjectConverter.convertOutbound(BasicObjectConverter.java:189) &nbsp;&nbsp;
    <li>&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;28&nbsp;more &nbsp;&nbsp; </li>
</ol>
</div>
<p style="margin: 0cm -67.3pt 0pt -42pt">org.</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">仔细查看和跟踪源码，我发现这个问题出在</span>AbstractOutboundVariable<span style="font-family: 宋体">类的</span>getReferenceVariable<span style="font-family: 宋体">方法中，它的源码是这样写的：</span></p>
<span style="font-size: 10pt; color: black; font-family: 宋体">
<div>java 代码</div>
<div>
<ol>
    <li>/*&nbsp;(non-Javadoc) &nbsp;
    <li>&nbsp;*&nbsp;@see&nbsp;org.directwebremoting.OutboundVariable#getReference() &nbsp;
    <li>&nbsp;*/&nbsp;&nbsp;
    <li>public&nbsp;OutboundVariable&nbsp;getReferenceVariable() &nbsp;&nbsp;
    <li>{ &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(reference&nbsp;==&nbsp;null) &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference&nbsp;=&nbsp;new&nbsp;ReferenceOutboundVariable(getVariableName()); &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(forcedInlineStatus) &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalStateException("Ignoring&nbsp;request&nbsp;to&nbsp;inline&nbsp;on&nbsp;reference&nbsp;for:&nbsp;"&nbsp;+&nbsp;this); &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setInline(false); &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;reference; &nbsp;&nbsp;
    <li>}&nbsp;&nbsp; </li>
</ol>
</div>
当<span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span style="font-size: 10pt; color: black; font-family: 宋体">已经使用了某个对象以后，就会将它的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">forcedInlineStatue</span><span style="font-size: 10pt; color: black; font-family: 宋体">置为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">true</span><span style="font-size: 10pt; color: black; font-family: 宋体">，当</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span style="font-size: 10pt; color: black; font-family: 宋体">再次装载这个对象的时候就会强制抛出</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">IllegalStateException</span><span style="font-size: 10pt; color: black; font-family: 宋体">异常。这在通常情况下是没有问题的，但在我们前面提到的例子中就有问题了。当</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span style="font-size: 10pt; color: black; font-family: 宋体">转换员工值对象集合的时候，首先装载和转换了员工甲，他因为是&#8220;研发</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; font-family: 宋体">部&#8221;所以</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span style="font-size: 10pt; color: black; font-family: 宋体">也装载了&#8220;研发</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; font-family: 宋体">部&#8221;这个部门值对象。然后</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span style="font-size: 10pt; color: black; font-family: 宋体">开始装载和转换员工乙。由于员工乙也是&#8220;研发</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; font-family: 宋体">部&#8221;，因此</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span style="font-size: 10pt; color: black; font-family: 宋体">又开始装载&#8220;研发</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1</span><span style="font-size: 10pt; color: black; font-family: 宋体">部&#8221;这个值对象，但突然发现这个值对象已经装载过了，因而就抛出了以上错误。</span><span style="font-size: 10pt; color: black; font-family: 宋体">如果我们希望整合</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">spring</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate</span><span style="font-size: 10pt; color: black; font-family: 宋体">到一起进行项目开发，以上这个问题是怎么也不能避免的，问题是如何解决。非常遗憾的是，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr</span><span style="font-size: 10pt; color: black; font-family: 宋体">官方似乎还没有要解决这个问题的意思，我思索再三以后决定，还是&#8220;自己动手丰衣足食&#8221;吧。解决的办法其实很简单，就是把</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">11</span><span style="font-size: 10pt; color: black; font-family: 宋体">行这个强制抛出异常注释掉，然后重新编译。这样修改以后就再也没有出现以上问题，同时至今也没有发现其它问题出现。</span>
<h2><span style="font-family: 黑体">二、转换一对一值对象出现的问题</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">这个问题我同样在《</span><a title="永久链接：DWR帮助文档－dwr.xml文件的配置" href="http://fangang.javaeye.com/blog/119767">DWR帮助文档－dwr.xml文件的配置</a><span style="font-family: 宋体">》一文中提到过，就是</span>dwr<span style="font-family: 宋体">在转换一对一值对象关系时出现死循环的问题。假如</span>Employee<span style="font-family: 宋体">值对象存在一个且最多一个</span>Address<span style="font-family: 宋体">值对象的时候，</span>Employee<span style="font-family: 宋体">有一个</span>Address<span style="font-family: 宋体">属性指向一个</span>Address<span style="font-family: 宋体">值对象，而</span>Address<span style="font-family: 宋体">值对象也同样会有一个</span>Employee<span style="font-family: 宋体">属性指向这个</span>Employee<span style="font-family: 宋体">值对象。我们知道</span>hibernate<span style="font-family: 宋体">对于一对一关联是不进行延迟加载的，所以</span>dwr<span style="font-family: 宋体">在装载和转换</span>Employee<span style="font-family: 宋体">值对象的时候会去加载它的</span>Address<span style="font-family: 宋体">值对象，然后在加载这个</span>Address<span style="font-family: 宋体">值对象的时候会又去加载那个</span>Employee<span style="font-family: 宋体">值对象。如此反复加载就形成了死循环。解决这个问题的办法就是在</span>dwr.xml<span style="font-family: 宋体">配置</span>Address<span style="font-family: 宋体">的时候，使用</span>exclude<span style="font-family: 宋体">禁用它对</span>Employee<span style="font-family: 宋体">的加载。详细说明见《</span><a title="永久链接：DWR帮助文档－dwr.xml文件的配置" href="http://fangang.javaeye.com/blog/119767">DWR帮助文档－dwr.xml文件的配置</a><span style="font-family: 宋体">》，这里就不再罗嗦了。</span></p>
<h2><span style="font-family: 黑体">三、找不到值对象中</span>set<span style="font-family: 黑体">函数的问题</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在使用</span>dwr<span style="font-family: 宋体">执行插入和更新操作的时候，有时会出现以下的警告：</span></p>
<span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">Missing java bean property to match javascript property:[</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">属性名</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">]. For causes see debug level logs:</span>
<p style="text-indent: 21pt"><span style="font-family: 宋体">如果将</span>log4j<span style="font-family: 宋体">中</span>dwr<span style="font-family: 宋体">的级别降低为</span>DEBUG<span style="font-family: 宋体">级别，你还可以在控制台中看到一下提示：</span></p>
<span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">You may be missing the correct setter: setXXX()</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">The property may be excluded using include or exclude rules.</span>
<p style="text-indent: 21pt"><span style="font-family: 宋体">其实你并没有在</span>dwr<span style="font-family: 宋体">中禁用这个属性，同时也正确地在值对象中编写了一个</span>setXXX()<span style="font-family: 宋体">方法的，这个问题到底出在哪里呢？我查看了</span>dwr<span style="font-family: 宋体">的源码发现，</span>dwr<span style="font-family: 宋体">是如何获得一个值对象的所有属性及其各自的</span>get<span style="font-family: 宋体">和</span>set<span style="font-family: 宋体">方法呢？是采用</span>Java<span style="font-family: 宋体">的反向机制。如果你通过自己去编写或修改某个属性及其它的</span>get<span style="font-family: 宋体">和</span>set<span style="font-family: 宋体">方法，而不是通过工具生成，那么反向机制就可能找不到这个属性的</span>get<span style="font-family: 宋体">和</span>set<span style="font-family: 宋体">方法（注意，是可能而并不总是这样）。这个问题解决的办法就是删除该属性的</span>get<span style="font-family: 宋体">和</span>set<span style="font-family: 宋体">方法，然后使用</span>MyEclipse<span style="font-family: 宋体">的</span>get<span style="font-family: 宋体">和</span>set<span style="font-family: 宋体">方法生成工具自动生成。</span></p>
<h2><span style="font-family: 黑体">四、找不到值对象的</span>LazyInitializer<span style="font-family: 黑体">的问题</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在使用</span>dwr<span style="font-family: 宋体">执行插入和更新操作的时候，有时会抛出这样一个离谱的异常：</span></p>
<p style="margin: 0cm -30.55pt 0pt -52.5pt">java.lang.</p>
<div>
<ol>
    <li>NoSuchMethodError:&nbsp;com.htxx.demo.model.Department.getHibernateLazyInitializer()Lorg/hibernate/proxy/LazyInitializer; &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.htxx.demo.model.Department$$EnhancerByCGLIB$$f4b4f445.getHibernateLazyInitializer() &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.directwebremoting.hibernate.H3BeanConverter.getClass(H3BeanConverter.java:139)&nbsp;&nbsp; </li>
</ol>
</div>
<p style="text-indent: 21pt">之所以说这个异常比较离谱，是因为它似乎就没有dwr<span style="font-family: 宋体">什么事。事实上它也是没有</span>dwr<span style="font-family: 宋体">什么事，而是</span>hibernate<span style="font-family: 宋体">出错了。查看</span>hibernate<span style="font-family: 宋体">的官方网站你可以发现这个</span>bug<span style="font-family: 宋体">的发布，并在</span>hibernate3.2.0.rc4<span style="font-family: 宋体">以后的版本这解决这个问题了。将</span>hibernate3<span style="font-family: 宋体">换成最新版本后果然就解决这个问题了。</span></p>
<h2><span style="font-family: 黑体">五、执行查询时找不到</span>hibernate<span style="font-family: 黑体">查询工厂类的问题</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">这个还是</span>hibernate3<span style="font-family: 宋体">的问题。在执行查询的时候在控制台显示这样一个错误：</span></p>
<p style="margin-left: -26.25pt"><span style="font-size: 10pt; color: red; font-family: 'Courier New'">CharScanner; panic: </span><u><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">ClassNotFoundException</span></u><span style="font-size: 10pt; color: red; font-family: 'Courier New'">: org.hibernate.hql.ast.HqlToken</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">遇到这个问题不要怕，其实解决的方法很简单，就是在</span>spring<span style="font-family: 宋体">的配置文件</span>ApplicationContext-hibernate.xml<span style="font-family: 宋体">中，在</span>sessionFactory<span style="font-family: 宋体">的</span>hibernateProperties<span style="font-family: 宋体">属性中增加这样一段话：</span></p>
<span style="font-size: 10pt; color: teal; font-family: 'Courier New'">
<div>xml 代码</div>
<div>
<ol>
    <li>&lt;property&nbsp;name="hibernateProperties"&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;props&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop&nbsp;key="hibernate.query.factory_class"&gt;org.hibernate.hql.classic.ClassicQueryTranslatorFactoryprop&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props&gt;&nbsp;&nbsp;
    <li>property&nbsp;&nbsp; </li>
</ol>
</div>
<h2><span style="font-family: 黑体">六、在</span>JDK1.4<span style="font-family: 黑体">中运行和部署</span>DWR2<span style="font-family: 黑体">和</span>hibernate3<span style="font-family: 黑体">出现的问题</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在</span>DWR2.0<span style="font-family: 宋体">中提供了一些</span>JDK5<span style="font-family: 宋体">中才能使用的</span>annotations<span style="font-family: 宋体">的功能。然而，这个功能在</span>JDK1.4<span style="font-family: 宋体">的环境中进行启动或者部署会发生错误。抱歉的是这个错误信息我没有及时记录，日后补上。这个错误在网上可以轻易地搜索到解决方案，即在</span>dwr.jar<span style="font-family: 宋体">中删除掉</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">org.directwebremoting.annotations.AnnotationsConfigurator</span><span style="font-family: 宋体">这个类再重新部署就可以了。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">同样的问题出现在</span>hibernate3<span style="font-family: 宋体">中，</span>hibernate3<span style="font-family: 宋体">对</span>annotations<span style="font-family: 宋体">的支持在</span>JDK1.4<span style="font-family: 宋体">中也可能出现异常，解决的办法就是在部署文件中删除掉</span>hibernate-annotations.jar<span style="font-family: 宋体">就可以了。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">另外值得说明的是，以上</span>2<span style="font-family: 宋体">个问题并不是每次都会出现的。它们就如同幽灵一样有时出现有时不出现，因此我们并不需要总是删除这个类和</span>jar<span style="font-family: 宋体">包，只是在发生错误时才删除。</span></span></span></p>
 <img src ="http://www.blogjava.net/java-my-love/aggbug/190360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-my-love/" target="_blank">杨景</a> 2008-04-02 14:17 <a href="http://www.blogjava.net/java-my-love/articles/190360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR帮助文档－dwr.xml文件的配置(转)</title><link>http://www.blogjava.net/java-my-love/articles/190359.html</link><dc:creator>杨景</dc:creator><author>杨景</author><pubDate>Wed, 02 Apr 2008 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/java-my-love/articles/190359.html</guid><wfw:comment>http://www.blogjava.net/java-my-love/comments/190359.html</wfw:comment><comments>http://www.blogjava.net/java-my-love/articles/190359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-my-love/comments/commentRss/190359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-my-love/services/trackbacks/190359.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体">也许朋友们会以为这是</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">官方</span><span style="font-family: 宋体">发布的什么帮助，但非常遗憾这不是。现在不少朋友在使用</span>DWR<span style="font-family: 宋体">开发项目，我也是其中之一，但苦于关于</span>DWR<span style="font-family: 宋体">的帮助文档实在太少，很多问题都不得不自己去钻研</span>DWR<span style="font-family: 宋体">的源码才能解决或理解。经过一段时间的苦苦钻研，总结出那么一点点心得，现在从</span>DWR<span style="font-family: 宋体">源码实现的角度详细讲解</span>DWR<span style="font-family: 宋体">的使用，写出来与大家分享。今天我先讲一讲</span>dwr.xml<span style="font-family: 宋体">的配置。</span>
<h2><span style="font-family: 黑体">一、为什么要配置</span>dwr.xml</h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">要理解</span>dwr.xml<span style="font-family: 宋体">的配置首先要理解</span>DWR<span style="font-family: 宋体">的基本功能。</span>DWR<span style="font-family: 宋体">其功能的强大在于它可以用一种前所未有的便利方式将前端页面中的</span>js<span style="font-family: 宋体">与后端服务器中的</span>java<span style="font-family: 宋体">程序进行直接的转换。比如，它可以将</span>java<span style="font-family: 宋体">程序中的某个</span>XxxBus<span style="font-family: 宋体">转换成</span>js<span style="font-family: 宋体">中的一个对象，并将</span>XxxBus<span style="font-family: 宋体">中的某个方法如</span>getXXX()<span style="font-family: 宋体">转换成</span>js<span style="font-family: 宋体">中的一个名为</span>XxxBus.getXXX()<span style="font-family: 宋体">的</span>function<span style="font-family: 宋体">。同时，它可以将</span>java<span style="font-family: 宋体">中的值对象或其它数据包转换成</span>js<span style="font-family: 宋体">中的对象。理解这一点非常重要。配置文件</span>dwr.xml<span style="font-family: 宋体">就是让你告诉</span>DWR<span style="font-family: 宋体">哪些</span>Bus<span style="font-family: 宋体">你需要在页面中调用，以及你需要调用这些</span>Bus<span style="font-family: 宋体">中的哪些方法，哪些方法你不需要调用。一旦告诉了</span>DWR<span style="font-family: 宋体">这些信息，你似乎就可以在页面中像写</span>java<span style="font-family: 宋体">程序一样的直接调用</span>Bus<span style="font-family: 宋体">，而跳过了</span>MVC<span style="font-family: 宋体">层（如</span>struts<span style="font-family: 宋体">中的</span>action<span style="font-family: 宋体">和</span>actionform<span style="font-family: 宋体">）以及</span>MVC<span style="font-family: 宋体">层的繁琐配置与编程。为了帮助你理解这一点我举一个例子，已经清楚的朋友可以跳过。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">假如我在项目的</span>BUS<span style="font-family: 宋体">层写了一个类叫</span>DepartmentBus<span style="font-family: 宋体">并在这个类中定义了一个方法</span>getDepartment(String id)<span style="font-family: 宋体">，那么我们先把这个类和它的方法配置到</span>dwr.xml<span style="font-family: 宋体">中（如何配置我后面再讲）。当</span>DWR<span style="font-family: 宋体">启动的时候，它会将</span>java<span style="font-family: 宋体">中的</span>DepartmentBus<span style="font-family: 宋体">及其方法</span>getDepartment(String id)<span style="font-family: 宋体">转换成</span>js<span style="font-family: 宋体">中的</span>DepartmentBus<span style="font-family: 宋体">及其方法</span>getDepartment(String id)<span style="font-family: 宋体">。更具体地说，它会动态产生一个叫</span>DepartmentBus.js<span style="font-family: 宋体">的文件（这个文件可以在测试状态下从&#8220;项目地址端口</span>/dwr/test/DepartmentBus<span style="font-family: 宋体">&#8221;中看到）。在这个文件中，会创建一个</span>DepartmentBus<span style="font-family: 宋体">的对象，一个叫</span>DepartmentBus.fincDepartment(p0, callback)<span style="font-family: 宋体">的函数。如果你在页面中引入了</span>DepartmentBus.js<span style="font-family: 宋体">文件，你就可以在该页面的</span><span style="font-family: 宋体">中调用</span>DepartmentBus.fincDepartment(p0, callback)<span style="font-family: 宋体">方法，</span>DWR<span style="font-family: 宋体">就可以通过</span>Ajax<span style="font-family: 宋体">的方式直接去调用服务器端的</span>DepartmentBus<span style="font-family: 宋体">中的</span>fincDepartment(String id)<span style="font-family: 宋体">。同理，如果</span>DepartmentBus<span style="font-family: 宋体">中还有其它的函数，如</span>createDepartment(Department vo)<span style="font-family: 宋体">、</span>updateDepartment(Department vo)<span style="font-family: 宋体">等，</span>DWR<span style="font-family: 宋体">也会做如此的转换。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">前面我们提到，</span>DWR<span style="font-family: 宋体">可以将服务器端</span>java<span style="font-family: 宋体">中的对象及其方法转换成客户端的</span>js<span style="font-family: 宋体">中的对象及其方法，一个棘手的问题就出现了。在</span>java<span style="font-family: 宋体">中的许多方法都是将某个对象作为它参数或返回值。这些对象往往都是一个个的</span>JOPO<span style="font-family: 宋体">，即它们有许多的属性，其中包含了需要传递的数据（最典型的就是值对象）。当</span>js<span style="font-family: 宋体">在调用</span>java<span style="font-family: 宋体">的某个方法时需要提供这个对象参数，同时在调用完成时需要将对象返回值以</span>js<span style="font-family: 宋体">可以接受的方式返回。怎样做到这一点呢？最简单的方式当然是让</span>DWR<span style="font-family: 宋体">再做一次转换，将这些</span>java<span style="font-family: 宋体">对象转换成</span>js<span style="font-family: 宋体">的对象，或者将</span>js<span style="font-family: 宋体">的对象转换成</span>java<span style="font-family: 宋体">对象。</span>Ok<span style="font-family: 宋体">，经过</span>DWR<span style="font-family: 宋体">这样的两次转换，我们就可以在页面与后台间自由地进行函数调用和数据交换。</span></p>
<h2><span style="font-family: 黑体">二、如何配置</span>dwr.xml<span style="font-family: 黑体">文件</span></h2>
<p style="text-indent: 21pt"><span style="font-family: 宋体">讲到这里，我们现在重新回到</span>dwr.xml<span style="font-family: 宋体">文件。前面我们提到，如果你需要在页面中调用服务器端的某个类中的方法，你需要在</span>dwr.xml<span style="font-family: 宋体">中注册这个类及其方法，注册方法如下：</span></p>
<div>
<ol>
    <li>&lt;create&nbsp;creator="spring"&nbsp;javascript="DepartmentBus"&nbsp;scope="script"&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name="beanName"&nbsp;value="departmentBus"/&gt;&nbsp;&nbsp;
    <li>create&gt;&nbsp;&nbsp; </li>
</ol>
</div>
<p style="text-align: left" align="left">Creator<span style="font-size: 10.5pt; font-family: 宋体"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'"><span style="font-family: 宋体">是创建这个对象所使用的构建器，如果你希望使用传统的</span>new<span style="font-family: 宋体">方法就写成</span>new<span style="font-family: 宋体">，如果你希望使用</span>spring<span style="font-family: 宋体">来创建则写成</span>spring<span style="font-family: 宋体">。当然也有其它的创建方法，有哪些方法呢？你可以打开</span>dwr.jar<span style="font-family: 宋体">，在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">org.directwebremoting</span><span style="font-size: 10pt; color: black; font-family: 宋体">包中找到一个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr.xml</span><span style="font-size: 10pt; color: black; font-family: 宋体">的文件。在该文件</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">init</span><span style="font-size: 10pt; color: black; font-family: 宋体">下的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">create</span><span style="font-size: 10pt; color: black; font-family: 宋体">中可以看到。</span></span></span></p>
<span style="font-size: 10pt; color: black; font-family: 'Courier New'">Javascript</span><span style="font-size: 10pt; color: black; font-family: 宋体">是用于你在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">js</span><span style="font-size: 10pt; color: black; font-family: 宋体">中调用这个对象时使用什么名称，强烈建议你使用首字母大写，这样在页面中很容易看出这是一个与后台对应的对象。</span><span style="font-size: 10pt; color: black; font-family: 宋体">如果你使用了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">spring</span><span style="font-size: 10pt; color: black; font-family: 宋体">并且在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">creator</span><span style="font-size: 10pt; color: black; font-family: 宋体">中选择了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">spring</span><span style="font-size: 10pt; color: black; font-family: 宋体">，那么你需要一个叫</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">beanName</span><span style="font-size: 10pt; color: black; font-family: 宋体">的参数，而其值就是在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">spring</span><span style="font-size: 10pt; color: black; font-family: 宋体">配置文件中配置的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">beanName</span><span style="font-size: 10pt; color: black; font-family: 宋体">，如</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">departmentBus</span><span style="font-size: 10pt; color: black; font-family: 宋体">。</span><span style="font-size: 10pt; color: black; font-family: 宋体">另外</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">2</span><span style="font-size: 10pt; color: black; font-family: 宋体">个非常有用的参数是</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">exclude</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">include</span><span style="font-size: 10pt; color: black; font-family: 宋体">，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">exclude</span><span style="font-size: 10pt; color: black; font-family: 宋体">可以禁止页面调用后台的某个或某些方法，具体的写法是在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">create</span><span style="font-size: 10pt; color: black; font-family: 宋体">中加入：</span>
<div>
<ol>
    <li>&lt;exclude&nbsp;method="createDepartment"/&gt;&nbsp;&nbsp; </li>
</ol>
</div>
<p style="text-indent: 20pt">method<span style="font-size: 10pt; color: black; font-family: 宋体">部分写的是这些方法不带括号的方法名，如果有多个就写多行</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">exclude</span><span style="font-size: 10pt; color: black; font-family: 宋体">；</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">include</span><span style="font-size: 10pt; color: black; font-family: 宋体">则规定页面只能调用某些方法。</span></p>
<p style="text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 宋体">在</span>dwr.xml<span style="font-family: 宋体">中注册了需要调用的对象及其方法以后，你应当注册其所有方法的参数和返回值所涉及的对象，注册方法如下</span><span style="font-family: 宋体">：</span></p>
<div>xml 代码</div>
<div>
<ol>
    <li>&lt;convert&nbsp;match="com.htxx.demo.datasource1.model.Department"&nbsp; &nbsp;&nbsp;
    <li>javascript="Department"&nbsp;converter="hibernate3"/&gt;&nbsp;&nbsp; </li>
</ol>
</div>
<p style="text-indent: 20pt">match<span style="font-size: 10.5pt; font-family: 宋体">用于告诉</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">DWR</span><span style="font-size: 10.5pt; font-family: 宋体">你将需要把</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">java</span><span style="font-size: 10.5pt; font-family: 宋体">中的哪些类转换成</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">js</span><span style="font-size: 10.5pt; font-family: 宋体">。你可以写成</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">com.htxx.demo.model.*</span><span style="font-size: 10.5pt; font-family: 宋体">，但我并不推荐大家这样使用。为什么呢？如果你像前面那样一个一个地注册对象，则就可以在页面使用这个的语句初始化一个对象：</span></p>
<p style="text-indent: 21pt">var dep = new Department();</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">如果你使用后一种方法去批量注册对象，那么你就不能这样初始化这个对象而只能这样手动注册：</span></p>
<p style="text-indent: 21pt">Var dep = {departmentId:null, departmentName:null, &#8230;&#8230;};</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">我推荐大家采用第一种方法的好处可以在我后面写的《<a title="永久链接：DWR帮助说明－如何编写通用的单行编辑框" href="http://fangang.javaeye.com/blog/119791">DWR帮助说明－如何编写通用的单行编辑框</a></span><span style="font-family: 宋体">》充分展现出来。但采用这种方法在</span>DWR<span style="font-family: 宋体">的现有版本中似乎还有点儿</span>BUG<span style="font-family: 宋体">，如何解决这个</span>BUG<span style="font-family: 宋体">我也将在后面的《<a title="永久链接：DWR帮助说明－dwr的bug及其解决方法" href="http://fangang.javaeye.com/blog/122445">DWR帮助说明－dwr的bug及其解决方法</a></span><span style="font-family: 宋体">》中解答。</span></p>
Javascript<span style="font-family: 宋体">用于说明你在页面中使用这个对象的名称，也强烈建议大家使用</span><span style="font-size: 10pt; color: black; font-family: 宋体">首字母大写。</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Converter</span><span style="font-size: 10pt; color: black; font-family: 宋体">用于告诉</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">用什么</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">的类来执行转换，常用的转换器有</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">bean</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">object</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate2</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate3</span><span style="font-size: 10pt; color: black; font-family: 宋体">等。</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">有哪些转换器可以在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr.jar</span><span style="font-size: 10pt; color: black; font-family: 宋体">的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">dwr.xml</span><span style="font-size: 10pt; color: black; font-family: 宋体">（该文件的位置见前文）中找到。我需要强调的是，如果朋友们使用了</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate</span><span style="font-size: 10pt; color: black; font-family: 宋体">，那么你需要将需要使用的所有值对象都通过转换器注册。但是我在网上看见很多朋友都使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">bean</span><span style="font-size: 10pt; color: black; font-family: 宋体">转换器来注册。如果你使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">bean</span><span style="font-size: 10pt; color: black; font-family: 宋体">来转换值对象，在运行程序的时候会出现很多问题（这些问题我就不详述了），同时还会出现效率的问题，因为</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">会将该值对象的所有属性，及其这些属性的所有属性，所有属性的属性，都以穷举的方式取出来。熟悉</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate</span><span style="font-size: 10pt; color: black; font-family: 宋体">的朋友应当马上明白这样将是数据库操作的一个灾难。如果你使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate2</span><span style="font-size: 10pt; color: black; font-family: 宋体">或</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate3</span><span style="font-size: 10pt; color: black; font-family: 宋体">作为转换器将不会发生这样的事，同时，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate3</span><span style="font-size: 10pt; color: black; font-family: 宋体">还较好地解决了延迟查询的问题，但</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">官方建议我们使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate</span><span style="font-size: 10pt; color: black; font-family: 宋体">的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">openSessionInViewFilter</span><span style="font-size: 10pt; color: black; font-family: 宋体">，这我也不再详述，不清楚的朋友可以查阅</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate3</span><span style="font-size: 10pt; color: black; font-family: 宋体">的帮助文档。但另一个问题我不得不提，</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">在使用延迟查询的时候其实还是有问题的。譬如有一个值对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Employee</span><span style="font-size: 10pt; color: black; font-family: 宋体">包含一个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Department</span><span style="font-size: 10pt; color: black; font-family: 宋体">的属性，根据延迟查询的规则，在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">get</span><span style="font-size: 10pt; color: black; font-family: 宋体">某个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Employee</span><span style="font-size: 10pt; color: black; font-family: 宋体">时，属性</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Department</span><span style="font-size: 10pt; color: black; font-family: 宋体">不会马上装载，即使执行</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">getDepartment()</span><span style="font-size: 10pt; color: black; font-family: 宋体">也不会装载。必须到真正对这个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Department</span><span style="font-size: 10pt; color: black; font-family: 宋体">操作的时候才会装载。既然如此，问题就来了，我们使用</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">执行查询的时候，常常是真正到页面才会读取</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Department</span><span style="font-size: 10pt; color: black; font-family: 宋体">，这时已经是脱离服务器端到页面端了而不能再得到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Department</span><span style="font-size: 10pt; color: black; font-family: 宋体">。这个问题怎么办呢，最好的办法是在服务器端就提前装载页面需要使用的属性，因为作为开发者他肯定知道哪些属性要在客户端使用，哪些属性不需要。至于如何在服务器端就提前装载，感兴趣的朋友在我的示例中看到。</span>
<p style="text-indent: 20pt"><span style="font-size: 10pt; color: black; font-family: 宋体">另外一个需要提的是，与</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">creator</span><span style="font-size: 10pt; color: black; font-family: 宋体">一样，转换器也可以一样地设置</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">exclude</span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">include</span><span style="font-size: 10pt; color: black; font-family: 宋体">参数。但是与</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">creator</span><span style="font-size: 10pt; color: black; font-family: 宋体">不同的是，它们说明</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">在转换对象的时候需要转换或不转换某些属性。这个参数对于</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate</span><span style="font-size: 10pt; color: black; font-family: 宋体">的一对一关联非常重要。在</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">hibernate</span><span style="font-size: 10pt; color: black; font-family: 宋体">中一对一关联是不做延迟查询的，假如有一个值对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Employee</span><span style="font-size: 10pt; color: black; font-family: 宋体">与值对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Address</span><span style="font-size: 10pt; color: black; font-family: 宋体">是一对一关联，那么</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Employee</span><span style="font-size: 10pt; color: black; font-family: 宋体">中有</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Address</span><span style="font-size: 10pt; color: black; font-family: 宋体">的属性，而</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Address</span><span style="font-size: 10pt; color: black; font-family: 宋体">中有</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Employee</span><span style="font-size: 10pt; color: black; font-family: 宋体">的属性。由于一对一关联不做延迟查询，当</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">DWR</span><span style="font-size: 10pt; color: black; font-family: 宋体">在转换一个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Employee</span><span style="font-size: 10pt; color: black; font-family: 宋体">是会装载它的属性</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Address</span><span style="font-size: 10pt; color: black; font-family: 宋体">，然后在装载</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Address</span><span style="font-size: 10pt; color: black; font-family: 宋体">的时候，又会去装载</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Address</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Employee</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性。如此这样，就会形成一个死循环，最后以堆栈溢出告终。解决这个问题的办法就是禁掉</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Address</span><span style="font-size: 10pt; color: black; font-family: 宋体">中的</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Employee</span><span style="font-size: 10pt; color: black; font-family: 宋体">属性，避免产生死循环。具体写法如下：</span></p>
<div>xml 代码</div>
<div>
<ol>
    <li>&lt;convert&nbsp;match="com.htxx.demo.model.Address"&nbsp;javascript="Address"&nbsp;converter="hibernate3"&gt;&nbsp;&nbsp;
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style="font-family: Courier New; background-color: #fafafa">param name="exclude"</span>&nbsp;value="employee"/&gt;&nbsp;&nbsp;
    <li>&lt;/convert&gt;&nbsp;&nbsp; </li>
</ol>
</div>
<p style="text-align: left" align="left">Value<span style="font-size: 10pt; color: black; font-family: 宋体">部分是需要转换的属性，如果有多个则用逗号隔开就可以了。</span></p>
<img src ="http://www.blogjava.net/java-my-love/aggbug/190359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-my-love/" target="_blank">杨景</a> 2008-04-02 14:15 <a href="http://www.blogjava.net/java-my-love/articles/190359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>checkBox的单选实现</title><link>http://www.blogjava.net/java-my-love/articles/188069.html</link><dc:creator>杨景</dc:creator><author>杨景</author><pubDate>Sun, 23 Mar 2008 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/java-my-love/articles/188069.html</guid><wfw:comment>http://www.blogjava.net/java-my-love/comments/188069.html</wfw:comment><comments>http://www.blogjava.net/java-my-love/articles/188069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-my-love/comments/commentRss/188069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-my-love/services/trackbacks/188069.html</trackback:ping><description><![CDATA[<p>今天用到这个功能,在网上查了查,发现大多数写的都很复杂,于是自己写了个,感觉还不错</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">script&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">text/javascript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_54_290_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_290_Open_Text.style.display='none'; Codehighlighter1_54_290_Closed_Image.style.display='inline'; Codehighlighter1_54_290_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_54_290_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_290_Closed_Text.style.display='none'; Codehighlighter1_54_290_Open_Image.style.display='inline'; Codehighlighter1_54_290_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;check(obj)&nbsp;</span><span id="Codehighlighter1_54_290_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_54_290_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;checkboxs&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;document.all.checkboxs;<br />
<img id="Codehighlighter1_125_286_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_286_Open_Text.style.display='none'; Codehighlighter1_125_286_Closed_Image.style.display='inline'; Codehighlighter1_125_286_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_125_286_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_125_286_Closed_Text.style.display='none'; Codehighlighter1_125_286_Open_Image.style.display='inline'; Codehighlighter1_125_286_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(obj.checked</span><span style="color: #000000">==</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_125_286_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_125_286_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_168_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_281_Open_Text.style.display='none'; Codehighlighter1_168_281_Closed_Image.style.display='inline'; Codehighlighter1_168_281_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_168_281_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_168_281_Closed_Text.style.display='none'; Codehighlighter1_168_281_Open_Image.style.display='inline'; Codehighlighter1_168_281_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(var&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">checkboxs.length;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_168_281_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_168_281_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_228_269_Open_Image" onclick="this.style.display='none'; Codehighlighter1_228_269_Open_Text.style.display='none'; Codehighlighter1_228_269_Closed_Image.style.display='inline'; Codehighlighter1_228_269_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_228_269_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_228_269_Closed_Text.style.display='none'; Codehighlighter1_228_269_Open_Image.style.display='inline'; Codehighlighter1_228_269_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(checkboxs[i]</span><span style="color: #000000">!=</span><span style="color: #000000">obj&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;checkboxs[i].checked</span><span style="color: #000000">==</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_228_269_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_228_269_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkboxs[i].checked</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">script</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">input&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">checkbox</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">checkboxs</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;onClick</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">check(this)</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">input&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">checkbox</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">checkboxs</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;onClick</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">check(this)</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">input&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">checkbox</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">checkboxs</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;onClick</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">check(this)</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span></div>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/java-my-love/aggbug/188069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-my-love/" target="_blank">杨景</a> 2008-03-23 20:04 <a href="http://www.blogjava.net/java-my-love/articles/188069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>