﻿<?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-云自无心水自闲-随笔分类-Struts2</title><link>http://www.blogjava.net/usherlight/category/28648.html</link><description>天平山上白云泉，云自无心水自闲。何必奔冲山下去，更添波浪向人间！</description><language>zh-cn</language><lastBuildDate>Thu, 19 Nov 2009 06:35:30 GMT</lastBuildDate><pubDate>Thu, 19 Nov 2009 06:35:30 GMT</pubDate><ttl>60</ttl><item><title>解决struts2上传文件大小限制的方法</title><link>http://www.blogjava.net/usherlight/archive/2009/11/19/302910.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 19 Nov 2009 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2009/11/19/302910.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/302910.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2009/11/19/302910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/302910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/302910.html</trackback:ping><description><![CDATA[struts2的文件上传对文件大小的限制，缺省值是２m，也就是说缺省情况下，最大只能上传２m的文件。根据文档所说需要对fileUpload这个拦截器的一个参数maximunSize进行设置<br />
<br />
&lt;interceptor-ref name="fileUpload"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="maximumSize"&gt;1000000&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="allowedTypes"&gt;image/gif,image/jpeg,image/jpg,image/png&lt;/param&gt;<br />
&lt;/interceptor-ref&gt;<br />
<br />
但是我设置了之后并没有作用。<br />
后来，仔细查看日志后才发现错误是commons-fileupload里面的文件大小限制引起了错误。<br />
在struts.xml中，添加<br />
&lt;constant name="struts.multipart.maxSize" value="16777216"/&gt;<br />
解决问题！<br />
<br /><img src ="http://www.blogjava.net/usherlight/aggbug/302910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2009-11-19 13:44 <a href="http://www.blogjava.net/usherlight/archive/2009/11/19/302910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Extjs Tree + JSON + Struts2 的所有示例源代码和war文件下载</title><link>http://www.blogjava.net/usherlight/archive/2009/09/01/293417.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 01 Sep 2009 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2009/09/01/293417.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/293417.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2009/09/01/293417.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/293417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/293417.html</trackback:ping><description><![CDATA[在我的随笔<a title="在我的随笔Extjs Tree + JSON + Struts2" href="http://www.blogjava.net/usherlight/archive/2008/02/19/180590.html">Extjs Tree + JSON + Struts2</a>中我介绍了如何异步加载一个Extjs的树，但是很多网友留言说不能成功操作。现在我自己做了一个所有源代码的包，供大家下载。<br />
有几点事项请大家注意<br />
1、blogjava的文件上载要求单个文件不能超过4M，所以，我把web-inf目录下的所有jar文件删除了。<br />
所有jar文件的列表是：<br />
commons-beanutils-1.7.0.jar<br />
commons-collections-3.2.jar<br />
commons-digester-1.6.jar<br />
commons-lang-2.3.jar<br />
commons-logging-1.1.jar<br />
dom4j-1.6.1.jar<br />
ezmorph-1.0.4.jar<br />
freemarker-2.3.8.jar<br />
<span style="color: red;">javassist-3.8.1.jar</span><br />
json-lib-2.2.1-jdk15.jar<br />
log4j-1.2.13.jar<br />
ognl-2.6.11.jar<br />
struts2-core-2.0.11.jar<br />
xml-apis-1.0.b2.jar<br />
xwork-2.0.4.jar<br />
注意红色标记的那个jar文件是上次随笔中遗漏了的。这个文件是需要的。<br />
2、blogjava要求上传文件不能是war文件，所以我把war文件改成了rar后缀。<br />
文件的URL： <a title="war文件下载" href="http://www.blogjava.net/Files/usherlight/extjsTree.rar">war文件下载</a><br />
<br /><img src ="http://www.blogjava.net/usherlight/aggbug/293417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2009-09-01 11:07 <a href="http://www.blogjava.net/usherlight/archive/2009/09/01/293417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2中的conventions插件</title><link>http://www.blogjava.net/usherlight/archive/2009/08/24/292372.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Mon, 24 Aug 2009 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2009/08/24/292372.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/292372.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2009/08/24/292372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/292372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/292372.html</trackback:ping><description><![CDATA[struts2中conventions plugin的url取名规则：<br />
假设有一个类：com.example.actions.HelloWorld，<br />
Struts2会自动搜索所有实现了com.opensymphony.xwork2.Action接口或者在struts.xml中&lt;constant name="struts.convention.package.locators" value="actions"/&gt; 指定的包下的类。<br />
现存HelloWorld只是一个POJO，但是他在actions包下，这样Struts2就认可这是一个Action.<br />
那么URL会是什么呢？是hello-world，类似于：http://localhost:8080/&lt;contextPath&gt;/hello-world.action.<br />
如果你不喜欢这样的自动分配的URL，那么可以在里面的方法使用@Action来改变<br />
@Action("/helloWorld")<br />
public void execute() throws Exception {<br />
&nbsp;&nbsp;&nbsp; return "success";<br />
}<img src ="http://www.blogjava.net/usherlight/aggbug/292372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2009-08-24 14:25 <a href="http://www.blogjava.net/usherlight/archive/2009/08/24/292372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中ZeroConfig和CodeBehind下的Stream类型返回</title><link>http://www.blogjava.net/usherlight/archive/2009/01/06/250149.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 06 Jan 2009 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2009/01/06/250149.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/250149.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2009/01/06/250149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/250149.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/250149.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>Struts2的官方文档看似琳琅满目，但实际上并不完备，许多细节问题并没有深入涉及，部分内容甚至还有错误（可参见：http://www.blogjava.net/usherlight/archive/2008/12/30/249143.html）。这次主要是补充一下，使用了ZeroConfig插件情况下，如何返回Stream类型的配置。<br />
在ZeroConfig＋CodeBehind结合使用的情况下，Struts.xml中基本上已经空无一物了。配置基本上使用Annotation在Java的类中注释完成。</p>
<p>@Parent("default")<br />
@Result(name="rawFile", value="inputStream", type=StreamResult.class, params={"contentType", "text/html", "inputName", "inputStream", "", "", "bufferSize", "1024"})<br />
public class FileDownloadAction {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String execute() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputStream = new FileInputStream("c:\\temp\\file.txt");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private InputStream inputStream;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //... getter and setter<br />
}<br />
这里最重要的是Result里面params的写法，params后面的大括号中，奇数个字符串是key值，偶数个字符串是value值。<br />
其中，inputName的值－inputStream要和Class中的InputStream的属性名一致，而Result中的value的值也要与之一致。</p><img src ="http://www.blogjava.net/usherlight/aggbug/250149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2009-01-06 17:30 <a href="http://www.blogjava.net/usherlight/archive/2009/01/06/250149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2文档中一个错误</title><link>http://www.blogjava.net/usherlight/archive/2008/12/30/249143.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 30 Dec 2008 05:17:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/12/30/249143.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/249143.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/12/30/249143.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/249143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/249143.html</trackback:ping><description><![CDATA[今天试了一下引用url作为&lt;s:a&gt;的href，结果页面根本不能正确显示，后台log里面出现了一大片的错误，大意是&lt;s:param&gt;的用法错误。但是我的写法是完全copy在线文档http://struts.apache.org/2.x/docs/a.html<br />
具体内容就是下面这一部分:<br />
<pre class="code-html"><span class="code-tag">&lt;s:url id=<span class="code-quote">"testUrlId"</span> namespace=<span class="code-quote">"/subscriber"</span> action=<span class="code-quote">"customField"</span> method=<span class="code-quote">"delete"</span>&gt;</span><br />
<span class="code-tag">&lt;s:param name=<span class="code-quote">"customFieldDefinition.id"</span> value=<span class="code-quote">"<span style="color: red;">${id}</span>"</span>/&gt;</span><br />
<span class="code-tag">&lt;/s:url&gt;</span><br />
经过尝试发现实际上应该这样写： <span class="code-tag">&lt;s:param name=<span class="code-quote">"customFieldDefinition.id"</span> value=<span class="code-quote">"<span style="color: red;">id</span>"</span>/&gt;</span></pre>
struts2的文档一直被大家所指责，看来这种指责不无道理啊<img src ="http://www.blogjava.net/usherlight/aggbug/249143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-12-30 13:17 <a href="http://www.blogjava.net/usherlight/archive/2008/12/30/249143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeMarker中通过Struts2标签直接调用Java类获得结果值</title><link>http://www.blogjava.net/usherlight/archive/2008/11/21/241781.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 20 Nov 2008 23:59:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/11/21/241781.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/241781.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/11/21/241781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/241781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/241781.html</trackback:ping><description><![CDATA[在FreeMarker中可以使用Strust2的标签set调用Java类的方法来获取返回值<br />
&lt;@s.set name="val" value="@com.test.utils.Property@getInstance().get('Value')"/&gt;<br />
<br />
然后就可以使用以下的语句在FreeMarker中取得val的值<br />
&lt;#if (Request.appType)?default("") == "OK"&gt;<br />
&lt;/#if&gt;<br />
<br /><img src ="http://www.blogjava.net/usherlight/aggbug/241781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-11-21 07:59 <a href="http://www.blogjava.net/usherlight/archive/2008/11/21/241781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2性能问题的最终解决方法</title><link>http://www.blogjava.net/usherlight/archive/2008/09/02/226501.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 02 Sep 2008 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/09/02/226501.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/226501.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/09/02/226501.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/226501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/226501.html</trackback:ping><description><![CDATA[<p>通过上两篇文章的研究，<br />
详见：<br />
我的struts2项目性能调优三步曲：http://www.blogjava.net/usherlight/archive/2008/07/01/211869.html<br />
我的struts2项目性能调优三步曲（续）：http://www.blogjava.net/usherlight/archive/2008/07/12/214462.html<br />
得出的结论是：影响Struts2性能的原因在于Ognl的Value Stack的性能不佳。那么如果解决呢：</p>
<p><br />
* 我首先尝试使用JSF。<br />
一开始选择JSF的原因主要是：<br />
１、Stuts2自己提供了JSF的Plugin<br />
２、JSF是Sun作为标准提出，而且已经通过的。从Google的趋势搜索上也可以看出，搜索JSF的人在增多。<br />
３、JSF作为一种以组件为基础的Web Framework有其独到之处，其内建的和其他许多开源的组件使用起来相当方便、强大。当然，对于不同的应用来说也有不利之处（后面会提到），但是如果能够坚持长期使用，逐渐积累组件库的话，JSF是一个很好的选择。<br />
４、JSF的文档（或者说是书籍）还是比较多的。</p>
<p><br />
经过测试使用后，发现其性能与Struts2相比确实提升不少。但是后来遇到了一个问题，所以最后还是放弃了JSF。这个问题是关于JSF的DataTable的，JSF提供的DataTable其实使用起来很方便，可定制化程度也不错，只是刚好缺少了我所希望的功能（也可能是我不知道如何实现）。我的应用中的DataTable是一个动态的结果集，也就是说输出的列是不能预先确定的，而DataTable却要求先声明好所有的DataColumn，我不知道如何解决这个问题。所以最后放弃了JSF。</p>
<p><br />
* 我的第二个选择是FreeMarker<br />
选择FreeMarker的原因是：<br />
１、FreeMarker是Struts2缺少的模板引擎，Struts2的标签大部分是使用FreeMarker的，使用FreeMarker的话，连Plugin都省去了。<br />
２、FreeMarker相对比较轻量级、因为他本身只是一个模板引擎，与JSF这样一个大而全的WebFramework相对，轻巧多了。<br />
３、FreeMarker的学习起来非常容易，只要把他网站上的Document过一遍，基本上就OK了。<br />
４、FreeMarker虽然体积小，功能还是相当强的，I18N，Converter之类的东西基本都全了，至少我所需要的功能全有。<br />
５、FreeMarker相当灵活，他不象JSF把底层的东西封装了以后，暴露出一些属性可以设置，如果你需要的属性不能设置，你就没有办法了。在FreeMarker你直接操作最底层的东西，拥有很大的灵活性。当然，牺牲了一些方便性，比如，要用FreeMarker生成一个下拉框，就需要较多的工作量了。</p>
<p><br />
测试之后，使用FreeMarker的性能很不错，在大数据量操作的情况下，至少一个数量级的性能提升。</p>
<p>主要原因是freeMarker的值直接从action中取得的，所以避开了ognl的stack value.</p>
<p><br />
</p>
<p>* 我的最终结论，如果要在Struts2中，展示或者操作大量数据，强烈推荐使用FreeMarker。</p>
<p><br />
</p><img src ="http://www.blogjava.net/usherlight/aggbug/226501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-09-02 21:02 <a href="http://www.blogjava.net/usherlight/archive/2008/09/02/226501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 结合 dhtmlx tree</title><link>http://www.blogjava.net/usherlight/archive/2008/08/07/220756.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 07 Aug 2008 12:16:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/08/07/220756.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/220756.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/08/07/220756.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/220756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/220756.html</trackback:ping><description><![CDATA[前一阵子使用了DHtmlx的Tree，视觉效果不错，功能也不弱。具体参见：<a href="http://dhtmlx.com">http://dhtmlx.com</a><br />
现在把Struts2结合DHtmlxTree的经验心得整理一下，发表出来：<br />
一、Struts.xml<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br id="uden1" goog_docs_charindex="75" />
&lt;!DOCTYPE struts PUBLIC<br id="uden2" goog_docs_charindex="99" />
&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br id="uden3" goog_docs_charindex="169" />
&nbsp;&nbsp;&nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;<br id="uden4" goog_docs_charindex="221" />
&nbsp;&nbsp; <br id="uden5" goog_docs_charindex="225" />
&lt;struts&gt;
<p id="uden7" goog_docs_charindex="235">&nbsp;&nbsp;&nbsp; &lt;package name="demo" extends="struts-default"&gt;<br id="uden8" goog_docs_charindex="286" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="menu" method="execute" class="demo.TreeMenuAction"&gt;<br id="r5nx" goog_docs_charindex="499" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result&gt;/WEB-INF/menu.jsp&lt;/result&gt;<br id="r5nx0" goog_docs_charindex="550" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br id="r5nx1" goog_docs_charindex="568" />
&nbsp;&nbsp;&nbsp; &lt;/package&gt;<br id="uden17" goog_docs_charindex="583" />
&lt;/struts&gt;<br />
<br />
<br />
二、tree.jsp<br />
</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: #0000ff">&lt;</span><span style="color: #800000">%@&nbsp;taglib&nbsp;</span><span style="color: #ff0000">prefix</span><span style="color: #0000ff">="s"</span><span style="color: #ff0000">&nbsp;uri</span><span style="color: #0000ff">="/struts-tags"</span><span style="color: #ff0000">%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">%<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />String&nbsp;</span><span style="color: #ff0000">path&nbsp;</span><span style="color: #0000ff">=&nbsp;request.getContextPath();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff0000">String&nbsp;basePath&nbsp;</span><span style="color: #0000ff">=&nbsp;request.getScheme()&nbsp;</span><span style="color: #ff0000">+&nbsp;"://"&nbsp;+&nbsp;request.getServerName()&nbsp;+&nbsp;":"&nbsp;+&nbsp;request.getServerPort()&nbsp;+&nbsp;path;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Main&nbsp;Page</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;注意此处的路径需要根据各自具体情况修改&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">link&nbsp;</span><span style="color: #ff0000">rel</span><span style="color: #0000ff">="STYLESHEET"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="text/css"</span><span style="color: #ff0000">&nbsp;href</span><span style="color: #0000ff">="styles/dhtmlxtree.css"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script&nbsp;</span><span style="color: #ff0000">src</span><span style="color: #0000ff">="scripts/dhtmlxcommon.js"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script&nbsp;</span><span style="color: #ff0000">src</span><span style="color: #0000ff">="scripts/dhtmlxtree.js"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body&nbsp;</span><span style="color: #ff0000">onload</span><span style="color: #0000ff">="loadTree();&nbsp;"</span><span style="color: #ff0000">&nbsp;style</span><span style="color: #0000ff">="padding:&nbsp;0;&nbsp;margin:&nbsp;0;&nbsp;overflow:&nbsp;hidden;&nbsp;height:&nbsp;100%;"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />String.prototype._dhx_trim&nbsp;=&nbsp;function(){<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;this.replace(/</span><span style="color: #ff0000">&amp;nbsp;</span><span style="color: #000000">/g,"&nbsp;").replace(/(^[&nbsp;\t\n\r]*)|([&nbsp;\t\n\r]*$)/g,"");<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />/*&nbsp;init&nbsp;tree&nbsp;*/<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;var&nbsp;tree;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />function&nbsp;loadTree(){<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;tree=new&nbsp;dhtmlXTreeObject("doctree_box","100%","100%",0);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;tree.setImagePath("images/");&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;注意此处的路径需要根据各自具体情况修改&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;tree.setOnClickHandler(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function(id){&nbsp;openPathDocs(id);&nbsp;}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;tree.loadXML("</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">%=basePath</span><span style="color: #ff0000">%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/menu.do");&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />/*&nbsp;open&nbsp;path&nbsp;funtion&nbsp;*/<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />function&nbsp;openPathDocs(id){<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(tree.getUserData(id,&nbsp;"thisurl")&nbsp;!=&nbsp;null&nbsp;){<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.frames.sampleframe.location.href&nbsp;=&nbsp;"</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">%=path</span><span style="color: #ff0000">%</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/"&nbsp;+&nbsp;tree.getUserData(id,&nbsp;"thisurl")&nbsp;+&nbsp;".do";<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />}<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />function&nbsp;autoselectNode(){<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;tree.selectItem(node,true);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;tree.openItem(node);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />}&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">table&nbsp;</span><span style="color: #ff0000">width</span><span style="color: #0000ff">="100%"</span><span style="color: #ff0000">&nbsp;height</span><span style="color: #0000ff">="100%"</span><span style="color: #ff0000">&nbsp;cellpadding</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;cellspacing</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;border</span><span style="color: #0000ff">="0"</span><span style="color: #0000ff">&gt;</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: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td&nbsp;</span><span style="color: #ff0000">valign</span><span style="color: #0000ff">="top"</span><span style="color: #ff0000">&nbsp;width</span><span style="color: #0000ff">="276"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="doctree_box"</span><span style="color: #ff0000">&nbsp;style</span><span style="color: #0000ff">="width:&nbsp;274px;&nbsp;height:&nbsp;100%;"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td&nbsp;</span><span style="color: #ff0000">width</span><span style="color: #0000ff">="10"</span><span style="color: #ff0000">&nbsp;background</span><span style="color: #0000ff">="images/grid.gif"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&amp;nbsp;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td&nbsp;</span><span style="color: #ff0000">align</span><span style="color: #0000ff">="right"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">iframe&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sampleframe"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="sampleframe"</span><span style="color: #ff0000">&nbsp;width</span><span style="color: #0000ff">="100%"</span><span style="color: #ff0000">&nbsp;height</span><span style="color: #0000ff">="99%"</span><span style="color: #ff0000">&nbsp;frameborder</span><span style="color: #0000ff">="0"</span><span style="color: #ff0000">&nbsp;src</span><span style="color: #0000ff">="blank.html"</span><span style="color: #ff0000">&nbsp;style</span><span style="color: #0000ff">="border:&nbsp;0px&nbsp;solid&nbsp;#cecece;"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">iframe</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</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: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">table</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p id="uden7" goog_docs_charindex="235">上面的JavaScript基本上是从dhtmlx的例子中修改而来，理解起来并不复杂，只有<br />
String.prototype._dhx_trim = function(){<br />
&nbsp;return this.replace(/&amp;nbsp;/g," ").replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g,"");<br />
}<br />
这一段代码含义不明。<br />
<br />
<br />
三、Action</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: #0000ff">package</span><span style="color: #000000">&nbsp;demo;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_44_1159_Open_Image" onclick="this.style.display='none'; Codehighlighter1_44_1159_Open_Text.style.display='none'; Codehighlighter1_44_1159_Closed_Image.style.display='inline'; Codehighlighter1_44_1159_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_44_1159_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_44_1159_Closed_Text.style.display='none'; Codehighlighter1_44_1159_Open_Image.style.display='inline'; Codehighlighter1_44_1159_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TreeMenuAction&nbsp;</span><span id="Codehighlighter1_44_1159_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_44_1159_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;menuString;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_103_1005_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_1005_Open_Text.style.display='none'; Codehighlighter1_103_1005_Closed_Image.style.display='inline'; Codehighlighter1_103_1005_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_103_1005_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_103_1005_Closed_Text.style.display='none'; Codehighlighter1_103_1005_Open_Image.style.display='inline'; Codehighlighter1_103_1005_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span id="Codehighlighter1_103_1005_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_103_1005_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;StringBuffer&nbsp;buf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuffer();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;tree&nbsp;id=\</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;item&nbsp;text=\</span><span style="color: #000000">"</span><span style="color: #000000">Java\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;item&nbsp;text=\</span><span style="color: #000000">"</span><span style="color: #000000">Thinking&nbsp;in&nbsp;java\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;userdata&nbsp;name=\</span><span style="color: #000000">"</span><span style="color: #000000">thisurl\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;java_tij.do&lt;/userdata&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;/item&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;item&nbsp;text=\</span><span style="color: #000000">"</span><span style="color: #000000">Head&nbsp;first&nbsp;design&nbsp;pattern\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;userdata&nbsp;name=\</span><span style="color: #000000">"</span><span style="color: #000000">thisurl\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;java_hfdp.do&lt;/userdata&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;/item&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;/item&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;item&nbsp;text=\</span><span style="color: #000000">"</span><span style="color: #000000">Fiction\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;item&nbsp;text=\</span><span style="color: #000000">"</span><span style="color: #000000">Harry&nbsp;Porter\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;userdata&nbsp;name=\</span><span style="color: #000000">"</span><span style="color: #000000">thisurl\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;fiction_hp.do&lt;/userdata&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;/item&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;item&nbsp;text=\</span><span style="color: #000000">"</span><span style="color: #000000">Oliver&nbsp;Twist\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;userdata&nbsp;name=\</span><span style="color: #000000">"</span><span style="color: #000000">thisurl\</span><span style="color: #000000">"</span><span style="color: #000000">&gt;fiction_ot.do&lt;/userdata&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;/item&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&lt;/item&gt;</span><span style="color: #000000">"</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;buf.append(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;/tree&gt;</span><span style="color: #000000">"</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;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menuString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;buf.toString();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">success</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1044_1068_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1044_1068_Open_Text.style.display='none'; Codehighlighter1_1044_1068_Closed_Image.style.display='inline'; Codehighlighter1_1044_1068_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1044_1068_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1044_1068_Closed_Text.style.display='none'; Codehighlighter1_1044_1068_Open_Image.style.display='inline'; Codehighlighter1_1044_1068_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMenuString()&nbsp;</span><span id="Codehighlighter1_1044_1068_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_1044_1068_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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;menuString;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&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;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_1122_1157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1122_1157_Open_Text.style.display='none'; Codehighlighter1_1122_1157_Closed_Image.style.display='inline'; Codehighlighter1_1122_1157_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1122_1157_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1122_1157_Closed_Text.style.display='none'; Codehighlighter1_1122_1157_Open_Image.style.display='inline'; Codehighlighter1_1122_1157_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMenuString(String&nbsp;menuString)&nbsp;</span><span id="Codehighlighter1_1122_1157_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_1122_1157_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;</span><span style="color: #0000ff">this</span><span style="color: #000000">.menuString&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;menuString;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p id="uden7" goog_docs_charindex="235">&nbsp;<br />
四、menu.jsp<br />
<font id="dnx12" color="#bf5f3f" size="2" goog_docs_charindex="4572">&nbsp; </p>
<p id="dnx13" align="left" goog_docs_charindex="4573">&lt;%@ </font><font id="t:8l0" color="#3f7f7f" size="2" goog_docs_charindex="4581">page </font><font id="t:8l1" color="#7f007f" size="2" goog_docs_charindex="4588">contentType</font><font id="t:8l2" size="2" goog_docs_charindex="4601">=</font><font id="t:8l3" color="#2a00ff" size="2" goog_docs_charindex="4604">"text/xml;charset=UTF-8"</font><font id="t:8l4" color="#bf5f3f" size="2" goog_docs_charindex="4630">%&gt;<br />
</font><font id="t:8l5" color="#bf5f3f" size="2" goog_docs_charindex="4635">&lt;%@ </font><font id="t:8l7" color="#3f7f7f" size="2" goog_docs_charindex="4644">taglib </font><font id="t:8l8" color="#7f007f" size="2" goog_docs_charindex="4653">prefix</font><font id="t:8l9" size="2" goog_docs_charindex="4661">=</font><font id="t:8l10" color="#2a00ff" size="2" goog_docs_charindex="4664">"s" </font><font id="t:8l11" color="#7f007f" size="2" goog_docs_charindex="4670">uri</font><font id="t:8l12" size="2" goog_docs_charindex="4675">=</font><font id="t:8l13" color="#2a00ff" size="2" goog_docs_charindex="4678">"/struts-tags" </font><font id="t:8l14" color="#bf5f3f" size="2" goog_docs_charindex="4695">%&gt;</font></p>
<font id="t:8l16" color="#008080" size="2" goog_docs_charindex="4700">
<p id="t:8l17" goog_docs_charindex="4701">&lt;</font><font id="t:8l19" color="#3f7f7f" size="2" goog_docs_charindex="4706">s:property </font><font id="t:8l20" color="#7f007f" size="2" goog_docs_charindex="4719">value</font><font id="t:8l21" size="2" goog_docs_charindex="4726">=</font><font id="t:8l22" color="#2a00ff" size="2" goog_docs_charindex="4729">"menuXmlString" </font><font id="t:8l23" color="#7f007f" size="2" goog_docs_charindex="4747">escape</font><font id="t:8l24" size="2" goog_docs_charindex="4755">=</font><font id="t:8l25" color="#2a00ff" size="2" goog_docs_charindex="4758">"false"</font><font id="t:8l26" color="#008080" size="2" goog_docs_charindex="4767">/&gt;<br />
<br />
</font><br />
过程是这样的：首先在浏览器地址栏中输入：http://......./tree.jsp<br />
展示tree.jsp，在load函数中调用menu.do</p>
menu.do对应TreeMenuAction，返回menu.jsp，而menu.jsp只包含menuString的值，注意在menu.jsp中的escape="false"<img src ="http://www.blogjava.net/usherlight/aggbug/220756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-08-07 20:16 <a href="http://www.blogjava.net/usherlight/archive/2008/08/07/220756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的struts2项目性能调优三步曲（续）</title><link>http://www.blogjava.net/usherlight/archive/2008/07/12/214462.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Sat, 12 Jul 2008 10:57:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/07/12/214462.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/214462.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/07/12/214462.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/214462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/214462.html</trackback:ping><description><![CDATA[<p>最近，继续研究了Struts2性能的调优方法，总结了一下，得出新三步曲：</p>
<p>4. 使用FreeMarker的最新版本2.3.13，因为在版本2.3.11中，FreeMarker针对性能进行了改进，以下是FreeMarker2.3.11的release notes:<br />
2.3.11<br />
Date of release: 2007-12-04<br />
This release contains several performance and usability improvements.</p>
<p>5. ognl2.7<br />
所称ognl2.7相对于2.6在性能上有了&#8220;显著&#8221;的提升，于是下载了2.7以及2.7所需要的javassist-3.8.0.GA.jar</p>
<p>其实，经过上面2个步骤，我并没有发现应用的性能有显著的改善，可能我的页面中从ValueStack中的存取操作并不是特别多，也不是特别的复杂，所以，Ognl对我的影响并不明显。</p>
<p>6. 最后使用了JProfiler对Tomcat进行了监控，最后发现问题在自定义模板上，我将页面的自定义模板全部删除，果然页面的响应速度有了较大的提升。</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/usherlight/aggbug/214462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-07-12 18:57 <a href="http://www.blogjava.net/usherlight/archive/2008/07/12/214462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的struts2项目性能调优三步曲</title><link>http://www.blogjava.net/usherlight/archive/2008/07/01/211869.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 01 Jul 2008 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/07/01/211869.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/211869.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/07/01/211869.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/211869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/211869.html</trackback:ping><description><![CDATA[前一段时间有反映说是一个使用了struts2的生产系统的页面显示速度太慢。登录后发现确实如此，于是进行了一番性能调优的研究和测试。<br />
一，根据struts2官方的性能调优说明进行了一些参数的修改。<br />
http://struts.apache.org/2.x/docs/performance-tuning.html<br />
http://cwiki.apache.org/WW/performance-tuning.html<br />
<br />
Turn off logging and devMode.(关闭logging和Devmode)<br />
这个当然没问题，但是全部关闭logging不现实，我只是关闭了struts2相关package的logging<br />
<br />
Do not use interceptors you do not need.<br />
把struts.xml中不需要的interceptor统统删除<br />
<br />
Use the correct HTTP headers (Cache-Control &amp; Expires).<br />
不确定应该如何修改<br />
<br />
Copy the static content from the Struts 2 jar when using the Ajax theme (Dojo) or the Calendar tag.<br />
关于这点，后面会提到<br />
<br />
Create a freemarker.properties file in your WEB-INF/classes directory.<br />
照做<br />
<br />
Create the freemarker.properties file and add the following setting (or whatever value you deem fitting):<br />
template_update_delay=60000<br />
照做<br />
<br />
Enable Freemarker template caching<br />
As of Struts 2.0.10, setting the property struts.freemarker.templatesCache to true will enable the Struts internal caching of Freemarker templates. This property is set to false by default.<br />
照做<br />
<br />
进行上述修改后，发现页面打开的速度并没有明显的提高.<br />
<br />
二，此时我已经基本锁定网页打开速度慢的原因与ajax(或者说是dojo)有关。因为dojo的js库大概有450K左右，先尝试使用gzip压缩javascript，减小传输量，看能否加快页面的加载速度<br />
在Tomcat的server.xml的connector中添加如下配置，激活gzip功能<br />
&nbsp;compression="on"<br />
&nbsp;compressionMinSize="2048"<br />
&nbsp;noCompressionUserAgents="gozilla, traviata"<br />
&nbsp;compressableMimeType="text/html,text/xml,text/javascript,application/x-javascript,application/javascript"<br />
进行上述修改后，发现页面打开的速度还是没有明显的提高.<br />
<br />
三，经过上述两个实验，觉得应该是struts2所封闭的dojo的性能问题了。于是引入JQuery.<br />
JQuery的js文件最小是55K, gzip后应该更小，页面的响应速度明显改善（一个数量级以上的提高），主要原因在于与服务器交互的处理上极大地提升了效率。而且页面处理代码更加简洁明了。<br />
<br />
最后，我删除了所有的&lt;s:head theme="ajax"/&gt;和 &lt;s:head/&gt;(如果页面中加入&lt;s:head /&gt;，那么在Struts2生成的html中后包含dojo.js)，使用JQuery来完成所有的Ajax和javascript功能。<br />
<br /><img src ="http://www.blogjava.net/usherlight/aggbug/211869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-07-01 13:33 <a href="http://www.blogjava.net/usherlight/archive/2008/07/01/211869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2利用stream直接输出Excel</title><link>http://www.blogjava.net/usherlight/archive/2008/06/23/210135.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Mon, 23 Jun 2008 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/06/23/210135.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/210135.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/06/23/210135.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/210135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/210135.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>在利用网页展示查询结果，经常会遇到要求导出成Excel的需求。采用这种方法可以定制输出的格式和内容（还不支持合并单元格和公式），生成真正的Excel格式（不是csv）的Excel。<br />
一、struts.xml<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE struts PUBLIC<br />
&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp;&nbsp;&nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;<br />
&nbsp;&nbsp; <br />
&lt;struts&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;constant name="struts.i18n.encoding" value="UTF-8"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;package name="demo" extends="struts-default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="excel" method="execute" class="demo.ExcelAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="excel" type="stream"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="contentType"&gt;application/vnd.ms-excel&lt;/param&gt;&nbsp;&nbsp;&nbsp; &lt;!-- 注意这里的ContentType --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="inputName"&gt;excelStream&lt;/param&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 这里需要和Action里的变量名一致 --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="contentDisposition"&gt;filename="standard.xls"&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="bufferSize"&gt;1024&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/package&gt;<br />
&lt;/struts&gt;</p>
<p>二、Struts2的 Action</p>
<p>package demo;<br />
public class ExcelAction {<br />
&nbsp;&nbsp;&nbsp; private InputStream excelStream; // 需要生成getter和setter</p>
<p>&nbsp;&nbsp;&nbsp; public String execute() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer excelBuf = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excelBuf.append("BookName").append("\t").append("Year").append("\t").append("author").append("\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excelBuf.append("Thinking in Java").append("\t").append("2001").append("\t").append("Eckel").append("\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excelBuf.append("Spring in action").append("\t").append("2005").append("\t").append("Rod").append("\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String excelString = excelBuf.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug("result excel String: " + excelString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excelStream = new ByteArrayInputStream(excelString.getBytes(), 0, excelString.length());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "excel";<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; // getter and setter<br />
&nbsp;&nbsp;&nbsp; ...<br />
}</p>
<p>三、Jsp页面</p>
<p>&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;<br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp;&lt;head&gt;<br />
&nbsp; &lt;s:head /&gt;<br />
&nbsp;&lt;/head&gt;</p>
<p>&nbsp;&lt;body&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;s:form action="" method="post"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:submit key="button.submit"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/s:form&gt;<br />
&nbsp;&lt;/body&gt;<br />
&lt;/html&gt;</p><img src ="http://www.blogjava.net/usherlight/aggbug/210135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-06-23 20:14 <a href="http://www.blogjava.net/usherlight/archive/2008/06/23/210135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用freemarker做模板创建一个struts2自定义标签</title><link>http://www.blogjava.net/usherlight/archive/2008/04/11/192215.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Fri, 11 Apr 2008 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/04/11/192215.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/192215.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/04/11/192215.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/192215.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/192215.html</trackback:ping><description><![CDATA[<br />
首先，在web项目的页面根目录下建立目录template<br />
然后创建目录simple和xhtml，以上的目录名是struts2缺省使用的，不同的主题使用相应的目录。然后再创建一个components目录，在这个目录下，创建一个property.ftl。 最后的目录结构如下:<br />
template/simple/components/property.ftl<br />
template/xhtml/components/property.ftl<br />
<br />
然后在property.ftl中可以使用FreeMarker来定义新的模板(FreeMarker的具体语法可以查看FreeMarker的官方网站，相当的详细易懂)：<br />
&lt;#include "/${parameters.templateDir}/${parameters.theme}/controlheader.ftl" /&gt;<br />
&lt;@s.if test="${parameters.value} == null || ${parameters.value} == '' "&gt;&amp;nbsp;&lt;/@s.if&gt;<br />
&lt;@s.else&gt;&lt;@s.property value="${parameters.value}" /&gt;&lt;/@s.else&gt;<br />
&lt;#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" /&gt;<br />
<br />
以上是一个我自定义的模板，检测结果是否为空字符串，如果是空的话，就输出一个&amp;nbsp; 这样在输出结果时表格的边框线就是完整的了。<br />
<br />
定义好之后，在jsp页面中就可以这样使用了：<br />
<br />
&lt;s:component template="/components/property.ftl" theme="simple"&gt;<br />
&nbsp; &lt;s:param name="value" value="%{'bookName'}"/&gt;<br />
&lt;/s:component&gt;<br />
<br />
第一行中的目录名从自components开始，struts2会自动在template目录下去寻找，如是主题是simple, 就在simple目录下找。<br />
另外，param的语法要注意一下，%{}里面需要加一对引号<br /><img src ="http://www.blogjava.net/usherlight/aggbug/192215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-04-11 16:09 <a href="http://www.blogjava.net/usherlight/archive/2008/04/11/192215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中doubleselect的使用方法</title><link>http://www.blogjava.net/usherlight/archive/2008/03/27/189145.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 27 Mar 2008 14:08:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/03/27/189145.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/189145.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/03/27/189145.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/189145.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/189145.html</trackback:ping><description><![CDATA[在Struts2的官方网站上，有doubleselect的用法示例，但是那个例子比较简单。<br id="cgqh" />
&lt;s:doubleselect label="doubleselect test2" name="menu" list="#{'fruit':'Nice Fruits', 'other':'Other Dishes'}" doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" /&gt;<br id="o8q8" />
上面的例子演示了doubleselect的基本用法，但是其list和doubleList都是固定的。尤其是doublelist的切换使用了3目运算符 ? :，并没有太大的实际使用价值。在实际应用中，list往往是action返回的一个List&lt;DataObject&gt;，listKey和listValue来显示第一级下拉框，doubleList往往是一个Map&lt;Integer, List&lt;DataObject&gt;&gt;，其中Map中的Key值是第一级下拉框的listKey。<br id="ytw." />
举个例子：<br id="q-mj" />
Data Object:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img id="Codehighlighter1_18_140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_140_Open_Text.style.display='none'; Codehighlighter1_18_140_Closed_Image.style.display='inline'; Codehighlighter1_18_140_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="Codehighlighter1_18_140_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_18_140_Closed_Text.style.display='none'; Codehighlighter1_18_140_Open_Image.style.display='inline'; Codehighlighter1_18_140_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Book&nbsp;</span><span id="Codehighlighter1_18_140_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_18_140_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;categoryId;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;getter&nbsp;and&nbsp;setter<img src="http://www.blogjava.net/Images/dot.gif" alt="" />..</span><span style="color: #008000;"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /></span><span style="color: #000000;">}</span></span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img id="Codehighlighter1_165_255_Open_Image" onclick="this.style.display='none'; Codehighlighter1_165_255_Open_Text.style.display='none'; Codehighlighter1_165_255_Closed_Image.style.display='inline'; Codehighlighter1_165_255_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="Codehighlighter1_165_255_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_165_255_Closed_Text.style.display='none'; Codehighlighter1_165_255_Open_Image.style.display='inline'; Codehighlighter1_165_255_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Category&nbsp;</span><span id="Codehighlighter1_165_255_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_165_255_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;getter&nbsp;and&nbsp;setter<img src="http://www.blogjava.net/Images/dot.gif" alt="" />..</span><span style="color: #008000;"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /></span><span style="color: #000000;">}</span></span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /></span></div>
<br />
JSP:<br />
&lt;s:doubleselect list="categoryList" listKey="id" listValue="name" <br id="w3js" />
&nbsp;&nbsp;&nbsp;doubleName="bookId" doubleList="bookMap.get(top.id)" doubleListKey="id" doubleListValue="name" theme="simple"/&gt;<br />
<br id="a:n5" />
此处要注意的是top的用法，开始我以为top就是指代list的值，所以使用的是bookMap.get(top)，但是二级下拉框一直是空白，后来我突然想到说不定top是一个Category实例呢，尝试了一下top.id，果然成功了。<br />
<br />
Action:<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DemoAction&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Integer,&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Book</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">&nbsp;bookMap;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Category</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;categoryList;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Cateogry</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Category&nbsp;category;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Category();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category.setId(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Fiction</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryList.add(category);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Category();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category.setId(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Java</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryList.add(category);<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookMap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Integer,&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Book</span><span style="color: #000000;">&gt;&gt;</span><span style="color: #000000;">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Book</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;bookList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Book</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;book;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Book();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setId(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Harry&nbsp;Porter</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setCategoryId(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookList.add(book);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Book();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setId(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Nightmare</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setCategoryId(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookList.add(book);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookMap.put(</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;bookList);<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Book</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Book();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setId(</span><span style="color: #000000;">3</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Thinking&nbsp;in&nbsp;Java</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setCategoryId(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookList.add(book);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Book();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setId(</span><span style="color: #000000;">4</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Head&nbsp;First&nbsp;Design&nbsp;Patterns</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setCategoryId(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookList.add(book);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookMap.put(</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;bookList);<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;getter&nbsp;and&nbsp;setter..</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">}<br />
<br />
</span></div>
<br />
<br /><img src ="http://www.blogjava.net/usherlight/aggbug/189145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-03-27 22:08 <a href="http://www.blogjava.net/usherlight/archive/2008/03/27/189145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用struts2中的ognl表达式显示数据表字典项的值</title><link>http://www.blogjava.net/usherlight/archive/2008/03/17/186730.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Mon, 17 Mar 2008 04:09:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/03/17/186730.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/186730.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/03/17/186730.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/186730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/186730.html</trackback:ping><description><![CDATA[在数据库的设计中，字典项是经常使用的技巧。<br goog_docs_charindex="46" />
比如在一个图书馆系统中，书籍表（Book）会有一个分类字段，这时候我们一般会单独建立一张分类表（Category），在书籍表只保存分类表的ID。<br goog_docs_charindex="119" />
在用户界面上显示书籍明细的时候，会要求显示CategoryID在Category表中对应的名称。<br goog_docs_charindex="168" />
这样通常的做法是把Book和Category两张表进行关联。<br goog_docs_charindex="199" />
但在实际应用中，Category一般都是Cache在应用服务器端，再使用数据表的连接就不够高效。<br goog_docs_charindex="248" />
我的做法是这样的：在iBatis中使用SqlMap从表中将数据取出，此时不使用数据表的连接。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.demo;<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Book&nbsp;{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  </span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;省略了getter和setter方法&nbsp;</span><span style="color: #008000;">*/</span><br />
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;categoryId;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;author;<br />
}</span></div>
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.demo;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Category&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Integer,&nbsp;Category</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;cacheMap;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;省略了这两个属性的getter和setter方法&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Category&nbsp;getCategory(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cacheMap.get(id);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Integer,&nbsp;Category</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;getCategoryMap()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cacheMap();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;init()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;cacheMap&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;the&nbsp;code&nbsp;to&nbsp;load&nbsp;category&nbsp;from&nbsp;datebase<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;在这里为了演示的需要，使用以下代码</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheMap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Integer,&nbsp;Category</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Category&nbsp;category&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Category();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.setId(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Fiction</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cacheMap.put(</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;category);<br />
&nbsp;
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;category&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Category();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.setId(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Cartoon</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
</span></div>
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.demo;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BookAction&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;省略了属性的getter和setter方法&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;book;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;execute()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Book();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setId(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">Thinking&nbsp;in&nbsp;java</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;book.setCategoryId(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookList.add(book);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;SUCCESS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
JSP:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;%</span><span style="color: #000000;">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">s</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;uri</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/struts-tags</span><span style="color: #000000;">"</span><span style="color: #000000;">%&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!</span><span style="color: #000000;">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">html</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">head</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:head&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">head</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">body</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">table&nbsp;border</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:text&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">page.label.userName</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:property&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">book.name</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:text&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">page.label.category</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:property&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;"><span style="color: red;"><span style="color: #000000;"><span style="color: #ff0000;">@com.demo.Category@getCategory(book.categoryId).getName()</span></span></span></span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">body</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">html</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
</span></div>
<br />
<br /><img src ="http://www.blogjava.net/usherlight/aggbug/186730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-03-17 12:09 <a href="http://www.blogjava.net/usherlight/archive/2008/03/17/186730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>stuts2中session timeout的处理（备忘）</title><link>http://www.blogjava.net/usherlight/archive/2008/02/21/181026.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 21 Feb 2008 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/02/21/181026.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/181026.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/02/21/181026.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/181026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/181026.html</trackback:ping><description><![CDATA[<p>Tomcat在后台重起后，所有的session失效。如果客户端继续点击了一个菜单项，发出一个请求。会得到一个exception。</p>
<p>这时候，可以定义一个名为:sessionTimeout的global results</p>
<font color="#000096" size="2">
<p>&lt;result</font><font color="#f5844c" size="2"> name</font><font color="#ff8040" size="2">=</font><font color="#993300" size="2">"sessionTimeout"</font><font color="#000096" size="2">&gt;</font><font size="2">/WEB-INF/pages/session_timeout.jsp</font><font color="#000096" size="2">&lt;/result&gt;</p>
</font>
<p>这样，所有Action的session timeout都会被定向到指定的页面</p><img src ="http://www.blogjava.net/usherlight/aggbug/181026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-02-21 12:03 <a href="http://www.blogjava.net/usherlight/archive/2008/02/21/181026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Extjs Tree + JSON + Struts2 </title><link>http://www.blogjava.net/usherlight/archive/2008/02/19/180590.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 19 Feb 2008 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/02/19/180590.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/180590.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/02/19/180590.html#Feedback</comments><slash:comments>41</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/180590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/180590.html</trackback:ping><description><![CDATA[最近尝试用extjs来展示树状菜单。着实花了一番功夫。树状菜单的菜单项需要动态加载，而目前版本的extjs中只支持JSON格式的数据。查了一些资
料，决定使用struts2的json-plugin。首先按照例子做了一个，但是结果就是不成功，界面上只出来了一个js中生成的root节点，不能加
载从后台生成的数据。研究后发现是数据格式有问题。使用json-plugin生成的数据格式如下：<br />
{"cls":"folder","id":10,"leaf":false,"children":[{"cls":"file","id":11,"leaf":true,"children":null,"text":"S600"},{"cls":"file","id":12,"leaf":true,"children":null,"text":"SLK200"}],"text":"Benz"}<br />
而extjs需要的数据格式如下：<br />
[{"cls":"folder","id":10,"leaf":false,"children":[{"cls":"file","id":11,"leaf":true,"children":null,"text":"S600"},{"cls":"file","id":12,"leaf":true,"children":null,"text":"SLK200"}],"text":"Benz"}]<br />
区别很小，就只相差最外面的两个方括号。但是少了这两个方括号，在json中，含义迥然不同，前者表示一个对象，而后者表示一个数组。而extjs中
tree的dataloader需要的数据必须是一个数组。而这样的数据格式是json-plugin自动生成的，无法改变。所以，我最后放弃了json
-plugin，转而使用json-lib来解决这个问题。<br />
1. 下载json-lib, http://json-lib.sourceforge.net/<br />
2. lib目录下的jar文件清单：<br />
commons-beanutils-1.7.0.jar<br />
commons-collections-3.2.jar<br />
commons-digester-1.6.jar<br />
commons-lang-2.3.jar<br />
commons-logging-1.1.jar<br />
dom4j-1.6.1.jar<br />
ezmorph-1.0.4.jar<br />
freemarker-2.3.8.jar<br />
<span style="color: red;">javassist-3.8.1.jar</span><br />
json-lib-2.2.1-jdk15.jar<br />
log4j-1.2.13.jar<br />
ognl-2.6.11.jar<br />
struts2-core-2.0.11.jar<br />
xml-apis-1.0.b2.jar<br />
xwork-2.0.4.jar<br />
<br />
<br />
首先配置web.xml<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">web-app&nbsp;</span><span style="color: #ff0000;">version</span><span style="color: #0000ff;">="2.4"</span><span style="color: #ff0000;">&nbsp;xmlns</span><span style="color: #0000ff;">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="http://java.sun.com/xml/ns/j2ee<br />
&nbsp;&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">welcome-file-list</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">welcome-file</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">index.jsp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">welcome-file</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">welcome-file-list</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">struts2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">org.apache.struts2.dispatcher.FilterDispatcher</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">struts2</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/*</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">filter-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">web-app</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<br />
然后是struts.xml<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">struts</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">constant&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="struts.devMode"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">constant&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="struts.i18n.encoding"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="UTF-8"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">package&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="person"</span><span style="color: #ff0000;">&nbsp;extends</span><span style="color: #0000ff;">="struts-default"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">action&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="menus"</span><span style="color: #ff0000;">&nbsp;method</span><span style="color: #0000ff;">="execute"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="com.lab.MenuAction"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">result</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/menu.jsp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">result</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">action</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">package</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">struts</span><span style="color: #0000ff;">&gt;</span></div>
<br />
3. 树的节点模型（省略了getter，setter)<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Menu&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;text;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;leaf;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;cls;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Menu</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;children;<br />
}</span></div>
<br />
4. action<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.lab;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.ArrayList;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.List;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;net.sf.json.JSONArray;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MenuAction&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;menuString;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Menu</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;menus;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;execute()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menus&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Menu</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Menu&nbsp;benz&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Menu();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;benz.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">Benz</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;benz.setCls(</span><span style="color: #000000;">"</span><span style="color: #000000;">folder</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;benz.setLeaf(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;benz.setId(</span><span style="color: #000000;">10</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menus.add(benz);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Menu</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;benzList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Menu</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;benz.setChildren(benzList);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Menu&nbsp;menu;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Menu();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">S600</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setCls(</span><span style="color: #000000;">"</span><span style="color: #000000;">file</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setLeaf(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setId(</span><span style="color: #000000;">11</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;benzList.add(menu);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Menu();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">SLK200</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setCls(</span><span style="color: #000000;">"</span><span style="color: #000000;">file</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setLeaf(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setId(</span><span style="color: #000000;">12</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;benzList.add(menu);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Menu&nbsp;bmw&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Menu();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmw.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">BMW</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmw.setCls(</span><span style="color: #000000;">"</span><span style="color: #000000;">folder</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmw.setLeaf(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmw.setId(</span><span style="color: #000000;">20</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menus.add(bmw);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Menu</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;bmwList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Menu</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmw.setChildren(bmwList);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Menu();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">325i</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setCls(</span><span style="color: #000000;">"</span><span style="color: #000000;">file</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setLeaf(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setId(</span><span style="color: #000000;">21</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmwList.add(menu);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Menu();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setText(</span><span style="color: #000000;">"</span><span style="color: #000000;">X5</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setCls(</span><span style="color: #000000;">"</span><span style="color: #000000;">file</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setLeaf(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menu.setId(</span><span style="color: #000000;">22</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bmwList.add(menu);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONArray&nbsp;jsonObject&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;JSONArray.fromObject(menus);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menuString&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;jsonObject.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;menuString&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ss</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">success</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getMenuString()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;menuString;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setMenuString(String&nbsp;menuString)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.menuString&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;menuString;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
5. menu.jsp<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;<br />
&lt;s:property value="menuString" escape="false"/&gt;<br />
<br />
6. html页面和js<br />
我使用的就是extjs的example中的reorder.html和reorder.js，更改了reorder.js中treeloader的dataurl： menus.action<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta&nbsp;</span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="Content-Type"</span><span style="color: #ff0000;">&nbsp;content</span><span style="color: #0000ff;">="text/html;&nbsp;charset=iso-8859-1"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Reorder&nbsp;TreePanel</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">link&nbsp;</span><span style="color: #ff0000;">rel</span><span style="color: #0000ff;">="stylesheet"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="text/css"</span><span style="color: #ff0000;">&nbsp;href</span><span style="color: #0000ff;">="extjs/resources/css/ext-all.css"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;GC&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;LIBS&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;">&nbsp;src</span><span style="color: #0000ff;">="extjs/adapter/ext/ext-base.js"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;ENDLIBS&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;">&nbsp;src</span><span style="color: #0000ff;">="extjs/ext-all.js"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;">&nbsp;src</span><span style="color: #0000ff;">="reorder.js"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;Common&nbsp;Styles&nbsp;for&nbsp;the&nbsp;examples&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">link&nbsp;</span><span style="color: #ff0000;">rel</span><span style="color: #0000ff;">="stylesheet"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="text/css"</span><span style="color: #ff0000;">&nbsp;href</span><span style="color: #0000ff;">="extjs/resources/css/example.css"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">script&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text/javascript"</span><span style="color: #ff0000;">&nbsp;src</span><span style="color: #0000ff;">="../examples.js"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">script</span><span style="color: #0000ff;">&gt;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;EXAMPLES&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Drag&nbsp;and&nbsp;Drop&nbsp;ordering&nbsp;in&nbsp;a&nbsp;TreePanel</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">This&nbsp;example&nbsp;shows&nbsp;basic&nbsp;drag&nbsp;and&nbsp;drop&nbsp;node&nbsp;moving&nbsp;in&nbsp;a&nbsp;tree.&nbsp;In&nbsp;this&nbsp;implementation&nbsp;there&nbsp;are&nbsp;no&nbsp;restrictions&nbsp;and&nbsp;<br />
anything&nbsp;can&nbsp;be&nbsp;dropped&nbsp;anywhere&nbsp;except&nbsp;appending&nbsp;to&nbsp;nodes&nbsp;marked&nbsp;</span><span style="color: #ff0000;">&amp;quot;</span><span style="color: #000000;">leaf</span><span style="color: #ff0000;">&amp;quot;</span><span style="color: #000000;">&nbsp;(the&nbsp;files).&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">br</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Drag&nbsp;along&nbsp;the&nbsp;edge&nbsp;of&nbsp;the&nbsp;tree&nbsp;to&nbsp;trigger&nbsp;auto&nbsp;scrolling&nbsp;while&nbsp;performing&nbsp;a&nbsp;drag&nbsp;and&nbsp;drop.</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">In&nbsp;order&nbsp;to&nbsp;demonstrate&nbsp;drag&nbsp;and&nbsp;drop&nbsp;insertion&nbsp;points,&nbsp;sorting&nbsp;was&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">b</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">not</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">b</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;enabled.</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">The&nbsp;data&nbsp;for&nbsp;this&nbsp;tree&nbsp;is&nbsp;asynchronously&nbsp;loaded&nbsp;with&nbsp;a&nbsp;JSON&nbsp;TreeLoader.</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">The&nbsp;js&nbsp;is&nbsp;not&nbsp;minified&nbsp;so&nbsp;it&nbsp;is&nbsp;readable.&nbsp;See&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="reorder.js"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">reorder.js</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">.</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">div&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="tree-div"</span><span style="color: #ff0000;">&nbsp;style</span><span style="color: #0000ff;">="overflow:auto;&nbsp;height:300px;width:250px;border:1px&nbsp;solid&nbsp;#c3daf9;"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">div</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<br />
<br />
js:<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Ext&nbsp;JS&nbsp;Library&nbsp;2.0.1<br />
&nbsp;*&nbsp;Copyright(c)&nbsp;2006-2008,&nbsp;Ext&nbsp;JS,&nbsp;LLC.<br />
&nbsp;*&nbsp;licensing@extjs.com<br />
&nbsp;*<br />
&nbsp;*&nbsp;http://extjs.com/license<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
Ext.onReady(</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;shorthand</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;Tree&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Ext.tree;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;tree&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Tree.TreePanel({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;el:'tree</span><span style="color: #000000;">-</span><span style="color: #000000;">div',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoScroll:</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;animate:</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enableDD:</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;containerScroll:&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loader:&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Tree.TreeLoader({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataUrl:'http:</span><span style="color: #008000;">//</span><span style="color: #008000;">localhost:8080/lab/menus.action'</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;set&nbsp;the&nbsp;root&nbsp;node</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Tree.AsyncTreeNode({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text:&nbsp;'Ext&nbsp;JS',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draggable:</span><span style="color: #0000ff;">false</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:'source'<br />
&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;tree.setRootNode(root);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;render&nbsp;the&nbsp;tree</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;tree.render();<br />
&nbsp;&nbsp;&nbsp;&nbsp;root.expand();<br />
});</span></div>
<br />
我已经上传了完整的War文件（包含所有源代码），见：<a title="Extjs Tree + JSON + Struts2 的所有示例源代码和war文件下载" href="http://www.blogjava.net/usherlight/archive/2009/09/01/293417.html">Extjs Tree + JSON + Struts2 的所有示例源代码和war文件下载</a><br />
<br /><img src ="http://www.blogjava.net/usherlight/aggbug/180590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-02-19 09:27 <a href="http://www.blogjava.net/usherlight/archive/2008/02/19/180590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中实现可编辑的表格</title><link>http://www.blogjava.net/usherlight/archive/2008/02/12/179717.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 12 Feb 2008 13:06:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/02/12/179717.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/179717.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/02/12/179717.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/179717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/179717.html</trackback:ping><description><![CDATA[Struts2中支持使用List在页面和Action之间直接传递表格数据。下面是一个示例：<br />
<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 id="Codehighlighter1_20_66_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_66_Open_Text.style.display='none'; Codehighlighter1_20_66_Closed_Image.style.display='inline'; Codehighlighter1_20_66_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_20_66_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_20_66_Closed_Text.style.display='none'; Codehighlighter1_20_66_Open_Image.style.display='inline'; Codehighlighter1_20_66_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Person&nbsp;</span><span id="Codehighlighter1_20_66_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_20_66_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />String&nbsp;name;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;height;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<p>这是一个POJO，getter和setting省略了。</p>
<p>action中可以这样使用：</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 id="Codehighlighter1_22_111_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_111_Open_Text.style.display='none'; Codehighlighter1_22_111_Closed_Image.style.display='inline'; Codehighlighter1_22_111_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_22_111_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_111_Closed_Text.style.display='none'; Codehighlighter1_22_111_Open_Image.style.display='inline'; Codehighlighter1_22_111_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyAction&nbsp;</span><span id="Codehighlighter1_22_111_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_22_111_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_52_56_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_56_Open_Text.style.display='none'; Codehighlighter1_52_56_Closed_Image.style.display='inline'; Codehighlighter1_52_56_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_52_56_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_52_56_Closed_Text.style.display='none'; Codehighlighter1_52_56_Open_Image.style.display='inline'; Codehighlighter1_52_56_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;List&nbsp;getPeopleList()&nbsp;</span><span id="Codehighlighter1_52_56_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_52_56_Open_Text"><span style="color: #000000">{&nbsp;&#8230;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_103_107_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_107_Open_Text.style.display='none'; Codehighlighter1_103_107_Closed_Image.style.display='inline'; Codehighlighter1_103_107_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_103_107_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_103_107_Closed_Text.style.display='none'; Codehighlighter1_103_107_Open_Image.style.display='inline'; Codehighlighter1_103_107_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setPeopleList(&nbsp;List&nbsp;peopleList&nbsp;)&nbsp;</span><span id="Codehighlighter1_103_107_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_103_107_Open_Text"><span style="color: #000000">{&nbsp;&#8230;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&#8230;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
在我们使用Person类之前，需要添加一个配置文件，MyAction-conversion.properties，把这个文件和MyAction放在一起。<br />
这个文件里只有一行内容：<br />
Element_peopleList=Person<br />
前缀Element_是一个常量，表明等号左边的表达式中跟在这个常量后面的是Action类中一个List类型的字段名。<br />
等号右边的表达式是全类名（包含package）<br />
下面是一个页面的代码片段：<br />
<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: #0000ff">&lt;</span><span style="color: #800000">s:form&nbsp;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="update"</span><span style="color: #ff0000">&nbsp;method</span><span style="color: #0000ff">="post"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:iterator&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="peopleList"</span><span style="color: #ff0000">&nbsp;status</span><span style="color: #0000ff">="stat"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:hidden<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff0000">name</span><span style="color: #0000ff">="peopleList[%{#stat.index}].id"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />value</span><span style="color: #0000ff">="%{peopleList[#stat.index].id}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Name"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />name</span><span style="color: #0000ff">="peopleList[%{#stat.index}].name"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />value</span><span style="color: #0000ff">="%{peopleList[#stat.index].name}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Age"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />name</span><span style="color: #0000ff">="peopleList[%{#stat.index}].age"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />value</span><span style="color: #0000ff">="%{peopleList[#stat.index].age}"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&nbsp;</span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Height"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />name</span><span style="color: #0000ff">="peopleList[%{#stat.index}].height"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />value</span><span style="color: #0000ff">="%{peopleList[#stat.index].height}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:iterator</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit&nbsp;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="Update"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span></div>
<br />
<br />
使用这段代码，Struts2会创建一个Person类的ArrayList，并且用setPersonList这个方法把页面表格中的值传递回Action。<br />
如果你是想从用户界面中动态创建列表值，需要允许Struts2给列表中类的实例。那么在配置文件MyAction-conversion.properties中添加一行：<br />
CreateIfNull_peopleList = true<img src ="http://www.blogjava.net/usherlight/aggbug/179717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-02-12 21:06 <a href="http://www.blogjava.net/usherlight/archive/2008/02/12/179717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 and Ajax －－使用Dojo和Div</title><link>http://www.blogjava.net/usherlight/archive/2008/02/10/179572.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Sun, 10 Feb 2008 12:56:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/02/10/179572.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/179572.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/02/10/179572.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/179572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/179572.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts2和Struts相比，一个重大改进就是支持Ajax。　本文主要看一下Struts2中的Div是如何用来输出Ajax结果，其中主要使用了Dojo。首先，我们先创建一个简单的用例，在这个用例中，将在屏幕上显示一个用户列表，点击列表中的userid时，列表的下方将显示用户的详细信息，显示用户详细信息的这个步骤我们将使用Ajax。一、创建web.xml&lt;?xml&nbsp;v...&nbsp;&nbsp;<a href='http://www.blogjava.net/usherlight/archive/2008/02/10/179572.html'>阅读全文</a><img src ="http://www.blogjava.net/usherlight/aggbug/179572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-02-10 20:56 <a href="http://www.blogjava.net/usherlight/archive/2008/02/10/179572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2使用iterator标签显示嵌套Map</title><link>http://www.blogjava.net/usherlight/archive/2008/01/25/177741.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Fri, 25 Jan 2008 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/01/25/177741.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/177741.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/01/25/177741.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/177741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/177741.html</trackback:ping><description><![CDATA[<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">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">s</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;uri</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/struts-tags</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="" /><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">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN</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">html</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="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">head</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">s:head&nbsp;</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="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">head</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="" /><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">body</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="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">table&nbsp;border</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">s:iterator&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataMap.keySet()</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">class</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">s:iterator&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataMap.get(#class).keySet()</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">group</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">tr</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">td</span><span style="color: #000000">&gt;&lt;</span><span style="color: #000000">s:property&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">group</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;&lt;/</span><span style="color: #000000">td</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">s:iterator&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataMap.get(#class).get(#group).values()</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">name</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">td</span><span style="color: #000000">&gt;&lt;</span><span style="color: #000000">s:property&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;&lt;/</span><span style="color: #000000">td</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">s:iterator</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">tr</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">s:iterator</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">s:iterator</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="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">table</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="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">body</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">html</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></div><img src ="http://www.blogjava.net/usherlight/aggbug/177741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-01-25 13:16 <a href="http://www.blogjava.net/usherlight/archive/2008/01/25/177741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中对于radio list的预选（pre select）,即：使一个值被默认选中</title><link>http://www.blogjava.net/usherlight/archive/2008/01/24/177589.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 24 Jan 2008 14:06:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2008/01/24/177589.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/177589.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2008/01/24/177589.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/177589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/177589.html</trackback:ping><description><![CDATA[<p>在Struts2中，radio标签可以使用一个list来输出一组radio按钮，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:radio name="sex"　list="#{'male','female'}"　label="%{getText('app.label.sex')}" /&gt; <br />
但是如何设置其中一个被默认选中。</p>
<p>查阅了struts2的文档，发现radio标签有一个value属性是用于对radio的进行预选的：　http://struts.apache.org/2.x/docs/radio.html<br />
value： Preset the value of input element.<br />
于是，进行了试验，&lt;s:radio name="sex"　list="#{'male','female'}"　label="%{getText('app.label.sex')}" value="male" /&gt; <br />
结果失败了。male的值并没有被选中，经过反复研究，终于得到了正确的结果：<br />
&lt;s:radio name="sex"　list="#{'male','female'}"　label="%{getText('app.label.sex')}" value="<span style="color: red"><span style="color: red">'male'</span></span>" /&gt; <br />
看到其中的区别了吗，就是多了两个单引号。<br />
我认为这是因为value属性的特性引起的。如果male没有加引号，那么struts2会去值的堆栈中寻找变量名为male的值，结果找不到。<br />
加上单引号后，struts2（应该是ognl）把'male'认为是一个简单的字符串。</p>
<p>这样，radio就能够正确地匹配到值，使指定的值默认被选中</p><img src ="http://www.blogjava.net/usherlight/aggbug/177589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2008-01-24 22:06 <a href="http://www.blogjava.net/usherlight/archive/2008/01/24/177589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2动态返回Xml</title><link>http://www.blogjava.net/usherlight/archive/2007/12/14/167858.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Fri, 14 Dec 2007 13:14:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2007/12/14/167858.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/167858.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2007/12/14/167858.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/167858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/167858.html</trackback:ping><description><![CDATA[dhtmlXTree的节点定义可以从服务器生成的Xml中动态加载，我目前使用的是Struts2.　因此，我的做法是，在Javascript生成dhtmlxTree的时候，请求一个加载Struts2的action，Struts2的Action进行用户权限认证，动态生成菜单的Xml字符串。而在jsp中只输出这一个字符串。<br />
开始进行的都比较顺利，但是客户端和服务端一连起来就出问题，页面在加载Xml的时候总是弹出一个对话框，说是加载的xml格式不正确。但是我在IE中直接输入Action，页面显示的结果十分正确，没有问题。后来，无意中我查看了返回xml页面的源文件，这才发现了问题。<br />
原来，xml的&lt;和&gt;全都被转换成&amp;lt;和&amp;gt;了。<br />
我一开始是想在后台考虑如何对字符串进行转换，后来在查struts2文档的时候发现，&lt;s:property有一个escape属性，可以完美地解决这个问题，&lt;s:property value="menuXmlString" escape="false"/&gt; <br />
<br />
例子已经整理出来了：http://www.blogjava.net/usherlight/archive/2008/08/07/220756.html<img src ="http://www.blogjava.net/usherlight/aggbug/167858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2007-12-14 21:14 <a href="http://www.blogjava.net/usherlight/archive/2007/12/14/167858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>