﻿<?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-疯狂 --专注java,开源,架构,项目管理-随笔分类-struts</title><link>http://www.blogjava.net/freeman1984/category/42535.html</link><description>         
        STANDING ON THE SHOULDERS OF GIANTS</description><language>zh-cn</language><lastBuildDate>Fri, 28 Oct 2011 16:20:14 GMT</lastBuildDate><pubDate>Fri, 28 Oct 2011 16:20:14 GMT</pubDate><ttl>60</ttl><item><title>发布一个struts2的插件学习版，用来支持rest风格 url的参数绑定。</title><link>http://www.blogjava.net/freeman1984/archive/2011/10/28/362261.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 28 Oct 2011 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/10/28/362261.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/362261.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/10/28/362261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/362261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/362261.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 可以匹配例如：info/{id}/{group}/{userName}  ->info1/admin/joe.do，同时讲参数id，group，userName 绑定到action的对应的属性上。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/freeman1984/archive/2011/10/28/362261.html'>阅读全文</a><img src ="http://www.blogjava.net/freeman1984/aggbug/362261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-10-28 23:53 <a href="http://www.blogjava.net/freeman1984/archive/2011/10/28/362261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2.0.1升级到struts2.2.3遇到的一些语法细节。 </title><link>http://www.blogjava.net/freeman1984/archive/2011/08/09/356066.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 09 Aug 2011 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2011/08/09/356066.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/356066.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2011/08/09/356066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/356066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/356066.html</trackback:ping><description><![CDATA[<div><span style="font-size: small"><span>1. </span></span></div>
<div><span style="font-size: small"><span>&nbsp;ognl 静态方法处理 </span></span></div>
<div><span style="font-size: small"><span>&lt;s:property value="@com.e104.rd.util.DynaEnvConstants@getInt('ROWS_PER_PAGE')"/&gt; </span></span></div>
<div><span style="font-size: small"><span>struts2.0.1 支持 </span></span></div>
<div>&nbsp; </div>
<div><span style="font-size: small"><span>struts2.2.3 默认不支持，需要修改struts.xml </span></span></div>
<div><span style="font-size: small"><span>&lt;constant name="struts.ognl.allowStaticMethodAccess" value="true" /&gt; </span></span></div>
<div><span style="font-size: small"><br /></span>
<div><span style="font-size: small"><span>2. 参数传递的问题 </span></span></div>
<div>&nbsp; </div>
<div><span style="font-size: small"><span>var url = '../Search/ResumeSearchAction_loadResumeList.action?<strong>pageNo=&lt;s:property value="pageNo"/&gt;</strong> ';<br />&nbsp;&nbsp;&nbsp;&nbsp; var param = {<br />&nbsp;&nbsp;&nbsp;target : url,&nbsp;<br />&nbsp;&nbsp;&nbsp;method : 'post',<br />&nbsp;&nbsp;&nbsp;form: "searchConditionForm",<br />&nbsp;&nbsp;&nbsp;div: "resume_list_div"<br />&nbsp;&nbsp;} </span></span></div>
<div>&nbsp; </div>
<div><span style="font-size: small"><span>&lt;form id="searchConditionForm" name="searchConditionForm" method="post" action=""&gt;<br />&nbsp; <strong>&lt;input type="hidden" name="pageNo" id="pageNo" value="1"&gt;</strong> </span></span></div>
<div><span style="font-size: small"><span>&nbsp; 。。。。。。。。。<br />&lt;/form&gt; </span></span></div>
<div>&nbsp; </div>
<div><span style="font-size: small"><span>url 后面跟<strong>pageNo 参数，form里有pageNo 参数，</strong> </span></span></div>
<div><span style="font-size: small">&nbsp;</span> </div>
<div><span style="font-size: small"><span>struts2.0.1 支持，<span>struts2.2.3 不支持，需要把url后参数删除，且<span>struts2.2.3 <strong>参数传递要比前版严格</strong> ， </span></span></span></span></div>
<div><span style="font-size: small"><span>所以要测试，遇到参数传递的问题时候，再修改。 </span></span></div></div>
<div><span style="font-size: small"><br /></span></div>
<div>
<div dir="ltr"><span style="color: #000000; font-size: small"><span>3.导入actions.xml; </span></span></div>
<div dir="ltr"><span style="color: #000000; font-size: small"><span>struts2.0.1：&nbsp;&lt;include file="**\actions.xml"/&gt; </span></span></div>
<div dir="ltr"><span style="color: #000000; font-size: small"><span>struts2.2.3: </span></span></div>
<div><span style="color: #000000; font-size: small">&nbsp; &lt;include file="/**/actions.xml"/&gt; </span></div>
<div><span style="color: #000000; font-size: small">4<span>.默认拦截器的名字修改: </span></span></div>
<div><span style="color: #000000; font-size: small">&nbsp;<span>struts2.0.1：&lt;interceptor-ref name="token-session"&gt; </span></span><span style="color: #000000; font-size: small"><br /></span>
<div dir="ltr"><span style="color: #000000; font-size: small"><span>&nbsp;struts2.2.3:&lt;interceptor-ref name="tokenSession"&gt; </span></span></div></div>
<div dir="ltr"><span style="color: #000000; font-size: small"><br /></span>
<div><span style="color: #000000; font-size: small">5.</span> </div>
<div><span style="color: #000000; font-size: small"><span>struts2.0.1 </span></span></div>
<div><span style="color: #000000; font-size: small">&lt;result name="LOGOUT" type="redirect-action"&gt;</span> </div>
<div>
<div dir="ltr"><span style="color: #000000; font-size: small"><span>struts2.2.3: </span></span></div>
<div><span style="color: #000000; font-size: small">&lt;result name="LOGOUT" type="redirectAction"&gt;</span> </div>
<div><span style="color: #000000; font-size: small">遇到拦截器名字，result&nbsp;<span>type名字不一致，可以去查看 </span></span></div>
<div><span style="color: #000000; font-size: small"><span>struts2-core-2.2.3.jar/struts-default.xml </span></span></div>
<div><span style="font-size: small"><br /></span></div>
<div><span style="font-size: small">6.</span> </div>
<div>
<p><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">&lt;pao:FilterSelect id="jobExp.disTime_origin" name="jobExp.disTime_t" source="DataCode_4" </span></span><span style="font-family: Arial; color: red; font-size: small"><span style="font-family: Arial; color: red; font-size: 9pt">filter="0" </span></span><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">locale="#session['test.locale']" headerKey="0" headerValue="</span> </span><span style="color: navy; font-size: small"><span style="color: navy; font-size: 9pt">请选择</span> </span><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">"/&gt; </span></span></p>
<p><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: navy; font-size: small"><span style="color: navy; font-size: 9pt">更新成绿色部分</span> </span></p>
<p style="text-indent: 21pt"><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">&lt;pao:FilterSelect id="jobExp.disTime_origin" name="jobExp.disTime_t" source="DataCode_4"</span> </span><span style="font-family: Arial; color: lime; font-size: small"><span style="font-family: Arial; color: lime; font-size: 9pt">filter="{0}"</span> </span><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">locale="#session['test.locale']" headerKey="0" headerValue="</span> </span><span style="color: navy; font-size: small"><span style="color: navy; font-size: 9pt">请选择</span> </span><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">"/&gt;</span> </span></p>
<p style="text-indent: 21pt"><span style="font-size: small"><br /></span></p>
<p style="text-indent: 21pt"><span style="font-size: small"><br /></span></p>
<p style="text-indent: 21pt"><span style="font-size: small">7. </span></p>
<p><span style="font-family: Arial; color: navy; font-size: small"></span><span style="color: navy; font-size: small"><span style="color: navy; font-size: 9pt">然后就是</span> </span><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">json</span> </span></p>
<p><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.googlecode.jsonplugin.JSONUtil&nbsp; </span></span><span style="color: navy; font-size: small"><span style="color: navy; font-size: 9pt">需要替换</span> </span><span style="font-family: Arial; color: navy; font-size: small"><span style="font-family: Arial; color: navy; font-size: 9pt">&nbsp; org.apache.struts2.json.JSONUtil</span> </span></p>
<p><span style="font-size: small"><br /></span></p>
<p><span style="font-size: small"><br /></span></p>
<p><span style="font-size: small"><br /></span></p>
<p><span style="font-size: small">其他可参考官网</span> </p>
<p><span style="font-size: small">https://cwiki.apache.org/S2WIKI/troubleshooting-guide-migrating-from-struts-20x-to-21x.html#TroubleshootingguidemigratingfromStruts2.0.xto2.1.x-UpdateDependencies</span> <br /><br />转自：<a href="http://accpchf.iteye.com/blog/1128492">http://accpchf.iteye.com/blog/1128492</a></p></div></div></div></div><img src ="http://www.blogjava.net/freeman1984/aggbug/356066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2011-08-09 10:23 <a href="http://www.blogjava.net/freeman1984/archive/2011/08/09/356066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析struts中的ExecuteAndWaitInterceptor，以及简单例子</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/25/332787.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 24 Sep 2010 16:59:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/25/332787.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/332787.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/25/332787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/332787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/332787.html</trackback:ping><description><![CDATA[<p>&nbsp; 大致把源码中类前面的一段注释给翻译一下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1 ExecuteAndWaitInterceptor很适合在后台长时间运行的action时，他可以可为用户一个友好的等待界面，例如进度条。<br />
&nbsp;&nbsp;&nbsp; 2&nbsp; 不在默认的拦截<em>stack</em>&nbsp;里面，使用的时候需要配置，但必须是在拦截堆栈的最后一个。<br />
&nbsp;&nbsp;&nbsp;大致配置如下：<br />
&nbsp;&nbsp;&lt;action name="test" method="test" class="com.joe.web.action.ActionTest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="completeStack"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="execAndWait"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;param name="delay"&gt;1000&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;param name="delaySleepInterval"&gt;50&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="wait"&gt;wait.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;result name="success"&gt;success.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/action&gt;&nbsp;&nbsp;&nbsp; 3 使用的时候需要配置一个名为wait的result，并指向自己的等待页面，如果没有struts</p>
将使用FreeMarker代替，通过使用FreemarkerResult动态注入一个等待页面：struts提供的面板页面可见于：<br />
org/apache/struts2/interceptor/wait.ftl<br />
内容大致如下：<br />
<p>&lt;html&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="refresh" content="5;url=&lt;@s.url includeParams="none"/&gt;"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Please wait while we process your request...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;p/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This page will reload automatically and display your request when it is completed.<br />
&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;</p>
<p style="margin: 0cm 0cm 0pt; layout-grid-mode: char; text-indent: 21pt; line-height: 200%"><span style="font-family: 宋体">其中的</span>includeParams<span style="font-family: 宋体">参数取值为</span></p>
<p style="margin: 0cm 0cm 0pt; layout-grid-mode: char; text-indent: 21pt; line-height: 200%">none,<span style="font-family: 宋体">不把参数参加到</span>url<span style="font-family: 宋体">参数中</span></p>
<p style="margin: 0cm 0cm 0pt; layout-grid-mode: char; text-indent: 21pt; line-height: 200%">all,<span style="font-family: 宋体">是把</span>get<span style="font-family: 宋体">和</span>post<span style="font-family: 宋体">中的参数参加到</span>url<span style="font-family: 宋体">参数中</span></p>
<p style="margin: 0cm 0cm 0pt; layout-grid-mode: char; text-indent: 21pt; line-height: 200%">get,<span style="font-family: 宋体">是只把</span>get<span style="font-family: 宋体">中的参数参加到</span>url<span style="font-family: 宋体">参数中<br />
</span></p>
&nbsp;&nbsp;&nbsp;&nbsp; execAndWait拦截器有2个参数：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delay ：意思是初始等待多少秒才出现等待页面。当在这个等待时间内action执行完毕，就不用出现wai界面，如果不配，一开始就会出现。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;delaySleepInterval：每个对少时间检查action是否执行完毕。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; -------------<br />
大致的原理是：strus遇到这种配置了execAndWait的action会另外起一个线程来执行，这个线程名叫BackgroundProcess，并通过一个done属性的变化来标准执行情况，struts将此线程放到session中，页面每隔一段时间去检查是done==true?&nbsp;&nbsp;如果不是，就据需返回wai页面，否则返回主action的返回界面。<br />
&nbsp;BackgroundProcess大致源码：<br />
&nbsp;
<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_99_816_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_816_Open_Text.style.display='none'; Codehighlighter1_99_816_Closed_Image.style.display='inline'; Codehighlighter1_99_816_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_99_816_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_816_Closed_Text.style.display='none'; Codehighlighter1_99_816_Open_Image.style.display='inline'; Codehighlighter1_99_816_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;BackgroundProcess(String&nbsp;threadName,&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;ActionInvocation&nbsp;invocation,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;threadPriority)&nbsp;</span><span id="Codehighlighter1_99_816_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_99_816_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">.invocation&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;invocation;<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">.action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;invocation.getAction();<br />
<img id="Codehighlighter1_197_751_Open_Image" onclick="this.style.display='none'; Codehighlighter1_197_751_Open_Text.style.display='none'; Codehighlighter1_197_751_Closed_Image.style.display='inline'; Codehighlighter1_197_751_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_197_751_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_197_751_Closed_Text.style.display='none'; Codehighlighter1_197_751_Open_Image.style.display='inline'; Codehighlighter1_197_751_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_197_751_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_197_751_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_254_638_Open_Image" onclick="this.style.display='none'; Codehighlighter1_254_638_Open_Text.style.display='none'; Codehighlighter1_254_638_Closed_Image.style.display='inline'; Codehighlighter1_254_638_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_254_638_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_254_638_Closed_Text.style.display='none'; Codehighlighter1_254_638_Open_Image.style.display='inline'; Codehighlighter1_254_638_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Thread&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Runnable()&nbsp;</span><span id="Codehighlighter1_254_638_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_254_638_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_290_624_Open_Image" onclick="this.style.display='none'; Codehighlighter1_290_624_Open_Text.style.display='none'; Codehighlighter1_290_624_Closed_Image.style.display='inline'; Codehighlighter1_290_624_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_290_624_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_290_624_Closed_Text.style.display='none'; Codehighlighter1_290_624_Open_Image.style.display='inline'; Codehighlighter1_290_624_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_290_624_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_290_624_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_316_489_Open_Image" onclick="this.style.display='none'; Codehighlighter1_316_489_Open_Text.style.display='none'; Codehighlighter1_316_489_Closed_Image.style.display='inline'; Codehighlighter1_316_489_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_316_489_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_316_489_Closed_Text.style.display='none'; Codehighlighter1_316_489_Open_Image.style.display='inline'; Codehighlighter1_316_489_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_316_489_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_316_489_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beforeInvocation();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;invocation.invokeActionOnly();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterInvocation();<br />
<img id="Codehighlighter1_511_572_Open_Image" onclick="this.style.display='none'; Codehighlighter1_511_572_Open_Text.style.display='none'; Codehighlighter1_511_572_Closed_Image.style.display='inline'; Codehighlighter1_511_572_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_511_572_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_511_572_Closed_Text.style.display='none'; Codehighlighter1_511_572_Open_Image.style.display='inline'; Codehighlighter1_511_572_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_511_572_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_511_572_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exception&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;e;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;done&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.setName(threadName);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.setPriority(threadPriority);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.start();<br />
<img id="Codehighlighter1_773_810_Open_Image" onclick="this.style.display='none'; Codehighlighter1_773_810_Open_Text.style.display='none'; Codehighlighter1_773_810_Closed_Image.style.display='inline'; Codehighlighter1_773_810_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_773_810_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_773_810_Closed_Text.style.display='none'; Codehighlighter1_773_810_Open_Image.style.display='inline'; Codehighlighter1_773_810_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_773_810_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_773_810_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exception&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;e;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
当这个action结束后会将done属性设置为true表示执行结束，正是每次去检查这个属性来判别。<br />
<br />
&nbsp;&nbsp; 拦截器主要源码：<br />
<br />
&nbsp;
<p>&nbsp;if ((!executeAfterValidationPass || secondTime) &amp;&amp; bp == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bp = getNewBackgroundProcess(name, actionInvocation, threadPriority);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.put(KEY + name, bp);//放入session<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; performInitialDelay(bp); // first time let some time pass before showing wait page<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; secondTime = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((!executeAfterValidationPass || !secondTime) &amp;&amp; bp != null &amp;&amp; !bp.isDone()) {//是否完毕<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actionInvocation.getStack().push(bp.getAction<strong><span style="color: red"><strong>());//将后台action的相关信息push到statck，时候的页面可是使用</strong></span></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TokenHelper.getToken() != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.put(TokenHelper.getTokenName(), TokenHelper.getToken());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map results = proxy.getConfig().getResults();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!results.containsKey(WAIT)) <span style="color: red"><strong>{//如果没有配置wait，struts将为你inject一个<br />
</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG.warn("ExecuteAndWait interceptor has detected that no result named 'wait' is available. " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Defaulting to a plain built-in wait page. It is highly recommend you " +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "provide an action-specific or global result named '" + WAIT +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp; // no wait result? hmm -- let's try to do dynamically put it in for you!</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //we used to add a fake "wait" result here, since the configuration is unmodifiable, that is no longer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //an option, see WW-3068<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreemarkerResult waitResult = new FreemarkerResult();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; container.inject(waitResult);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waitResult.setLocation("/org/apache/struts2/interceptor/wait.ftl");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waitResult.execute(actionInvocation);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Action.NONE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return WAIT;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if ((!executeAfterValidationPass || !secondTime) &amp;&amp; bp != null &amp;&amp; bp.isDone()) <span style="color: red"><strong>{//如果执行完毕return&nbsp; bp.getResult();<br />
</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.remove(KEY + name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actionInvocation.getStack().push(bp.getAction());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // if an exception occured during action execution, throw it here<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bp.getException() != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw bp.getException();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bp.getResult();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this is the first instance of the interceptor and there is no existing action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // already run in the background, so let's just let this pass through. We assume<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the action invocation will be run in the background on the subsequent pass through<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // this interceptor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return actionInvocation.invoke();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
。<br />
<br />
一个简单的例子（不包含lib）：<br />
&nbsp;&nbsp;<a href="/Files/freeman1984/execAndWait.rar">/Files/freeman1984/execAndWait.rar</a><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;
 <img src ="http://www.blogjava.net/freeman1984/aggbug/332787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-25 00:59 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/25/332787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>stuts2 返回xml</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/17/332278.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Fri, 17 Sep 2010 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/17/332278.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/332278.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/17/332278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/332278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/332278.html</trackback:ping><description><![CDATA[<h3><a href="/blog/505775">关于Struts2 返回XML的问题</a></h3>
<div class="blog_content"><br />
1. Action其实是一个POJO,所以我们可以直接把Action生成一个XML.只要把Result Type设为xslt就可以了: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="XmlModel" class="cpu.XmlModelAction"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="xslt" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; <br />
里面包含了Action的所有属性,还有Locale等信息. 可以在浏览器里输入http://localhost:8080/XXX/XXX/XmlModel.action来看. <br />
<br />
2. 为了定制自己想要的XML,我们可以输入参数来输出自己想要的Action的某个属性(属性可以是一个List). <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="XmlModel" class="cpu.XmlModelAction"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="xslt"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=&#8221;exposedValue&#8221;&gt;modelList&lt;/param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; <br />
<br />
3. 如果有多于一个属性呢.加个大括号围起来 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="XmlModel" class="cpu.XmlModelAction"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="xslt"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=&#8221;exposedValue&#8221;&gt;{modelList, type}&lt;/param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; <br />
<br />
4. 以上三个方法都是由Action 来控制生成格式.那么对于我们这种控制欲很强的人来说并不满足,最好是由我们自己来定义生成样子.那么这时我们就要做的就是在属性里生成一个 org.w3c.dom.Document属性.注意:不要用org.dom4j.Document类.要不会出现转化错误,死得很惨. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="XmlModel" class="cpu.XmlModelAction"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="xslt"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="exposedValue"&gt;xmlDoc&lt;/param&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/result&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt; <br />
上面的xmlDoc就是 Action里的org.w3c.dom.Document类型. <br />
<br />
5. 我只会用并且非要用org.dom4j.Document类怎么办? 那就在最后转化成 org.w3c.dom.Document: <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="#"><img alt="复制代码" src="http://www.blogjava.net/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">import</span><span>&nbsp;java.io.ByteArrayInputStream;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;java.io.IOException;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.xml.parsers.DocumentBuilderFactory;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">import</span><span>&nbsp;javax.xml.parsers.ParserConfigurationException;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">import</span><span>&nbsp;org.xml.sax.SAXException;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;XmlUtil&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;XmlUtil()&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;org.w3c.dom.Document&nbsp;XmlString2W3cDom(String&nbsp;xml)&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SAXException,&nbsp;IOException,&nbsp;ParserConfigurationException&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">byte</span><span>[]&nbsp;byteArray&nbsp;=&nbsp;xml.getBytes(</span><span class="string">"UTF-8"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayInputStream&nbsp;baos&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ByteArrayInputStream(byteArray);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DocumentBuilderFactory&nbsp;factory&nbsp;=&nbsp;DocumentBuilderFactory.newInstance();&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.Document&nbsp;doc&nbsp;=&nbsp;factory.newDocumentBuilder().parse(baos);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;doc;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;org.dom4j.Document&nbsp;W3c2Dom4j(org.w3c.dom.Document&nbsp;doc)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(doc&nbsp;==&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(</span><span class="keyword">null</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.io.DOMReader&nbsp;xmlReader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;org.dom4j.io.DOMReader();&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(xmlReader.read(doc));&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" class="java" name="code"> import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
public class XmlUtil {
private XmlUtil() {
}
public static org.w3c.dom.Document XmlString2W3cDom(String xml)
throws SAXException, IOException, ParserConfigurationException {
byte[] byteArray = xml.getBytes("UTF-8");
ByteArrayInputStream baos = new ByteArrayInputStream(byteArray);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
org.w3c.dom.Document doc = factory.newDocumentBuilder().parse(baos);
return doc;
}
public static org.dom4j.Document W3c2Dom4j(org.w3c.dom.Document doc) {
if (doc == null) {
return (null);
}
org.dom4j.io.DOMReader xmlReader = new org.dom4j.io.DOMReader();
return (xmlReader.read(doc));
}
}
</pre>
<br />
Action里加上一句: xmlDoc = Xmlutil.XmlString2W3cDom(dom4jDoc.asXML()); <br />
上面的xmlDoc就是 Action里的org.w3c.dom.Document类型. <br />
<br />
6. 用org.dom4j.dom.DOMDocumentFactory()来建立 Document.而不要用DocumentHelper.createDocument()来产生.最后直接cast一下. <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.blogjava.net/freeman1984/admin/EditPosts.aspx?opt=1#"></a>&nbsp;</div>
<span><span class="keyword">public</span><span>&nbsp;String&nbsp;execute()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;UnsupportedEncodingException,&nbsp;ParserConfigurationException,&nbsp;SAXException,&nbsp;IOException&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></div>
<ol class="dp-j">
    <li><span>&nbsp;&nbsp;InfoCpuService&nbsp;cpuSvc&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;cpuSvc&nbsp;=&nbsp;(InfoCpuService)&nbsp;ServiceLocator.getInstance().getService(InfoCpuService.</span><span class="keyword">class</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;modelList&nbsp;=&nbsp;cpuSvc.getModels(prodBrand);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;log.info(ReflectionToStringBuilder.toString(</span><span class="keyword">this</span><span>));&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;org.dom4j.Document&nbsp;dom4jDoc&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;org.dom4j.dom.DOMDocumentFactory().createDocument();&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;root&nbsp;=&nbsp;dom4jDoc.addElement(</span><span class="string">"root"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;root.addAttribute(</span><span class="string">"prodType"</span><span>,&nbsp;</span><span class="string">"CPU"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="keyword">for</span><span>&nbsp;(Object&nbsp;o&nbsp;:&nbsp;modelList)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;root.addElement(</span><span class="string">"model"</span><span>).addAttribute(</span><span class="string">"name"</span><span>,&nbsp;(String)&nbsp;o);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;}&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="comment">//xmlDoc&nbsp;=&nbsp;XmlUtil.XmlString2W3cDom(doc.asXML());&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;xmlDoc&nbsp;=&nbsp;(Document)&nbsp;dom4jDoc;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;HttpServletResponse&nbsp;response&nbsp;=&nbsp;ServletActionContext.getResponse();&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;response.setContentType(</span><span class="string">"text/xml;charset=UTF-8"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;response.setHeader(</span><span class="string">"Cache-Control"</span><span>,&nbsp;</span><span class="string">"no-cache"</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;</span><span class="keyword">return</span><span>&nbsp;SUCCESS;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre style="display: none" class="java" name="code">    public String execute() throws UnsupportedEncodingException, ParserConfigurationException, SAXException, IOException {
InfoCpuService cpuSvc = null;
cpuSvc = (InfoCpuService) ServiceLocator.getInstance().getService(InfoCpuService.class);
modelList = cpuSvc.getModels(prodBrand);
log.info(ReflectionToStringBuilder.toString(this));
org.dom4j.Document dom4jDoc = new org.dom4j.dom.DOMDocumentFactory().createDocument();
Element root = dom4jDoc.addElement("root");
root.addAttribute("prodType", "CPU");
for (Object o : modelList) {
root.addElement("model").addAttribute("name", (String) o);
}
//xmlDoc = XmlUtil.XmlString2W3cDom(doc.asXML());
xmlDoc = (Document) dom4jDoc;
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/xml;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
return SUCCESS;
}
</pre>
<br />
其中三句代码是为了防止生成中文乱码 <br />
&nbsp;&nbsp; HttpServletResponse response = ServletActionContext.getResponse(); <br />
&nbsp;&nbsp; response.setContentType("text/xml;charset=UTF-8"); <br />
&nbsp;&nbsp; response.setHeader("Cache-Control", "no-cache"); <br />
<br />
7. 在action中返回类型最好设置为import org.w3c.dom.Document; <br />
<div class="dp-highlighter">
<div class="bar"><span><span class="keyword">private</span><span>&nbsp;Document&nbsp;retXML;&nbsp;&nbsp;</span></span></div>
</div>
<pre style="display: none" class="java" name="code">private Document retXML;
</pre>
<br />
配置格式为： <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.blogjava.net/freeman1984/admin/EditPosts.aspx?opt=1#"></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;action&nbsp;name=</span><span class="string">"XmlModel"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"com.XmlModelAction"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result&nbsp;name=</span><span class="string">"success"</span><span>&nbsp;type=</span><span class="string">"xslt"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#8221;exposedValue&#8221;&gt;retXML&lt;/param&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/result&gt; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&lt;/action&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
转自：http://skyful.javaeye.com/blog/505775
<img src ="http://www.blogjava.net/freeman1984/aggbug/332278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-17 11:13 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/17/332278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 ognl中的#、%和$符号用法说明</title><link>http://www.blogjava.net/freeman1984/archive/2010/09/01/330653.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Wed, 01 Sep 2010 15:44:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/09/01/330653.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/330653.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/09/01/330653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/330653.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/330653.html</trackback:ping><description><![CDATA[转自：http://blog.csdn.net/pengyouchuan/archive/2009/01/05/3712933.aspx<br />
<p>#、%和$符号在OGNL表达式中经常出现，而这三种符号也是开发者不容易掌握和理解的部分。在这里笔者简单介绍它们的相应用途。</p>
<p>1．#符号的用途一般有三种。<br />
&nbsp;&nbsp; 1)访问非根对象属性，例如示例中的#session.msg表达式，由于Struts 2中值栈被视为根对象，所以访问其他非根对象时，需要加#前缀。实际上，#相当于ActionContext. getContext()；#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute(&#8221;msg&#8221;) 。<br />
&nbsp;&nbsp;&nbsp; 2)用于过滤和投影（projecting）集合，如示例中的persons.{?#this.age&gt;20}。<br />
&nbsp;&nbsp;&nbsp; 3)用来构造Map，例如示例中的#{'foo1':'bar1','foo2':'bar2'}。</p>
<p>2．%符号<br />
%符号的用途是在标志的属性为字符串类型时，计算OGNL表达式的值。如下面的代码所示：<br />
构造Map<br />
&lt;s:set name="foobar" value="#{'foo1':'bar','foo2':'bar2'}" /&gt;</p>
<p>&lt;p&gt;The value of key "foo1" is &lt;s:property value="#foobar['foo1']" /&gt;&lt;/p&gt;</p>
<p>&lt;p&gt;不使用％：&lt;s:url value="#foobar['foo1']" /&gt;&lt;/p&gt;</p>
<p>&lt;p&gt;使用％：&lt;s:url value="%{#foobar['foo1']}" /&gt;&lt;/p&gt;</p>
<p>3．$符号<br />
$符号主要有两个方面的用途。</p>
<p>&nbsp;&nbsp; 在国际化资源文件中，引用OGNL表达式，例如国际化资源文件中的代码：reg.agerange=国际化资源信息：年龄必须在${min}同${max}之间。</p>
<p>&nbsp;&nbsp;&nbsp; 在Struts 2框架的配置文件中引用OGNL表达式，例如下面的代码片断所示：<br />
&lt;validators&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;field name=&#8221;intb&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field-validator type=&#8221;int&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=&#8221;min&#8221;&gt;10&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name=&#8221;max&#8221;&gt;100&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message&gt;BAction-test校验：数字必须为${min}为${max}之间！&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/field-validator&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/field&gt;<br />
&lt;/validators&gt;</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/pengyouchuan/archive/2009/01/05/3712933.aspx</p>
<img src ="http://www.blogjava.net/freeman1984/aggbug/330653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-09-01 23:44 <a href="http://www.blogjava.net/freeman1984/archive/2010/09/01/330653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>strtuts2 异常之Could not create and/or set value back on to object </title><link>http://www.blogjava.net/freeman1984/archive/2010/06/22/324133.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Tue, 22 Jun 2010 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/06/22/324133.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/324133.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/06/22/324133.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/324133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/324133.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 异常： strtus2中表单提交时报Could not create and/or set value back on to object&nbsp;<br />
&nbsp; 最终解决办法：对应于表单的bean 需要空的构造函数。
<img src ="http://www.blogjava.net/freeman1984/aggbug/324133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-06-22 11:14 <a href="http://www.blogjava.net/freeman1984/archive/2010/06/22/324133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 文件上传和下载，以及部分源码解析</title><link>http://www.blogjava.net/freeman1984/archive/2010/06/02/322533.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Wed, 02 Jun 2010 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/06/02/322533.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/322533.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/06/02/322533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/322533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/322533.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: struts2 文件上传和下载，以及部分源码解析&nbsp;&nbsp;<a href='http://www.blogjava.net/freeman1984/archive/2010/06/02/322533.html'>阅读全文</a><img src ="http://www.blogjava.net/freeman1984/aggbug/322533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-06-02 11:37 <a href="http://www.blogjava.net/freeman1984/archive/2010/06/02/322533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2插件 Config Browser Plugin</title><link>http://www.blogjava.net/freeman1984/archive/2010/01/18/310015.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Mon, 18 Jan 2010 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2010/01/18/310015.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/310015.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2010/01/18/310015.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/310015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/310015.html</trackback:ping><description><![CDATA[<p><span><a title="Config Browser Plugin" href="http://cwiki.apache.org/S2PLUGINS/config-browser-plugin.html"><span style="font-size: small">Config Browser Plugin</span></a><span style="font-size: small"> — Struts2</span></span><span><span style="font-size: small">运行期间可通过此插件查看<span>Struts2</span>的配置情况。</span></span></p>
<p><span><span style="font-size: small">又是一个很不错的插件，使用方法也很简单.</span></span></p>
<p><span><span style="font-size: small">在你下载的struts\lib目录下应该可以找到该插件struts2-config-browser-plugin</span></span></p>
<p><span><span style="font-size: small">然后把该jar复制到你的工程目录下:WEB-INF/lib下</span></span></p>
<p><span><span style="font-size: small">然后,启动你的项目</span></span></p>
<p><span><span style="font-size: small">输入:http://localhost:8008/你的发布工程名/config-browser/index.action</span></span></p>
<p><span><span style="font-size: small">然后你就可以看到如下的统计：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/freeman1984/www.jpg" border="0" /></span></span></p>
<img src ="http://www.blogjava.net/freeman1984/aggbug/310015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2010-01-18 23:17 <a href="http://www.blogjava.net/freeman1984/archive/2010/01/18/310015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 标签记录</title><link>http://www.blogjava.net/freeman1984/archive/2009/11/02/300709.html</link><dc:creator>疯狂</dc:creator><author>疯狂</author><pubDate>Mon, 02 Nov 2009 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/freeman1984/archive/2009/11/02/300709.html</guid><wfw:comment>http://www.blogjava.net/freeman1984/comments/300709.html</wfw:comment><comments>http://www.blogjava.net/freeman1984/archive/2009/11/02/300709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/freeman1984/comments/commentRss/300709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/freeman1984/services/trackbacks/300709.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>1，iterator</p>
<p>&lt;s:iterator id="obj" value="list" status="index"&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="padding-left: 30px">&lt;!---输出当前元素的属性--&gt;</p>
<p style="padding-left: 30px">&lt;s:property value="property"/&gt;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&lt;!---输出当前迭代元素的索引--&gt;</p>
<p style="padding-left: 30px">&lt;s:property value="#index.index"/&gt;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&lt;!---输出当前迭代了几个元素--&gt;</p>
<p style="padding-left: 30px">&lt;s:property value="#index.count"/&gt;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&lt;!---返回当前迭代元素的索引是否为奇数--&gt;</p>
<p style="padding-left: 30px">&lt;s:property value="#index.odd"/&gt;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&lt;!---返回当前迭代元素的索引是否为偶数--&gt;</p>
<p style="padding-left: 30px">&lt;s:property value="#index.event"/&gt;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&lt;!---返回当前元素是否为第一个--&gt;</p>
<p style="padding-left: 30px">&lt;s:property value="#index.first"/&gt;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&lt;!---返回当前元素是否为最后一个--&gt;</p>
<p style="padding-left: 30px">&lt;s:property value="#index.last"/&gt;</p>
<p style="padding-left: 30px">&nbsp;</p>
<p style="padding-left: 30px">&lt;!---返回当前元素下标--&gt;</p>
<p style="padding-left: 30px">&lt;s:property value="#index.getCount()" /&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&lt;/s:iterator&gt;</p>
</div>
 <img src ="http://www.blogjava.net/freeman1984/aggbug/300709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/freeman1984/" target="_blank">疯狂</a> 2009-11-02 14:59 <a href="http://www.blogjava.net/freeman1984/archive/2009/11/02/300709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>