﻿<?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/wanghun723/category/39540.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 23 Jun 2009 19:06:44 GMT</lastBuildDate><pubDate>Tue, 23 Jun 2009 19:06:44 GMT</pubDate><ttl>60</ttl><item><title>optiontransferselect标签属性</title><link>http://www.blogjava.net/wanghun723/articles/271921.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Thu, 21 May 2009 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/271921.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/271921.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/271921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/271921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/271921.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: optiontransferselect标签将呈现为两个select元素，内建在这个标签里的Javascript函数可以在那两个select元素之间来回"传输"各个选项。&nbsp;optiontransferselect标签的属性                                    名字                        ...&nbsp;&nbsp;<a href='http://www.blogjava.net/wanghun723/articles/271921.html'>阅读全文</a><img src ="http://www.blogjava.net/wanghun723/aggbug/271921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-21 13:08 <a href="http://www.blogjava.net/wanghun723/articles/271921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2上传任意多个文件 </title><link>http://www.blogjava.net/wanghun723/articles/270775.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Fri, 15 May 2009 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270775.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270775.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270775.html</trackback:ping><description><![CDATA[<p><strong><span style="font-family: 宋体">一、上传单个文件</span></strong></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">上传文件是很多</span>Web<span style="font-family: 宋体">程序都具有的功能。在</span>Struts1.x<span style="font-family: 宋体">中已经提供了用于上传文件的组件。而在</span>Struts2<span style="font-family: 宋体">中提供了一个更为容易操作的上传文件组件。所不同的是，</span>Struts1.x<span style="font-family: 宋体">的上传组件需要一个</span>ActionForm<span style="font-family: 宋体">来传递文件，而</span>Struts2<span style="font-family: 宋体">的上传组件是一个拦截器（这个拦截器不用配置，是自动装载的）。在本文中先介绍一下如何用</span>struts2<span style="font-family: 宋体">上传单个文件，最后介绍一下用</span>struts2<span style="font-family: 宋体">上传任意多个文件。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">要用</span>Struts2<span style="font-family: 宋体">实现上传单个文件的功能非常容易实现，只要使用普通的</span>Action<span style="font-family: 宋体">即可。但为了获得一些上传文件的信息，如上传文件名、上传文件类型以及上传文件的</span>Stream<span style="font-family: 宋体">对象，就需要按着一定规则来为</span>Action<span style="font-family: 宋体">类增加一些</span>getter<span style="font-family: 宋体">和</span>setter<span style="font-family: 宋体">方法。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">在</span>Struts2<span style="font-family: 宋体">中，</span><span style="font-family: 宋体">用于获得和设置</span>java.io.File<span style="font-family: 宋体">对象（</span>Struts2<span style="font-family: 宋体">将文件上传到临时路径，并使用</span>java.io.File<span style="font-family: 宋体">打开这个临时文件）的方法是</span>getUpload<span style="font-family: 宋体">和</span>setUpload<span style="font-family: 宋体">。获得和设置文件名的方法是</span>getUploadFileName<span style="font-family: 宋体">和</span>setUploadFileName<span style="font-family: 宋体">，获得和设置上传文件内容类型的方法是</span>getUploadContentType<span style="font-family: 宋体">和</span>setUploadContentType<span style="font-family: 宋体">。下面是用于上传的动作类的完整代码：</span></p>
<br />
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;action;<br />
<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;java.io.</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;UploadAction&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;ActionSupport&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;File&nbsp;upload;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;uploadContentType;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;getUploadFileName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setUploadFileName(String&nbsp;fileName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.fileName&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;File&nbsp;getUpload()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;upload;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setUpload(File&nbsp;upload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.upload&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;upload;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setUploadContentType(String&nbsp;contentType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.uploadContentType</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">contentType;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;getUploadContentType()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.uploadContentType;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: rgb(0,0,255)">throws</span><span style="color: rgb(0,0,0)">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.InputStream&nbsp;is&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;java.io.FileInputStream(upload);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.OutputStream&nbsp;os&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;java.io.FileOutputStream(</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">d:\\upload\\</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">byte</span><span style="color: rgb(0,0,0)">&nbsp;buffer[]&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">byte</span><span style="color: rgb(0,0,0)">[</span><span style="color: rgb(0,0,0)">8192</span><span style="color: rgb(0,0,0)">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;count&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">while</span><span style="color: rgb(0,0,0)">((count&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;is.read(buffer))&nbsp;</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.write(buffer,&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">,&nbsp;count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<span style="font-size: 14pt"><span style="font-size: 12pt"><strong style="color: red"><br />
</strong></span></span>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 在</span>execute<span style="font-family: 宋体">方法中的实现代码就很简单了，只是从临时文件复制到指定的路径（在这里是</span>d:\upload<span style="font-family: 宋体">）中。上传文件的临时目录的默认值是</span>javax.servlet.context.tempdir<span style="font-family: 宋体">的值，但可以通过</span>struts.properties<span style="font-family: 宋体">（和</span>struts.xml<span style="font-family: 宋体">在同一个目录下）的</span>struts.multipart.saveDir<span style="font-family: 宋体">属性设置。</span>Struts2<span style="font-family: 宋体">上传文件的默认大小限制是</span>2M<span style="font-family: 宋体">（</span>2097152<span style="font-family: 宋体">字节），也可以通过</span>struts.properties<span style="font-family: 宋体">文件中的</span>struts.multipart.maxSize<span style="font-family: 宋体">修改，如</span>struts.multipart.maxSize=2048 <span style="font-family: 宋体">表示一次上传文件的总大小不能超过</span>2K<span style="font-family: 宋体">字节。</span></p>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">下面的代码是上传文件的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">JSP</span><span style="font-size: 10.5pt; font-family: 宋体">页面代码</span><span style="font-size: 10.5pt; font-family: 宋体">：<br />
<br />
<br />
</span>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,0); background-color: rgb(255,255,0)">&lt;%</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">@&nbsp;page&nbsp;language</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">=</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">java</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&nbsp;import</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">=</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">java.util.*</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&nbsp;pageEncoding</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">=</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">GBK</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(255,255,0)">%&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,0); background-color: rgb(255,255,0)">&lt;%</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">@&nbsp;taglib&nbsp;prefix</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">=</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">s</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&nbsp;uri</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">=</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">/struts-tags</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(255,255,0)">%&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">title</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">上传单个文件</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">title</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">s:form&nbsp;</span><span style="color: rgb(255,0,0)">action</span><span style="color: rgb(0,0,255)">="upload"</span><span style="color: rgb(255,0,0)">&nbsp;namespace</span><span style="color: rgb(0,0,255)">="/test"</span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enctype</span><span style="color: rgb(0,0,255)">="multipart/form-data"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">s:file&nbsp;</span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">="upload"</span><span style="color: rgb(255,0,0)">&nbsp;label</span><span style="color: rgb(0,0,255)">="输入要上传的文件名"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">s:submit&nbsp;</span><span style="color: rgb(255,0,0)">value</span><span style="color: rgb(0,0,255)">="上传"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">s:form</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<p><span style="font-family: 宋体">也可以在</span>success.jsp<span style="font-family: 宋体">页中通过</span>&lt;s:property&gt;<span style="font-family: 宋体">获得文件的属性</span><span style="font-family: 宋体">（</span><span style="font-family: 宋体">文件名和文件内容类型</span><span style="font-family: 宋体">），</span><span style="font-family: 宋体">代码如下</span><span style="font-family: 宋体">：</span><span><br />
<br />
&nbsp;&nbsp;&nbsp; &lt;s:property value="uploadFileName"/&gt;</span></p>
<strong><span style="font-size: 10.5pt; font-family: 宋体">二、上传任意多个文件</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span></strong><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">中，上传任意多个文件也非常容易实现。首先，要想上传任意多个文件，需要在客户端使用</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">DOM</span><span style="font-size: 10.5pt; font-family: 宋体">技术生成任意多个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;input type=&#8221;file&#8221; /&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">标签。</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">name</span><span style="font-size: 10.5pt; font-family: 宋体">属性值都相同。代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">script&nbsp;</span><span style="color: rgb(255,0,0)">language</span><span style="color: rgb(0,0,255)">="javascript"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)"><br />
<br />
</span><span style="color: rgb(0,0,255); background-color: rgb(245,245,245)">function</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&nbsp;addComponent()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255); background-color: rgb(245,245,245)">var</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&nbsp;uploadHTML&nbsp;</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">=</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&nbsp;document.createElement(&nbsp;</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&lt;input&nbsp;type='file'&nbsp;&nbsp;name='upload'/&gt;</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">files</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">).appendChild(uploadHTML);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uploadHTML&nbsp;</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">=</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&nbsp;document.createElement(&nbsp;</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">&lt;p/&gt;</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">files</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">"</span><span style="color: rgb(0,0,0); background-color: rgb(245,245,245)">).appendChild(uploadHTML);<br />
}<br />
</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">script</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">head</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">input&nbsp;</span><span style="color: rgb(255,0,0)">type</span><span style="color: rgb(0,0,255)">="button"</span><span style="color: rgb(255,0,0)">&nbsp;onclick</span><span style="color: rgb(0,0,255)">="addComponent();"</span><span style="color: rgb(255,0,0)">&nbsp;value</span><span style="color: rgb(0,0,255)">="添加文件"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">br&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">form&nbsp;</span><span style="color: rgb(255,0,0)">onsubmit</span><span style="color: rgb(0,0,255)">="return&nbsp;true;"</span><span style="color: rgb(255,0,0)">&nbsp;action</span><span style="color: rgb(0,0,255)">="/struts2/test/upload.action"</span><span style="color: rgb(255,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method</span><span style="color: rgb(0,0,255)">="post"</span><span style="color: rgb(255,0,0)">&nbsp;enctype</span><span style="color: rgb(0,0,255)">="multipart/form-data"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">span&nbsp;</span><span style="color: rgb(255,0,0)">id</span><span style="color: rgb(0,0,255)">="files"</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">input&nbsp;</span><span style="color: rgb(255,0,0)">type</span><span style="color: rgb(0,0,255)">='file'&nbsp;</span><span style="color: rgb(255,0,0)">name</span><span style="color: rgb(0,0,255)">='upload'&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">p&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">span</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;</span><span style="color: rgb(128,0,0)">input&nbsp;</span><span style="color: rgb(255,0,0)">type</span><span style="color: rgb(0,0,255)">="submit"</span><span style="color: rgb(255,0,0)">&nbsp;value</span><span style="color: rgb(0,0,255)">="上传"</span><span style="color: rgb(255,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">/&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">form</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">body</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
<br />
</span><span style="color: rgb(0,0,255)">&lt;/</span><span style="color: rgb(128,0,0)">html</span><span style="color: rgb(0,0,255)">&gt;</span><span style="color: rgb(0,0,0)"><br />
</span></div>
<span style="font-size: 10.5pt; font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">上面的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">javascript</span><span style="font-size: 10.5pt; font-family: 宋体">代码可以生成任意多个</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">&lt;input type=&#8217;file&#8217;&gt;</span><span style="font-size: 10.5pt; font-family: 宋体">标签，</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">name</span><span style="font-size: 10.5pt; font-family: 宋体">的值都为</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">file（要注意的是，上面的javascript代码只适合于IE浏览器，firefox等其他浏览器需要使用他的代码）</span><span style="font-size: 10.5pt; font-family: 宋体">。至于</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类，和上传单个文件的</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Action</span><span style="font-size: 10.5pt; font-family: 宋体">类基本一至，只需要将三个属性的类型改为</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">List</span><span style="font-size: 10.5pt; font-family: 宋体">即可。代码如下：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
</span>
<div style="border-right: rgb(204,204,204) 1px solid; padding-right: 5px; border-top: rgb(204,204,204) 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: rgb(204,204,204) 1px solid; width: 98%; padding-top: 4px; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(238,238,238)"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0,0,255)">package</span><span style="color: rgb(0,0,0)">&nbsp;action;<br />
<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;java.io.</span><span style="color: rgb(0,0,0)">*</span><span style="color: rgb(0,0,0)">;<br />
</span><span style="color: rgb(0,0,255)">import</span><span style="color: rgb(0,0,0)">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">class</span><span style="color: rgb(0,0,0)">&nbsp;UploadMoreAction&nbsp;</span><span style="color: rgb(0,0,255)">extends</span><span style="color: rgb(0,0,0)">&nbsp;ActionSupport<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">File</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;uploads;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">String</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;fileNames;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">private</span><span style="color: rgb(0,0,0)">&nbsp;java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">String</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;uploadContentTypes;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">String</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;getUploadFileName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;fileNames;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setUploadFileName(java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">String</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;fileNames)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.fileNames&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;fileNames;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">File</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;getUpload()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;uploads;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setUpload(java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">File</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;uploads)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.uploads&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;uploads;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">void</span><span style="color: rgb(0,0,0)">&nbsp;setUploadContentType(java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">String</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;contentTypes)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.uploadContentTypes&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;contentTypes;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;java.util.List</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">String</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;getUploadContentType()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,0)">.uploadContentTypes;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">public</span><span style="color: rgb(0,0,0)">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: rgb(0,0,255)">throws</span><span style="color: rgb(0,0,0)">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">if</span><span style="color: rgb(0,0,0)">&nbsp;(uploads&nbsp;</span><span style="color: rgb(0,0,0)">!=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">null</span><span style="color: rgb(0,0,0)">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">for</span><span style="color: rgb(0,0,0)">&nbsp;(;&nbsp;i&nbsp;</span><span style="color: rgb(0,0,0)">&lt;</span><span style="color: rgb(0,0,0)">&nbsp;uploads.size();&nbsp;i</span><span style="color: rgb(0,0,0)">++</span><span style="color: rgb(0,0,0)">)<br />
&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;java.io.InputStream&nbsp;is&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;java.io.FileInputStream(uploads.get(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.OutputStream&nbsp;os&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;java.io.FileOutputStream(<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;</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">d:\\upload\\</span><span style="color: rgb(0,0,0)">"</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">+</span><span style="color: rgb(0,0,0)">&nbsp;fileNames.get(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">byte</span><span style="color: rgb(0,0,0)">&nbsp;buffer[]&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">new</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,255)">byte</span><span style="color: rgb(0,0,0)">[</span><span style="color: rgb(0,0,0)">8192</span><span style="color: rgb(0,0,0)">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">int</span><span style="color: rgb(0,0,0)">&nbsp;count&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">while</span><span style="color: rgb(0,0,0)">&nbsp;((count&nbsp;</span><span style="color: rgb(0,0,0)">=</span><span style="color: rgb(0,0,0)">&nbsp;is.read(buffer))&nbsp;</span><span style="color: rgb(0,0,0)">&gt;</span><span style="color: rgb(0,0,0)">&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">)<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;&nbsp;&nbsp;&nbsp;&nbsp;os.write(buffer,&nbsp;</span><span style="color: rgb(0,0,0)">0</span><span style="color: rgb(0,0,0)">,&nbsp;count);<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;os.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0,0,255)">return</span><span style="color: rgb(0,0,0)">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
<span style="font-size: 10.5pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; 在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">execute</span><span style="font-size: 10.5pt; font-family: 宋体">方法中，只是对</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">List</span><span style="font-size: 10.5pt; font-family: 宋体">对象进行枚举，在循环中的代码和上传单个文件时的代码基本相同。如果读者使用过</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">struts1.x</span><span style="font-size: 10.5pt; font-family: 宋体">的上传组件，是不是感觉</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">的上传功能更容易实现呢？</span><span style="font-size: 10.5pt; font-family: 宋体">在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts1.x</span><span style="font-size: 10.5pt; font-family: 宋体">中上传多个文件时，可是需要建立带索引的属性的。而在</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">Struts2</span><span style="font-size: 10.5pt; font-family: 宋体">中，就是这么简单就搞定了。</span><span style="font-size: 10.5pt; font-family: 宋体">图</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'">1</span><span style="font-size: 10.5pt; font-family: 宋体">是上传任意多个文件的界面。</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'"><br />
<br />
</span><img height="438" alt="" src="http://www.blogjava.net/images/blogjava_net/nokiaguy/7_01.jpg" width="492" /><br />
<br />
<p style="text-indent: 178.5pt"><span style="font-family: 宋体">图</span>1</p>
<p><span style="color: rgb(0,15,240)">&nbsp;<span style="color: rgb(0,15,240)"><span style="color: rgb(0,15,240)">&nbsp;<span style="color: rgb(0,15,240)"><span style="color: rgb(0,0,0)">&nbsp; <span style="font-family: 宋体">在本文中给出了用</span>Struts2<span style="font-family: 宋体">上传任意多个文件的一个方法，如果哪位读者有更好的方法，请跟贴！</span></span></span></span></span></span><span><br />
</span></p>
<img src ="http://www.blogjava.net/wanghun723/aggbug/270775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-15 09:30 <a href="http://www.blogjava.net/wanghun723/articles/270775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2的文件上传</title><link>http://www.blogjava.net/wanghun723/articles/270772.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Fri, 15 May 2009 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270772.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270772.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270772.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 看到有人在问Struts2的文件上传，想起自己买的李刚的《struts2权威指南》，书中已有很详细的介绍，只是自己一下子记不起来了，&nbsp;真的很遗憾，说明自己学得还不够扎实，所以自己整理了一下发上来。下面是上传的代码：文件上传页面文件上传页面中，包含两个表单域，文件标题和文件浏览域——当然，为了能完成文件上传，我们应该将这两个表单域所在表单的enctype属性设置为multipa...&nbsp;&nbsp;<a href='http://www.blogjava.net/wanghun723/articles/270772.html'>阅读全文</a><img src ="http://www.blogjava.net/wanghun723/aggbug/270772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-15 09:21 <a href="http://www.blogjava.net/wanghun723/articles/270772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2中文件上传过滤</title><link>http://www.blogjava.net/wanghun723/articles/270770.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Fri, 15 May 2009 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270770.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270770.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270770.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270770.html</trackback:ping><description><![CDATA[这篇文件接上面的struts2文件上传的文件，对上传文件类型进行过滤，&nbsp;这篇文件里的大量内容也是借鉴了李刚老师的《struts2权威指南》
<p><span class="STYLE1">手动实现文件过滤</span><br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大部分时候，Web应用不允许浏览者自由上传，尤其不能允许上传可执行性文件——因为可能是病毒程序。通常，我们可以允许浏览者上传图片，上传压缩文件等；除此之外，还必须对浏览者上传的文件大小进行限制。因此必须在文件上传中进行文件过滤。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从上面的Action中可以看出，Action内有两个方法分别用于获取文件类型和文件大小，为了实现文件过滤，完全可以通过判断这两个方法的返回值来实现文件过滤。 为了让上面的Action增加文件过滤的功能，在上面的Action中增加如下的方法：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_1_98_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1_98_Open_Text.style.display='none'; Codehighlighter1_1_98_Closed_Image.style.display='inline'; Codehighlighter1_1_98_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_1_98_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1_98_Closed_Text.style.display='none'; Codehighlighter1_1_98_Open_Image.style.display='inline'; Codehighlighter1_1_98_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1_98_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">/**&nbsp;*/</span><span id="Codehighlighter1_1_98_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;过滤文件类型<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;types&nbsp;系统所有允许上传的文件类型<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;如果上传文件的文件类型允许上传，返回null，否则返回input字符串<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_143_320_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_320_Open_Text.style.display='none'; Codehighlighter1_143_320_Closed_Image.style.display='inline'; Codehighlighter1_143_320_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_143_320_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_143_320_Closed_Text.style.display='none'; Codehighlighter1_143_320_Open_Image.style.display='inline'; Codehighlighter1_143_320_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;filterType(String[]&nbsp;types)&nbsp;</span><span id="Codehighlighter1_143_320_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_143_320_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileType&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getUploadContentType();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img id="Codehighlighter1_243_301_Open_Image" onclick="this.style.display='none'; Codehighlighter1_243_301_Open_Text.style.display='none'; Codehighlighter1_243_301_Closed_Image.style.display='inline'; Codehighlighter1_243_301_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_243_301_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_243_301_Closed_Text.style.display='none'; Codehighlighter1_243_301_Open_Image.style.display='inline'; Codehighlighter1_243_301_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(String&nbsp;type&nbsp;:&nbsp;types)&nbsp;</span><span id="Codehighlighter1_243_301_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_243_301_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_275_297_Open_Image" onclick="this.style.display='none'; Codehighlighter1_275_297_Open_Text.style.display='none'; Codehighlighter1_275_297_Closed_Image.style.display='inline'; Codehighlighter1_275_297_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_275_297_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_275_297_Closed_Text.style.display='none'; Codehighlighter1_275_297_Open_Image.style.display='inline'; Codehighlighter1_275_297_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(type.equals(fileType))&nbsp;</span><span id="Codehighlighter1_275_297_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_275_297_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;INPUT;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>&nbsp;</p>
<p>运行图：<br />
<br />
<img height="161" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img4/strlo123.gif" width="408" /></p>
<p><img height="230" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img4/strlo1234.gif" width="397" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;上面方法判断了上传文件的文件类型是否在允许上传文件类型列表中。为了让应用程序可以动态配置允许上传的文件列表，为该Action增加了一个allowTypes的属性，该属性的值列出了所有允许上传的文件类型。为了可以在struts.xml文件中配置allowTypes属性的值，必须在Action类中提供如下代码：<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;定义该Action允许上传的文件类型</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;allowTypes;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;allowTypes属性的setter和getter方法</span><span style="color: #008000"><br />
<img id="Codehighlighter1_116_140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_140_Open_Text.style.display='none'; Codehighlighter1_116_140_Closed_Image.style.display='inline'; Codehighlighter1_116_140_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_116_140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_116_140_Closed_Text.style.display='none'; Codehighlighter1_116_140_Open_Image.style.display='inline'; Codehighlighter1_116_140_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getAllowTypes()&nbsp;</span><span id="Codehighlighter1_116_140_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_116_140_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;allowTypes;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_189_224_Open_Image" onclick="this.style.display='none'; Codehighlighter1_189_224_Open_Text.style.display='none'; Codehighlighter1_189_224_Closed_Image.style.display='inline'; Codehighlighter1_189_224_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_189_224_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_189_224_Closed_Text.style.display='none'; Codehighlighter1_189_224_Open_Image.style.display='inline'; Codehighlighter1_189_224_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&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;setAllowTypes(String&nbsp;allowTypes)&nbsp;</span><span id="Codehighlighter1_189_224_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_189_224_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.allowTypes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;allowTypes;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
下面就可以在是实现该Action的execute方法了，在通过该方法实现文件上传之前，应该先判断上传文件的文件类型是否允许上传，增加类型判断后的execute方法如下：<br />
<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 id="Codehighlighter1_41_676_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_676_Open_Text.style.display='none'; Codehighlighter1_41_676_Closed_Image.style.display='inline'; Codehighlighter1_41_676_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_41_676_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_41_676_Closed_Text.style.display='none'; Codehighlighter1_41_676_Open_Image.style.display='inline'; Codehighlighter1_41_676_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><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;</span><span id="Codehighlighter1_41_676_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_41_676_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;将允许上传文件类型的字符串以英文逗号（,）分解成字符串数组。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filterResult&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;filterType(getAllowTypes().split(</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img id="Codehighlighter1_212_305_Open_Image" onclick="this.style.display='none'; Codehighlighter1_212_305_Open_Text.style.display='none'; Codehighlighter1_212_305_Closed_Image.style.display='inline'; Codehighlighter1_212_305_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_212_305_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_212_305_Closed_Text.style.display='none'; Codehighlighter1_212_305_Open_Image.style.display='inline'; Codehighlighter1_212_305_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(filterResult&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_212_305_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_212_305_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionContext.getContext().put(</span><span style="color: #000000">"</span><span style="color: #000000">typeError</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">您要上传的文件类型不正确！</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;filterResult;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fos&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(getSavePath()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\\</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;getUploadFileName());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fis&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileInputStream(getUpload());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;buffer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[</span><span style="color: #000000">1024</span><span style="color: #000000">];<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_621_655_Open_Image" onclick="this.style.display='none'; Codehighlighter1_621_655_Open_Text.style.display='none'; Codehighlighter1_621_655_Closed_Image.style.display='inline'; Codehighlighter1_621_655_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_621_655_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_621_655_Closed_Text.style.display='none'; Codehighlighter1_621_655_Open_Image.style.display='inline'; Codehighlighter1_621_655_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fis.read(buffer))&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_621_655_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_621_655_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fos.write(buffer,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;len);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p><br />
上面的Action类代码非常简单，它包含的execute方法先判断当前文件类型是否是允许上传的文件类型，如果该文件类型不允许上传，则返回input逻辑视图名；只有当该文件的类型是允许上传的文件类型时，才真正执行文件上传逻辑。<br />
为了让文件类型检验失败时能返回input逻辑视图，因此必须为该Action增加input逻辑视图配置，<br />
下面是该Action的配置文件代码。<br />
<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;指定Struts2配置文件的DTD信息&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;指定国际化资源文件的baseName为globalMessages&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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.custom.i18n.resources"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="globalMessages"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="GBK"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="lee"</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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;配置处理文件上传的Action&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="upload"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="lee.UploadAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;通过动态设置allowTypes的属性来动态指定允许上传的文件类型&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="allowTypes"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">image/bmp,image/png,image/gif,image/jpeg</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;动态设置Action的属性值&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="savePath"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/upload</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;配置Struts2默认的视图资源&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">/succ.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;配置该应用的input逻辑视图&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="input"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;/upload.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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;通过上面的配置看出，上面文件类型仅能上传各种类型的图片文件，如果试图上传其他类型的文件，系统将转入input逻辑视图，该逻辑视图就是upload.jsp页面，该页面中使用如下代码输出错误提示：<br />
&lt;!-- 使用表达式语言输出错误提示 --&gt;<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: #000000">${requestScope.typeError}</span></div>
<p><br />
如果试图上传非图片类型的文件，可以看到出错提示，提示用户不要上传非图片类型的文件<br />
通过上面的介绍，我们可以更轻易地完成了文件类型的过滤。<br />
如果需要实现文件大小过滤，与实现文件类型过滤的方法基本相似。虽然在上面的Action类中并没有方法直接获取上传文件的大小，但Action中包含了一个类型为File的属性，该属性封装了文件域对应的文件内容，而File类有一个length()方法，该方法可以返回文件的大小，通过比较该文件的大小和允许上传的文件大小，从而决定是否允许上传该文件。<br />
<br />
<strong>&nbsp;<span class="STYLE2">拦截器实现文件过滤</span></strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;上面手动实现文件过滤的方式虽然简单，但毕竟需要书写大量的过滤代码，不利于程序的高层次解构，而且开发复杂。<br />
Struts2提供了一个文件上传的拦截器，通过配置该拦截器可以更轻松的实现文件过滤。Struts2中文件上传的过滤器是fileUpload，为了让该拦截器起作用，只需要在该Action配置该拦截器引用即可。<br />
<br />
配置fileUpload拦截器时，可以为其指定两个参数：<br />
allowedTypes：该参数指定允许上传的文件类型，多个文件类型之间以英文逗号（,）隔开。<br />
maximumSize：该参数指定允许上传的文件大小，单位是字节。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;通过配置fileUpload的拦截器，可以更轻易的实现文件过滤，当文件过滤失败后，系统自动转入input逻辑视图，因此必须为该Action配置名为input的逻辑视图。除此之外，还必须显式地为该Action配置defaultStack的拦截器引用。<br />
通过拦截器来实现文件过滤的配置文件如下：<br />
<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;指定Struts2配置文件的DTD信息&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;指定国际化资源文件的baseName为globalMessages&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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.custom.i18n.resources"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="globalMessages"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="GBK"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="lee"</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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;配置处理文件上传的Action&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">="upload"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="lee.UploadAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;配置fileUpload的拦截器&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="fileUpload"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="allowedTypes"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">image/bmp,image/png,image/gif,image/jpeg</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maximumSize"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">2000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-ref</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;动态设置Action的属性值&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="savePath"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/upload</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;配置Struts2默认的视图资源&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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">/succ.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;配置该应用的input逻辑视图&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="input"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/upload.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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&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 />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
<br />
上面的拦截器过滤不仅过滤了文件的类型，也过滤了文件大小。上传文件的类型只能是图片文件，且文件大小不能大于2000字节（当然，我们随时可以更改到更大）。如果我们上传文件的文件太大，系统将转入input的逻辑视图，也就是/upload.jsp页面。<br />
</p>
<img src ="http://www.blogjava.net/wanghun723/aggbug/270770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-15 09:14 <a href="http://www.blogjava.net/wanghun723/articles/270770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2.0中国际化(i18n)您的应用程序</title><link>http://www.blogjava.net/wanghun723/articles/270453.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270453.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270453.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270453.html</trackback:ping><description><![CDATA[<p>国际化是商业系统中不可或缺的一部分，所以无论您学习的是什么Web框架，它都是必须掌握的技能。</p>
<p>其实，Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作，例如，如果您要输出一条国际化的信息，只需在代码包中加入FILE-NAME_xx_XX.properties（其中FILE-NAME为默认资源文件的文件名），然后在struts-config.xml中指明其路径，再在页面用&lt;bean:message&gt;标志输出即可。 </p>
<p>不过，所谓&#8220;没有最好，只有更好&#8221;。Struts 2.0并没有在这部分止步，而是在原有的简单易用的基础上，将其做得更灵活、更强大。</p>
<h2>国际化Hello World</h2>
<p>下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。</p>
<ol>
    <li>在Eclipse创建工程配置开发和运行环境（如果对这个步骤有问题，可以参考我早前的文章《<a class="entrylistItemTitle" id="A1" href="http://www.blogjava.net/max/archive/2006/10/10/74353.html">为Struts 2.0做好准备</a>》）。 <br />
    <li>在src文件夹中加入struts.properties文件，内容如下： <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"><span style="color: #000000">struts.custom.i18n.resources</span><span style="color: #000000">=</span><span style="color: #000000">globalMessages</span></div>
    <center>
    <table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
        <tbody>
            <tr>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/lightbulb_on.gif"  alt="" /></td>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">Struts 2.0有两个配置文件，struts.xml和struts.properties都是放在WEB-INF/classes/下。
                <ul>
                    <li>struts.xml用于应用程序相关的配置
                    <li>struts.properties用于Struts 2.0的运行时（Runtime）的配置</li>
                </ul>
                </td>
            </tr>
        </tbody>
    </table>
    </center>
    <li>在src文件夹中加入globalMessages_en_US.properties文件，内容如下：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; 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"><span style="color: #000000">HelloWorld</span><span style="color: #000000">=</span><span style="color: #000000">Hello World!</span></div>
    <li>在src文件夹中加入globalMessages_zh_CN.properties文件，内容如下：<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"><span style="color: #000000">HelloWorld</span><span style="color: #000000">=你</span><span style="color: #000000">好，世界！</span></div>
    <table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
        <tbody>
            <tr>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/lightbulb_on.gif"  alt="" /></td>
                <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">在此想和大家分享一个不错的编写properties文件的Eclipse插件（plugin），有了它我们在编辑一些简体中文、繁体中文等Unicode文本时，就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级（Software Update）安装此插件，步骤如下：<br />
                <div style="padding-right: 36px; padding-left: 36px">1、展开Eclipse的Help菜单，将鼠标移到Software Update子项，在出现的子菜单中点击Find and Install；<br />
                2、在Install/Update对话框中选择Search for new features to install，点击Next；<br />
                3、在Install对话框中点击New Remote Site；<br />
                4、在New Update Site对话框的Name填入&#8220;PropEdit&#8221;或其它任意非空字符串，在URL中填入http://propedit.sourceforge.jp/eclipse/updates/；<br />
                5、在Site to include to search列表中，除上一步加入的site外的其它选项去掉，点击Finsih；<br />
                6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为&#8220;3.1.x&#8221;的选项去掉（适用于Eclipse 3.2版本的朋友）；<br />
                7、点击Finish关闭对话框；<br />
                8、在下载后，同意安装，再按提示重启Eclipse，在工具条看到形似vi的按钮表示安装成功，插件可用。此时，Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。 </div>
                </td>
            </tr>
        </tbody>
    </table>
    <li>在WebContent文件夹下加入HelloWorl.jsp文件，内容如下：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; 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"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ page &nbsp;contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=UTF-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&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><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 />
    &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Hello World</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">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 />
    &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="HelloWorld"</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">h2</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">h2</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">s:property </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="%{getText('HelloWorld')}"</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">h2</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">html</span><span style="color: #0000ff">&gt;</span></div>
    <li>发布运行应用程序，在浏览器地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.jsp">http://localhost:8080/Struts2_i18n/HelloWorld.jsp</a> ，出现图1所示页面。<br />
    <img alt="图1 中文输出" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/r_imag2.gif" /><br />
    <span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图1 中文输出</span>
    <li>将浏览器的默认语言改为&#8220;英语（美国）&#8221;，刷新页面，出现图2所示页面。<br />
    <img alt="图2 英文输出" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/r_imag1.gif" /><br />
    <span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图2 英文输出</span> </li>
</ol>
上面的例子的做法，与Struts 1.x的做法相似，似乎并不能体现Struts 2.0的优势。不过，我在上面的例子用了两种方法来显示国际化字符串，其输出是相同的。其实，这就是Struts 2.0的一个优势，因为它默认支持EL，所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时，getText可以用来设置label属性，例如：<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"><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="%{getText('UserName')}"</span><span style="color: #0000ff">/&gt;</span></div>
<h2>资源文件查找顺序</h2>
<p>之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源（properties）文件。在Struts 2.0中有下面几种方法：</p>
<ol>
    <li>使用全局的资源文件，方法如上例所示。这适用于遍布于整个应用程序的国际化字符串，它们在不同的包（package）中被引用，如一些比较共用的出错提示；
    <li>使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源；
    <li>使用Action范围的资源文件。做法为Action的包下新建文件名（除文件扩展名外）与Action类名同样的资源文件。它只能在该Action中访问。如此一来，我们就可以在不同的Action里使用相同的properties名表示不同的值。例如，在ActonOne中title为&#8220;动作一&#8221;，而同样用title在ActionTwo表示&#8220;动作二&#8221;，节省一些命名工夫；
    <li>使用&lt;s:i18n&gt;标志访问特定路径的properties文件。使用方法请参考我早前的文章《<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl" href="http://www.blogjava.net/max/archive/2006/10/18/75857.html">常用的Struts 2.0的标志（Tag）介绍</a>》。在您使用这一方法时，请注意&lt;s:i18n&gt;标志的范围。在&lt;s:i18n name="xxxxx"&gt;到&lt;/s:i18n&gt;之间，所有的国际化字符串都会在名为xxxxx资源文件查找，如果找不到，Struts 2.0就会输出默认值（国际化字符串的名字）。</li>
</ol>
<p>上面我列举了四种配置和访问资源的方法，它们的范围分别是从大到小，而Struts 2.0在查找国际化字符串所遵循的是特定的顺序，如图3所示：</p>
<img alt="图3 资源文件查找顺序图" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/o_Search.jpg" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图3 资源文件查找顺序图</span>
<p>假设我们在某个ChildAction中调用了getText("user.title")，Struts 2.0的将会执行以下的操作： </p>
<ol>
    <li>查找ChildAction_xx_XX.properties文件或ChildAction.properties；
    <li>查找ChildAction实现的接口，查找与接口同名的资源文件MyInterface.properties；
    <li>查找ChildAction的父类ParentAction的properties文件，文件名为ParentAction.properties；
    <li>判断当前ChildAction是否实现接口ModelDriven。如果是，调用getModel()获得对象，查找与其同名的资源文件；
    <li>查找当前包下的package.properties文件；
    <li>查找当前包的父包，直到最顶层包；
    <li>在值栈（Value Stack）中，查找名为user的属性，转到user类型同名的资源文件，查找键为title的资源;
    <li>查找在struts.properties配置的默认的资源文件，参考例1;
    <li>输出user.title。</li>
</ol>
<h2>参数化国际化字符串</h2>
<p>许多情况下，我们都需要在动行时（runtime）为国际化字符插入一些参数，例如在输入验证提示信息的时候。在Struts 2.0中，我们通过以下两种方法做到这点：</p>
<ol>
    <li>在资源文件的国际化字符串中使用OGNL，格式为${表达式}，例如：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; 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"><span style="color: #000000">validation.require</span><span style="color: #000000">=</span><span style="margin-bottom: 8px; color: #000000">${getText(fileName)} is required</span></div>
    <li>使用<a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/text/MessageFormat.html">java.text.MessageFormat</a>中的字符串格式，格式为{ 参数序号（从0开始）, 格式类形（number | date | time | choice）, 格式样式}，例如：<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"><span style="color: #000000">validation.between</span><span style="color: #000000">=</span><span style="color: #000000">Date must between {</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #000000"> date, short} and {</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000"> date, short}</span></div>
    </li>
</ol>
在显示这些国际化字符时，同样有两种方法设置参数的值：<br />
<ol>
    <li>使用标志的value0、value1...valueN的属性，如：<br />
    <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; margin-bottom: 8px; 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"><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="validation.required"</span><span style="color: #ff0000"> value0</span><span style="color: #0000ff">="User Name"</span><span style="color: #0000ff">/&gt;</span></div>
    <li>使用param子元素，这些param将按先后顺序，代入到国际化字符串的参数中，例如：<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"><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:text </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="validation.required"</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">s:param </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="User Name"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
    </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:text</span><span style="color: #0000ff">&gt;</span></div>
    </li>
</ol>
<h2>让用户方便地选择语言</h2>
<p>开发国际化的应用程序时，有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中，通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过，由于这是一个比较普遍的应用场景（Scenario），所以Struts 2.0为您提供了一个名i18n的拦截器（Interceptor），并在默认情况下将其注册到拦截器链（Interceptor chain）中。它的原理为在执行Action方法前，i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在，拦截器就将其作为参数实例化Locale对象，并将其设为用户默认的区域（Locale），最后，将此Locale对象保存在session的名为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性中。</p>
<p>下面，我将提供一完整示例演示它的使用方法。</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="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> tutorial;<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/None.gif" align="top"  alt="" /><br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Hashtable;<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Locale;<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Map;<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_116_345_Open_Image" onclick="this.style.display='none'; Codehighlighter1_116_345_Open_Text.style.display='none'; Codehighlighter1_116_345_Closed_Image.style.display='inline'; Codehighlighter1_116_345_Closed_Text.style.display='inline';" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_116_345_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_116_345_Closed_Text.style.display='none'; Codehighlighter1_116_345_Open_Image.style.display='inline'; Codehighlighter1_116_345_Open_Text.style.display='inline';" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #0000ff">class</span><span style="color: #000000"> Locales </span><span id="Codehighlighter1_116_345_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="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/dot.gif"  alt="" /></span><span id="Codehighlighter1_116_345_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_159_343_Open_Image" onclick="this.style.display='none'; Codehighlighter1_159_343_Open_Text.style.display='none'; Codehighlighter1_159_343_Closed_Image.style.display='inline'; Codehighlighter1_159_343_Closed_Text.style.display='inline';" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_159_343_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_159_343_Closed_Text.style.display='none'; Codehighlighter1_159_343_Open_Image.style.display='inline'; Codehighlighter1_159_343_Open_Text.style.display='inline';" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000"> getLocales() </span><span id="Codehighlighter1_159_343_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="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/dot.gif"  alt="" /></span><span id="Codehighlighter1_159_343_Open_Text"><span style="color: #000000">{<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000"> locales </span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"> Hashtable</span><span style="color: #000000">&lt;</span><span style="color: #000000">String, Locale</span><span style="color: #000000">&gt;</span><span style="color: #000000">(</span><span style="color: #000000">2</span><span style="color: #000000">);<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="color: #000000">"</span><span style="color: #000000">American English</span><span style="color: #000000">"</span><span style="color: #000000">, Locale.US);<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="color: #000000">"</span><span style="color: #000000">Simplified Chinese</span><span style="color: #000000">"</span><span style="color: #000000">, Locale.CHINA);<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> locales;<br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<span style="font-size: smaller; font-style: italic">tutorial/Locales.java</span><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"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">script </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="text/javascript"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000; background-color: #f5f5f5"><br />
</span><span style="color: #000000; background-color: #f5f5f5">&lt;!--</span><span style="color: #000000; background-color: #f5f5f5"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff; background-color: #f5f5f5">function</span><span style="color: #000000; background-color: #f5f5f5"> langSelecter_onChanged() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; document.langForm.submit();<br />
&nbsp; &nbsp; }<br />
</span><span style="color: #008000; background-color: #f5f5f5">//</span><span style="color: #008000; background-color: #f5f5f5">--&gt;</span><span style="color: #008000; background-color: #f5f5f5"><br />
</span><span style="color: #0000ff">&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">s:set </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="SESSION_LOCALE"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="#session['WW_TRANS_I18N_LOCALE']"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="locales"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="tutorial.Locales"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="&lt;s:url includeParams="</span><span style="color: #ff0000">get" encode</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">" name="langForm"&nbsp;<br />
&nbsp; &nbsp; style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"&gt;<br />
&nbsp; &nbsp; Language: </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:select </span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Language"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#locales.locales"</span><span style="color: #ff0000"> listKey</span><span style="color: #0000ff">="value"</span><span style="color: #ff0000"> &nbsp; &nbsp;listValue</span><span style="color: #0000ff">="key"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="request_locale"</span><span style="color: #ff0000"> id</span><span style="color: #0000ff">="langSelecter"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; onchange</span><span style="color: #0000ff">="langSelecter_onChanged()"</span><span style="color: #ff0000"> theme</span><span style="color: #0000ff">="simple"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">LangSelector.jsp</span>
<p>上述代码的原理为，LangSelector.jsp先实例化一个Locales对象，并把对象的Map类型的属性locales赋予下拉列表（select） 。如此一来，下拉列表就获得可用语言的列表。大家看到LangSelector有&lt;s:form&gt;标志和一段Javascript脚本，它们的作用就是在用户在下拉列表中选择了后，提交包含&#8220;reqeust_locale&#8221;变量的表单到Action。在打开页面时，为了下拉列表的选中的当前区域，我们需要到session取得当前区域（键为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性），而该属性在没有设置语言前是为空的，所以通过值栈中locale属性来取得当前区域（用户浏览器所设置的语言）。</p>
你可以把LangSelector.jsp作为一个控件使用，方法是在JSP页面中把它包含进来，代码如下所示：
<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"><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:include </span><span style="color: #ff0000">value</span><span style="color: #0000ff">="/LangSelector.jsp"</span><span style="color: #0000ff">/&gt;</span></div>
<br />
在例1中的HellloWorld.jsp中&lt;body&gt;后加入上述代码，并在struts.xml中新建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"><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="HelloWorld"</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">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/HelloWorld.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 />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span></div>
<br />
或者，如果你多个JSP需要实现上述功能，你可以使用下面的通用配置，而不是为每一个JSP页面都新建一个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"><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*"</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">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/{1}.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 />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span></div>
<br />
分布运行程序，在浏览器的地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.action">http://localhost:8080/Struts2_i18n/HelloWorld.action</a>，出现图4所示页面：<br />
<img alt="图3 HelloWorld.action" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/r_imag3.gif" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图3 HelloWorld.action<br />
</span><br />
在下拉列表中，选择&#8220;American English&#8221;，出现图5所示页面：<br />
<img alt="图3 HelloWorld.action" src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/r_imag4.gif" /><br />
<span style="font-size: smaller; margin-bottom: 8px; font-style: italic">图4 HelloWorld.action</span><br />
<table style="border-right: #f0c000 1px solid; border-top: #f0c000 1px solid; margin-top: 8px; margin-bottom: 8px; border-left: #f0c000 1px solid; border-bottom: #f0c000 1px solid; background-color: #ffffce; text-align: left" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px"><img src="file:///E:/Develop%20Helper/Struts2/资料/在Struts%202_0中国际化(i18n)您的应用程序%20-%20Max%20On%20Java%20-%20BlogJava.files/lightbulb_on.gif"  alt="" /></td>
            <td style="padding-right: 4px; padding-left: 4px; padding-bottom: 4px; padding-top: 4px; font-family: 华文仿宋">可能大家会问为什么一定要通过Action来访问页面呢？<br />
            你可以试一下不用Action而直接用JSP的地址来访问页面，结果会是无论你在下拉列表中选择什么，语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面，Struts 2.0在web.xml的配置的过滤器（Filter）就不会工作，所以拦截器链也不会工作。</td>
        </tr>
    </tbody>
</table>
  <img src ="http://www.blogjava.net/wanghun723/aggbug/270453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 17:23 <a href="http://www.blogjava.net/wanghun723/articles/270453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2常用的Ajax标签</title><link>http://www.blogjava.net/wanghun723/articles/270427.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270427.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270427.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270427.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts2为了简化Ajax过程，提供了一些常用的Ajax标签，对于一些更复杂的Ajax通信过程，我们可以使用JSON插件来实现。1，div标签div标签在页面上生成一个div元素，但这个div元素的内容不是静态内容，而是从服务器获取的内容。必须为该div标签指定一个href属性，这个href属性必须是一个action，该action负责生成该div元素的内容。还可以指定该div标签生成...&nbsp;&nbsp;<a href='http://www.blogjava.net/wanghun723/articles/270427.html'>阅读全文</a><img src ="http://www.blogjava.net/wanghun723/aggbug/270427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 15:33 <a href="http://www.blogjava.net/wanghun723/articles/270427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2中非表单标签的使用</title><link>http://www.blogjava.net/wanghun723/articles/270419.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270419.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270419.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270419.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;非表单标签主要用于在页面生成一些非表单的可视化元素，例如Tab页面，输出HTML页面的树形结构等。当然，非表单标签也包含在页面显示Action里封装的信息。非表单标签主要有如下几个：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; a：生成一个超级连接(link) <br />
&nbsp;&nbsp;&nbsp; &nbsp;actionerror：如果Action实例的getActionErrors()方法返回不为null，则该标签负责输出该方法返回的系列错误。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; actionmessage ：如果Action实例的getActionMessages()方法返回不为null，则该标签负责输出该方法返回的系列消息。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; component：使用此标签可以生成一个自定义组件。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; div ：此标签负责生成一个div片段。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; fielderror：如果Action实例存在表单域的类型转换错误、校验错误，该标签负责输出这些错误提示。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; tabbedPanel：生成HTML页面的Tab页。 <br />
&nbsp;&nbsp; &nbsp; tree：生成一个树形结构。 <br />
&nbsp;&nbsp;&nbsp;&nbsp; treenode：生成树形结构的节点。 <br />
下面，使用上面列出的一些十分常用的非表单标签。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1. actionerror和actionmessage标签&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 这两个标签用法完全一样，作用也几乎完全一样，都是负责输出Action实例里封装的信息，区别是actionerror标签负责输出Action实例的getActionError()方法的返回值，而actionmessage标签负责输出Action实例的getActionMessage()方法的返回值。对于这两个标签而言，几乎没有自己的专有属性，故使用起来非常简单。 下面是本示例应用中的Action类，这个Action类仅仅添加了两条ActionError和ActionMessage，并没有做过多处理，代码： <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 id="Codehighlighter1_46_261_Open_Image" onclick="this.style.display='none'; Codehighlighter1_46_261_Open_Text.style.display='none'; Codehighlighter1_46_261_Closed_Image.style.display='inline'; Codehighlighter1_46_261_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_46_261_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_46_261_Closed_Text.style.display='none'; Codehighlighter1_46_261_Open_Image.style.display='inline'; Codehighlighter1_46_261_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;DemoAction&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span id="Codehighlighter1_46_261_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_46_261_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_74_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_74_259_Open_Text.style.display='none'; Codehighlighter1_74_259_Closed_Image.style.display='inline'; Codehighlighter1_74_259_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_74_259_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_74_259_Closed_Text.style.display='none'; Codehighlighter1_74_259_Open_Image.style.display='inline'; Codehighlighter1_74_259_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_74_259_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_74_259_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;<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: #008000">//</span><span style="color: #008000">&nbsp;添加两条Error信息</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addActionError(</span><span style="color: #000000">"</span><span style="color: #000000">第一条错误消息！</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;addActionError(</span><span style="color: #000000">"</span><span style="color: #000000">第二条错误消息！</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;<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: #008000">//</span><span style="color: #008000">&nbsp;添加两条普通信息</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addActionMessage(</span><span style="color: #000000">"</span><span style="color: #000000">第一条普通消息！</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;addActionMessage(</span><span style="color: #000000">"</span><span style="color: #000000">第二条普通消息！</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;<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;SUCCESS;<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></div>
<br />
上面的Action的execute方法仅仅在添加了四条消息后，直接返回success字符串，success字符串对应的JSP页面中使用&lt;s:actionerrror/&gt;和&lt;s:actionmessage/&gt;来输出ActionError和ActionMessage信息。下面是该JSP页面中使用这两个标签的示例代码： <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: #008000">&lt;!--</span><span style="color: #008000">&nbsp;输出getActionError()方法返回值&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">s:actionerror</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: #008000">&lt;!--</span><span style="color: #008000">&nbsp;输出getActionMessage()方法返回值&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">s:actionmessage&nbsp;</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></div>
<br />
在另一个页面中使用&lt;s:action .../&gt;标签来调用上面的Action，调用Action的标签代码片段如下： <br />
&lt;s:action name="demo" executeResult="true"/&gt; <br />
从上面的&lt;s:action .../&gt;标签中可以看出，上面代码将demoAction的处理结果包含到本页面中来。 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2. component标签 <br />
&nbsp;&nbsp;&nbsp;&nbsp; component标签用于使用自己的自定义组件，这是一个非常灵活的用法，如果经常需要使用某个效果片段，就可以考虑将这个效果片段定义成一个自定义组件，然后在页面中使用component标签来使用该自定义组件。因为使用自定义组件还是基于主题、模板管理的，因此在使用component标签时，常常需要指定如下三个属性： <br />
 theme：自定义组件所使用的主题，如果不指定该属性，默认使用xhtml主题。 <br />
 templateDir：指定自定义组件的主题目录，如果不指定，默认使用系统的主题目录，即template目录。 <br />
 template：指定自定义组件所使用的模板。 <br />
除此之外，还可以在cmponent标签内使用param子标签，子标签表示向该标签模板中传入额外的参数。如果希望在模板中取得该参数，总是采用如下形式：$parameters.paramname，或者$parameters['paramname']。 <br />
提示：自定义的模板文件可以采用FreeMarker、JSP和Velocity三种技术来书写。 <br />
看下面的JSP页面，该页面多次使用了&lt;s:component .../&gt;标签来使用自定义组件，下面是该页面使用&lt;s:component .../&gt;标签的代码片段： <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: #000000">使用自定义主题，自定义主题目录</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />从Web应用根路径下加载模板，使用ftl模板。&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">s:component&nbsp;<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: #ff0000">theme</span><span style="color: #0000ff">="customTheme"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;templateDir</span><span style="color: #0000ff">="customTemplateDir"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #0000ff">="ftlCustomTemplate"</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">s:param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="list"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="{'Spring2.0宝典'&nbsp;,&nbsp;'轻量级J2EE企业应用实战'&nbsp;,&nbsp;'基于J2EE的Ajax宝典'}"</span><span style="color: #ff0000">&nbsp;</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">s:component</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">hr</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&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">br</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="" />从Web应用根路径下加载模板，使用JSP模板。&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">s:component&nbsp;<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: #ff0000">theme</span><span style="color: #0000ff">="customTheme"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;templateDir</span><span style="color: #0000ff">="customTemplateDir"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template</span><span style="color: #0000ff">="jspCustomTemplate.jsp"</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">s:param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="list"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="{'Spring2.0宝典'&nbsp;,&nbsp;'轻量级J2EE企业应用实战'&nbsp;,&nbsp;'基于J2EE的Ajax宝典'}"</span><span style="color: #ff0000">&nbsp;</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">s:component</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">hr</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="" />使用默认主题(xhtml)，默认主题目录(template)</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</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="" />从Web应用中加载模板，使用JSP模板。&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">s:component&nbsp;</span><span style="color: #ff0000">template</span><span style="color: #0000ff">="mytemplate.jsp"</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">s:param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="list"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="{'Spring2.0宝典'&nbsp;,&nbsp;'轻量级J2EE企业应用实战'&nbsp;,&nbsp;'基于J2EE的Ajax宝典'}"</span><span style="color: #ff0000">&nbsp;</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">s:component</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">hr</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&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">br</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="" />从/WEB-INF/classes路径下加载模板，使用ftl模板。&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">s:component&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="myTheme"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />templateDir</span><span style="color: #0000ff">="myTemplateDir"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />template</span><span style="color: #0000ff">="myAnotherTemplate"</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">s:param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="list"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="{'Spring2.0宝典'&nbsp;,&nbsp;'轻量级J2EE企业应用实战'&nbsp;,&nbsp;'基于J2EE的Ajax宝典'}"</span><span style="color: #ff0000">&nbsp;</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">s:component</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></div>
<br />
在上面页面中使用了2个FreeMarker模板，这两个FreeMarker模板都使用了FreeMarker标签。除此之外，本页面中还使用了两个JSP模板，这两个JSP页面只是加载的位置不同，两个模板的代码是相同的，下面是JSP模板的代码： <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: #008000">&lt;!--</span><span style="color: #008000">&nbsp;设置页面编码&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_19_77_Open_Image" onclick="this.style.display='none'; Codehighlighter1_19_77_Open_Text.style.display='none'; Codehighlighter1_19_77_Closed_Image.style.display='inline'; Codehighlighter1_19_77_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_19_77_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_19_77_Closed_Text.style.display='none'; Codehighlighter1_19_77_Open_Image.style.display='inline'; Codehighlighter1_19_77_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_19_77_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_19_77_Open_Text"><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html;&nbsp;charset=GBK</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_84_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_84_121_Open_Text.style.display='none'; Codehighlighter1_84_121_Closed_Image.style.display='inline'; Codehighlighter1_84_121_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_84_121_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_84_121_Closed_Text.style.display='none'; Codehighlighter1_84_121_Open_Image.style.display='inline'; Codehighlighter1_84_121_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_84_121_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_84_121_Open_Text"><span style="color: #000000; background-color: #f5f5f5">@taglib&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span></span><span style="color: #000000; background-color: #ffff00">%&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">div&nbsp;</span><span style="color: #ff0000">style</span><span style="color: #0000ff">="background-color:#eeeeee;"</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">b</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">JSP自定义模板</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</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">br</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">b</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: #008000">&lt;!--</span><span style="color: #008000">&nbsp;使用select标签迭代输出list参数所穿过来的集合&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">s:select&nbsp;</span><span style="color: #ff0000">list</span><span style="color: #0000ff">="parameters.list"</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">div</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></div>
<br />
3. tree和treenode初步 <br />
这里仅仅介绍tree和treenode标签的初步用法，我们可以通过tree和treenode在页面中生成一个树形结构。其中tree生成一个树形结构，treenode生成一个树节点。 <br />
对于tree和treenode标签，都可指定一个label属性，该属性指定了树、或者树节点的标题。看如下代码： <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: #008000">&lt;!--</span><span style="color: #008000">&nbsp;使用s:tree生成树&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">s:tree&nbsp;</span><span style="color: #ff0000">label</span><span style="color: #0000ff">="计算机图书"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="book"</span><span style="color: #ff0000">&nbsp;theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />showRootGrid</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;showGrid</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;treeSelectedTopic</span><span style="color: #0000ff">="treeSelected"</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: #008000">&lt;!--</span><span style="color: #008000">&nbsp;每个treenode生成一个树节点&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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:treenode&nbsp;</span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="李刚"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="yeeku"</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: #008000">&lt;!--</span><span style="color: #008000">&nbsp;treenode生成下一级的子节点&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:treenode&nbsp;</span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="Spring2.0宝典"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="spring"</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:treenode&nbsp;</span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="轻量级J2EE企业应用实战"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="lightweight"</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:treenode&nbsp;</span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="基于J2EE的Ajax宝典"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="ajax"</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;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:treenode</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:treenode&nbsp;</span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="David"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="David"</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:treenode&nbsp;</span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="JavaScript:&nbsp;The&nbsp;Definitive&nbsp;Guide"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="javascript"</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;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:treenode</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:treenode&nbsp;</span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="Johnson"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="Johnson"</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;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:treenode&nbsp;</span><span style="color: #ff0000">theme</span><span style="color: #0000ff">="ajax"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="Expert&nbsp;One-on-One&nbsp;J2EE&nbsp;Design&nbsp;and&nbsp;Development"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="j2ee"</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;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:treenode</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">s:tree</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></div>
<br />
从上面代码中可以看出，所有的treenode标签必须放在tree标签内部，或者放在treenode标签的内部。当放在tree标签的内部时，该节点是该树的根节点，当放在treenode标签的内部时，它是该节点的子节点。 
<img src ="http://www.blogjava.net/wanghun723/aggbug/270419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 15:10 <a href="http://www.blogjava.net/wanghun723/articles/270419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中的Result类型应用(action...etc跳转) </title><link>http://www.blogjava.net/wanghun723/articles/270414.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270414.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270414.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270414.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270414.html</trackback:ping><description><![CDATA[<p><strong>Result类型</strong> 是在Action执行完,一个结果返回后决定发生什么事的类。开发者可以自由的根据他们的应用和环境的需要创建自己的Result类型。例如在WebWork2中，Servlet和Velocity结果类型已经被创建用来显示web应用程序的画面。</p>
<p><ins>注意:</ins> 所有的webwork内建的Result类型都实现了com.opensymphony.xwork.Result接口. 这个接口是所有action执行结果的通用接口,不管这个结果是用来显示一个网页还是产生一个email,发送一个JMS消息,等.</p>
<p>Result类型配置中定义了一些类,把它们映射为action配置中可以引用的名字. 也就是为这些类创建便于记忆的键-值对.</p>
<div class="code">
<div class="codeHeader"><strong>snippet of webwork-default.xml</strong></div>
<div class="codeContent">
<pre class="code-xml">...
<span class="code-tag">&lt;result-types&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"dispatcher"</span> class=<span class="code-quote">"com.opensymphony.webwork.dispatcher.ServletDispatcherResult"</span> default=<span class="code-quote">"true"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"redirect"</span> class=<span class="code-quote">"com.opensymphony.webwork.dispatcher.ServletRedirectResult"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"velocity"</span> class=<span class="code-quote">"com.opensymphony.webwork.dispatcher.VelocityResult"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"chain"</span> class=<span class="code-quote">"com.opensymphony.xwork.ActionChainResult"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"xslt"</span> class=<span class="code-quote">"com.opensymphony.webwork.views.xslt.XSLTResult"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"jasper"</span> class=<span class="code-quote">"com.opensymphony.webwork.views.jasperreports.JasperReportsResult"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"freemarker"</span> class=<span class="code-quote">"com.opensymphony.webwork.views.freemarker.FreemarkerResult"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"httpheader"</span> class=<span class="code-quote">"com.opensymphony.webwork.dispatcher.HttpHeaderResult"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"stream"</span> class=<span class="code-quote">"com.opensymphony.webwork.dispatcher.StreamResult"</span>/&gt;</span>
<span class="code-tag">&lt;result-type name=<span class="code-quote">"plaintext"</span> class=<span class="code-quote">"com.opensymphony.webwork.dispatcher.PlainTextResult"</span> /&gt;</span>
<span class="code-tag">&lt;/result-types&gt;</span>
...</pre>
</div>
</div>
<div class="code">
<div class="codeHeader"><strong>snippet of your xwork.xml</strong></div>
<div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;include file=<span class="code-quote">"webwork-default.xml"</span>/&gt;</span>
<span class="code-tag">&lt;package name=<span class="code-quote">"myPackage"</span> extends=<span class="code-quote">"default"</span>&gt;</span>
<span class="code-tag">&lt;action name=<span class="code-quote">"bar"</span> class=<span class="code-quote">"myPackage.barAction"</span>&gt;</span>
<span class="code-tag"><span class="code-comment">&lt;!-- default result type is <span class="code-quote">"dispatcher"</span> --&gt;</span></span>
<span class="code-tag"><span class="code-comment">&lt;!-- default result name is <span class="code-quote">"success"</span> --&gt;</span></span>
<span class="code-tag">&lt;result&gt;</span>foo.jsp<span class="code-tag">&lt;/result&gt;</span>
<span class="code-tag">&lt;result name=<span class="code-quote">"error"</span>&gt;</span>error.jsp<span class="code-tag">&lt;/result&gt;</span>
<span class="code-tag">&lt;/result&gt;</span>
<span class="code-tag">&lt;/action&gt;</span>
<span class="code-tag">&lt;/package&gt;</span></pre>
</div>
</div>
<h1><a name="ResultTypes-Result%E7%B1%BB%E5%9E%8B"></a>Result类型</h1>
<p>Webwork提供了一些com.opensymphony.xwork.Result接口的实现来使你的action可以容易的用户交互.这些Result类型包括:</p>
<ul>
    <li><a title="Chain Result" href="http://wiki.javascud.org/display/ww2cndoc/Chain+Result"><a title="Chain Result" href="http://wiki.javascud.org/display/ww2cndoc/Chain+Result"><a title="Chain Result" href="http://wiki.javascud.org/display/ww2cndoc/Chain+Result">Chain Result</a> </a></a>- 用于 <a title="Action Chaining" href="http://wiki.javascud.org/display/ww2cndoc/Action+Chaining">Action Chaining</a>
    <li><a title="Dispatcher Result" href="http://wiki.javascud.org/display/ww2cndoc/Dispatcher+Result">Dispatcher Result</a> - 用于 <a title="JSP" href="http://wiki.javascud.org/display/ww2cndoc/JSP">JSP</a> 整合
    <li><a title="FreeMarker Result" href="http://wiki.javascud.org/display/ww2cndoc/FreeMarker+Result">FreeMarker Result</a> - 用于 <a title="FreeMarker" href="http://wiki.javascud.org/display/ww2cndoc/FreeMarker">FreeMarker</a> 整合
    <li><a title="HttpHeader Result" href="http://wiki.javascud.org/display/ww2cndoc/HttpHeader+Result">HttpHeader Result</a> - 用于控制特殊的HTTP行为
    <li><a title="JasperReports Result" href="http://wiki.javascud.org/display/ww2cndoc/JasperReports+Result">JasperReports Result</a> - 用于 <a title="JasperReports" href="http://wiki.javascud.org/display/ww2cndoc/JasperReports">JasperReports</a> 整合
    <li><a title="Redirect Result" href="http://wiki.javascud.org/display/ww2cndoc/Redirect+Result">Redirect Result</a> - 用于直接跳转到例外的URL
    <li><a title="Redirect Action Result" href="http://wiki.javascud.org/display/ww2cndoc/Redirect+Action+Result">Redirect Action Result</a> - 用于直接跳转到另外的action
    <li><a title="Stream Result" href="http://wiki.javascud.org/display/ww2cndoc/Stream+Result">Stream Result</a> - 用于向浏览器返回一个InputStream (一般用于文件下载)
    <li><a title="Velocity Result" href="http://wiki.javascud.org/display/ww2cndoc/Velocity+Result">Velocity Result</a> - 用于 <a title="Velocity" href="http://wiki.javascud.org/display/ww2cndoc/Velocity">Velocity</a> 整合
    <li><a title="XSL Result" href="http://wiki.javascud.org/display/ww2cndoc/XSL+Result">XSL Result</a> - 用于 XML/XSLT 整合
    <li><a title="PlainText Result" href="http://wiki.javascud.org/display/ww2cndoc/PlainText+Result">PlainText Result</a> - 用于显示某个页面的原始的文本 (例如 jsp, html 等) </li>
</ul>
<p>Result定义在xwork xml配置文件(xwork.xml)中的action标签里。如果location参数是result标签的唯一的参数，你可以这样简化:</p>
<div class="code">
<div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;action name=<span class="code-quote">"bar"</span> class=<span class="code-quote">"myPackage.barAction"</span>&gt;</span>
<span class="code-tag">&lt;result name=<span class="code-quote">"success"</span> type=<span class="code-quote">"dispatcher"</span>&gt;</span>
<span class="code-tag">&lt;param name=<span class="code-quote">"location"</span>&gt;</span>foo.jsp<span class="code-tag">&lt;/param&gt;</span>
<span class="code-tag">&lt;/result&gt;</span>
<span class="code-tag">&lt;/action&gt;</span></pre>
</div>
</div>
<p>或者</p>
<div class="code">
<div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;action name=<span class="code-quote">"bar"</span> class=<span class="code-quote">"myPackage.barAction"</span>&gt;</span>
<span class="code-tag">&lt;result name=<span class="code-quote">"success"</span> type=<span class="code-quote">"dispatcher"</span>&gt;</span>foo.jsp<span class="code-tag">&lt;/result&gt;</span>
<span class="code-tag">&lt;/action&gt;</span></pre>
</div>
</div>
<p>如果你扩展了webwork-default.xml, 那么默认的返回类型是"dispatcher". 同样,如果你没有指定result的名字,默认将是"success". 就是说你可以如下简化:</p>
<div class="code">
<div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;action name=<span class="code-quote">"bar"</span> class=<span class="code-quote">"myPackage.barAction"</span>&gt;</span>
<span class="code-tag">&lt;result&gt;</span>foo.jsp<span class="code-tag">&lt;/result&gt;</span>
<span class="code-tag">&lt;/action&gt;</span></pre>
</div>
</div>
<p><ins>注意</ins> : Parse属性允许的location参数作为表达式.例如你可以这样用:</p>
<div class="code">
<div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;result name=<span class="code-quote">"success"</span> type=<span class="code-quote">"redirect"</span>&gt;</span>/displayCart.action?userId=${userId}<span class="code-tag">&lt;/result&gt;</span></pre>
</div>
</div>
<p><ins>注意</ins> : 你也可以指定全局Result以便在多个action中使用. 当要为很多不同的action添加相同的结果是这样会节省时间. Result标签和全局Result的更多信息,参见<a title="Result Configuration" href="http://wiki.javascud.org/display/ww2cndoc/Result+Configuration">Result配置</a>部分.</p>
<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description rdf:about="http://wiki.javascud.org/display/ww2cndoc/Result+Types" dc:identifier="http://wiki.javascud.org/display/ww2cndoc/Result+Types" dc:title="Result Types" trackback:ping="http://wiki.javascud.org/rpc/trackback/2344" />
</rdf:RDF>
-->
<img src ="http://www.blogjava.net/wanghun723/aggbug/270414.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 14:53 <a href="http://www.blogjava.net/wanghun723/articles/270414.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strus 2的表单标签的使用</title><link>http://www.blogjava.net/wanghun723/articles/270408.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270408.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270408.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270408.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts 2为大家提供了不少常用的很酷的表单标志，简化了我们程序员的工作。不过，由于这些都是新标志，大家可能在使用上还存在不少疑问。本文将就朋友们的回复、留言或Email上的问题，分别对这些酷标志进行讲述。表单标志使用小技巧Struts 2的表单标志在输出（render）HTML时，使用了模板的概念，增加了复杂性（因为它不像Struts 1.x的表单标志，它通常都是一个标志对应HTML...&nbsp;&nbsp;<a href='http://www.blogjava.net/wanghun723/articles/270408.html'>阅读全文</a><img src ="http://www.blogjava.net/wanghun723/aggbug/270408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 14:39 <a href="http://www.blogjava.net/wanghun723/articles/270408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2在OGNL基础上的增强</title><link>http://www.blogjava.net/wanghun723/articles/270389.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270389.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270389.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270389.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270389.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; １、值栈(ValueStack)<br />
　　　　Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext)，并将值栈设为OGNL的根对象。<br />
　　　　我们知道，OGNL上下文中的根对象可以直接访问，不需要使用任何特殊的&#8220;标记&#8221;，而引用上下文中的其他对象则需要使用&#8220;#&#8221;来标记。由于值栈是上下文中的根对象，因此可以直接访问。那么对于值栈中的对象该如何访问呢？Struts2提供了一个特殊的OGNLPropertyAccessor，它可以自动查找栈内的所有对象(从栈顶到栈底)，直接找到一个具有你所查找的属性的对象。也就是说，对于值栈中的任何对象都可以直接访问，而不需要使用&#8220;#&#8221;。<br />
　　　　假设值栈中有两个对象：student和employee，两个对象都有name属性，student有学号属性number，而employee有薪水属性salary。employee先入栈，student后入栈，位于栈顶，那么对于表达式name,访问的就是student的name属性，因为student对象位于栈顶；表达式salary，访问的就是employee的salary属性。正如你所见，访问值栈中的对象属性或方法，无须指明对象，也不用&#8220;#&#8221;，就好像值栈中的对象都是OGNL上下文中的根对象一样。这就是Struts2在OGNL基础上做出的改进。<br />
　　２、[N]语法<br />
　　　　如上所述，如果想要访问employee的name属性，应该如何写表达式呢？我们可以使用[N].xxx(N是从0开始的整数)这样的语法来指定从哪一个位置开始向下查找对象的属性，表达式[1].name访问的就是employee对象的name属性。<br />
　　　　在使用[N].xxx语法时，要注意位置序号的含义，它并不是表示&#8220;获取栈中索引为N的对象&#8221;，而是截取从位置N开始的部分栈。<br />
　　３、top关键字<br />
　　　　top用于获取栈顶的对象，结合[N].xxx语法，我们就可以获取栈中任意位置的对象。<br />
　　　　如：[0].top,[1].top等<br />
　　４、访问静态成员<br />
　　　　除了使用标准的OGNL表达式访问静态字段和静态方法外，Struts2还允许你不指定完整的类名，而是通过&#8220;vs&#8221;前缀来调用保存在栈中的静态字段和静态方法。<br />
　　　　@vs@FOO_PROPERTY<br />
　　　　@vs@someMethod()<br />
　　　　@vs1@someMethod()<br />
　　　　vs表示ValueStack，如果只有vs，那么将使用栈顶对象的类；如果在vs后面跟上一个数字，那么将使用栈中指定位置处的对象类。<br />
　　５、值栈中的Action实例<br />
　　　　Struts2框架总是把Action实例放在栈顶。因为Action在值栈中，而值栈又是OGNL中的根，所以引用Action的属性可以省略&#8220;#&#8221;标记，这也是为什么我们在结果页面中可以直接访问Action的属性的原因。<br />
　　６、Struts2中的命名对象<br />
　　　　Struts2还提供了一些命名对象，这些对象没有保存在值栈中，而是保存在ActionContext中，因此访问这些对象需要使用&#8220;#&#8221;标记。这些命名对象都是Map类型。<br />
　　　parameters<br />
　　　　用于访问请求参数。如：#parameters['id']或#parameters.id，相当于调用了HttpServletRequest对象的getParameter()方法。<br />
　　　　注意，parameters本质上是一个使用HttpServletRequest对象中的请求参数构造的Map对象，一量对象被创建(在调用Action实例之前就已经创建好了)，它和HttpServletRequest对象就没有了任何关系。<br />
　　　request<br />
　　　　用于访问请求属性。如：#request['user']或#request.user，相当于调用了HttpServletRequest对象的getAttribute()方法。<br />
　　　session<br />
　　　　用于访问session属性。如：#session['user']或#session.user，相当于调用了HttpSession对象的getAttribute()方法。<br />
　　　application<br />
　　　　用于访问application属性。如：#application['user']或#application.user，相当于调用了ServletContext的getAttribute()方法。<br />
　　　attr<br />
　　　　如果PageContext可用，则访问PageContext，否则依次搜索request、session和application对象。
<img src ="http://www.blogjava.net/wanghun723/aggbug/270389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 13:18 <a href="http://www.blogjava.net/wanghun723/articles/270389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Struts2 jar包</title><link>http://www.blogjava.net/wanghun723/articles/270385.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270385.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270385.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270385.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270385.html</trackback:ping><description><![CDATA[<div class="blog_content">把spring和hibernate包加上后，还没写这2个的配置文件。连之前的struts2 <br />
的程序都跑不起来了，真实奇怪，总显示无法找到资源，也没有异常。 <br />
后来把spring和hibernate的jar包全部删除，立刻可以运行了。 <br />
<br />
struts 2应用只需要下列几个必须的jar： <br />
<ul>
    <li>commons-logging-1.0.4.jar
    <li>freemarker-2.3.8.jar
    <li>ognl-2.6.11.jar
    <li>struts2-core-2.0.11.jar
    <li>xwork-2.0.4.jar </li>
</ul>
<br />
这几个是必须的，别的都可以根据需要来加入，而且最好是包要跟程序对应起来。 <br />
看来整合的时候还是得按步骤来进行，不能一起弄。 </div>
<img src ="http://www.blogjava.net/wanghun723/aggbug/270385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 12:58 <a href="http://www.blogjava.net/wanghun723/articles/270385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2的action中获得request response session </title><link>http://www.blogjava.net/wanghun723/articles/270384.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270384.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270384.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270384.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270384.html</trackback:ping><description><![CDATA[&nbsp;在struts2中有两种方式可以得到这些对象
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、非IoC方式</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要获得上述对象，关键Struts 2中com.opensymphony.xwork2.ActionContext类。我们可以通过它的静态方法getContext()获取当前Action的上下文对象。有了这个对象我们想获得其他几个对象就好办了</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionContext ctx = ActionContext.getContext();&nbsp;&nbsp;&nbsp;&nbsp; Map session = ctx.getSession();&nbsp;&nbsp;&nbsp;&nbsp; 细心的朋友可以发现这里的session是个map对象在Struts2中底层的session都被封装成了Map类型我们可以直接操作这个map 进行对session的写入和读取操作而不用去直接操作HttpSession对象</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，org.apache.struts2.ServletActionContext作为辅助类（Helper Class），可以帮助您快捷地获得这几个对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request = ServletActionContext.getRequest();&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response = ServletActionContext.getResponse();&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession();&nbsp;&nbsp;&nbsp;&nbsp; 如果你只是想访问session的属性（Attribute），你也可以通过ActionContext.getContext().getSession()获取或添加session范围（Scoped）的对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、IoC方式（这种方式在tapestry中也是这样实现的）&nbsp;&nbsp;&nbsp;&nbsp; 要使用IoC方式，我们首先要告诉IoC容器（Container）想取得某个对象的意愿，通过实现相应的接口做到这点。具体实现<br />
</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98.45%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 676px; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.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;IoCServlet&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;SessionAware,<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_115_954_Open_Image" onclick="this.style.display='none'; Codehighlighter1_115_954_Open_Text.style.display='none'; Codehighlighter1_115_954_Closed_Image.style.display='inline'; Codehighlighter1_115_954_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_115_954_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_115_954_Closed_Text.style.display='none'; Codehighlighter1_115_954_Open_Image.style.display='inline'; Codehighlighter1_115_954_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletRequestAware,&nbsp;ServletResponseAware&nbsp;</span><span id="Codehighlighter1_115_954_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_115_954_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><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;message;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><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;Map&nbsp;att;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><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;HttpServletRequest&nbsp;request;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><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;HttpServletResponse&nbsp;response;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_265_286_Open_Image" onclick="this.style.display='none'; Codehighlighter1_265_286_Open_Text.style.display='none'; Codehighlighter1_265_286_Closed_Image.style.display='inline'; Codehighlighter1_265_286_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_265_286_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_265_286_Closed_Text.style.display='none'; Codehighlighter1_265_286_Open_Image.style.display='inline'; Codehighlighter1_265_286_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;getMessage()&nbsp;</span><span id="Codehighlighter1_265_286_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_265_286_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><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;message;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_321_342_Open_Image" onclick="this.style.display='none'; Codehighlighter1_321_342_Open_Text.style.display='none'; Codehighlighter1_321_342_Closed_Image.style.display='inline'; Codehighlighter1_321_342_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_321_342_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_321_342_Closed_Text.style.display='none'; Codehighlighter1_321_342_Open_Image.style.display='inline'; Codehighlighter1_321_342_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setSession(Map&nbsp;att)&nbsp;</span><span id="Codehighlighter1_321_342_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_321_342_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><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">.att&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;att;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img id="Codehighlighter1_403_432_Open_Image" onclick="this.style.display='none'; Codehighlighter1_403_432_Open_Text.style.display='none'; Codehighlighter1_403_432_Closed_Image.style.display='inline'; Codehighlighter1_403_432_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_403_432_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_403_432_Closed_Text.style.display='none'; Codehighlighter1_403_432_Open_Image.style.display='inline'; Codehighlighter1_403_432_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setServletRequest(HttpServletRequest&nbsp;request)&nbsp;</span><span id="Codehighlighter1_403_432_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_403_432_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><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">.request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request;<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img id="Codehighlighter1_496_527_Open_Image" onclick="this.style.display='none'; Codehighlighter1_496_527_Open_Text.style.display='none'; Codehighlighter1_496_527_Closed_Image.style.display='inline'; Codehighlighter1_496_527_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_496_527_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_496_527_Closed_Text.style.display='none'; Codehighlighter1_496_527_Open_Image.style.display='inline'; Codehighlighter1_496_527_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setServletResponse(HttpServletResponse&nbsp;response)&nbsp;</span><span id="Codehighlighter1_496_527_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_496_527_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><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">.response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;response;<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img id="Codehighlighter1_555_952_Open_Image" onclick="this.style.display='none'; Codehighlighter1_555_952_Open_Text.style.display='none'; Codehighlighter1_555_952_Closed_Image.style.display='inline'; Codehighlighter1_555_952_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_555_952_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_555_952_Closed_Text.style.display='none'; Codehighlighter1_555_952_Open_Image.style.display='inline'; Codehighlighter1_555_952_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_555_952_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_555_952_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;att.put(</span><span style="color: #000000">"</span><span style="color: #000000">msg</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;World&nbsp;from&nbsp;Session!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSession&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getSession();<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&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(</span><span style="color: #000000">"</span><span style="color: #000000">Message&nbsp;from&nbsp;request:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(request.getParameter(</span><span style="color: #000000">"</span><span style="color: #000000">msg</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response&nbsp;Buffer&nbsp;Size:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(response.getBufferSize());<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;ID:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(session.getId());<br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sb.toString();<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><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;SUCCESS;<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在struts.xml的action中配置拦截器&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="servletConfig"&gt;&lt;/interceptor-ref&gt;<br />
</p>
 <img src ="http://www.blogjava.net/wanghun723/aggbug/270384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 12:56 <a href="http://www.blogjava.net/wanghun723/articles/270384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2标签详解</title><link>http://www.blogjava.net/wanghun723/articles/270382.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 04:51:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270382.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270382.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270382.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要在jsp中使用Struts2的标志，先要指明标志的引入。通过jsp的代码的顶部加入以下的代码：&lt;%@taglib prefix="s" uri="/struts-tags" %&gt;If elseif&nbsp; else描述：执行基本的条件流转。参数：                                    名称    ...&nbsp;&nbsp;<a href='http://www.blogjava.net/wanghun723/articles/270382.html'>阅读全文</a><img src ="http://www.blogjava.net/wanghun723/aggbug/270382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 12:51 <a href="http://www.blogjava.net/wanghun723/articles/270382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2.0的标签库（简介） </title><link>http://www.blogjava.net/wanghun723/articles/270380.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 04:47:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270380.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270380.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270380.html</trackback:ping><description><![CDATA[<p>用过struts1.x的人都知道，标签库有html、bean、logic、tiles，<br />
而struts2.0里的标签却没有分类，只用在jsp头文件加上<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;<br />
就能使用struts2.0的标签库<br />
<br />
下面就介绍下每个标签的用法（有错请指正）：<br />
<br />
A：</p>
&lt;s:a href=""&gt;&lt;/s:a&gt;-----超链接，类似于html里的&lt;a&gt;&lt;/a&gt;<br />
&lt;s:action name=""&gt;&lt;/s:action&gt;-----执行一个view里面的一个action<br />
&lt;s:actionerror/&gt;-----如果action的errors有值那么显示出来<br />
&lt;s:actionmessage/&gt;-----如果action的message有值那么显示出来<br />
&lt;s:append&gt;&lt;/s:append&gt;-----添加一个值到list，类似于list.add();<br />
&lt;s:autocompleter&gt;&lt;/s:autocompleter&gt;-----自动完成&lt;s:combobox&gt;标签的内容，这个是ajax<br />
<br />
B：<br />
&lt;s:bean name=""&gt;&lt;/s:bean&gt;-----类似于struts1.x中的，JavaBean的值<br />
<br />
C：<br />
&lt;s:checkbox&gt;&lt;/s:checkbox&gt;-----复选框<br />
&lt;s:checkboxlist list=""&gt;&lt;/s:checkboxlist&gt;-----多选框<br />
&lt;s:combobox list=""&gt;&lt;/s:combobox&gt;-----下拉框<br />
&lt;s:component&gt;&lt;/s:component&gt;-----图像符号<br />
<br />
D：<br />
&lt;s:date/&gt;-----获取日期格式<br />
&lt;s:datetimepicker&gt;&lt;/s:datetimepicker&gt;-----日期输入框<br />
&lt;s:debug&gt;&lt;/s:debug&gt;-----显示错误信息<br />
&lt;s:div&gt;&lt;/s:div&gt;-----表示一个块，类似于html的&lt;div&gt;&lt;/div&gt;<br />
&lt;s:doubleselect list="" doubleName="" doubleList=""&gt;&lt;/s:doubleselect&gt;-----双下拉框<br />
<br />
E：<br />
&lt;s:if test=""&gt;&lt;/s:if&gt;<br />
&lt;s:elseif test=""&gt;&lt;/s:elseif&gt;<br />
&lt;s:else&gt;&lt;/s:else&gt;-----这3个标签一起使用，表示条件判断<br />
<br />
F：<br />
&lt;s:fielderror&gt;&lt;/s:fielderror&gt;-----显示文件错误信息<br />
&lt;s:file&gt;&lt;/s:file&gt;-----文件上传<br />
&lt;s:form action=""&gt;&lt;/s:form&gt;-----获取相应form的值<br />
<br />
G：<br />
&lt;s:generator separator="" val=""&gt;&lt;/s:generator&gt;----和&lt;s:iterator&gt;标签一起使用<br />
<br />
H：<br />
&lt;s:head/&gt;-----在&lt;head&gt;&lt;/head&gt;里使用，表示头文件结束<br />
&lt;s:hidden&gt;&lt;/s:hidden&gt;-----隐藏值<br />
<br />
I：<br />
&lt;s:i18n name=""&gt;&lt;/s:i18n&gt;-----加载资源包到值堆栈<br />
&lt;s:include value=""&gt;&lt;/s:include&gt;-----包含一个输出，servlet或jsp页面<br />
&lt;s:inputtransferselect list=""&gt;&lt;/s:inputtransferselect&gt;-----获取form的一个输入<br />
&lt;s:iterator&gt;&lt;/s:iterator&gt;-----用于遍历集合<br />
<br />
L：<br />
&lt;s:label&gt;&lt;/s:label&gt;-----只读的标签<br />
<br />
M：<br />
&lt;s:merge&gt;&lt;/s:merge&gt;-----合并遍历集合出来的值<br />
<br />
O：<br />
&lt;s:optgroup&gt;&lt;/s:optgroup&gt;-----获取标签组<br />
&lt;s:optiontransferselect doubleList="" list="" doubleName=""&gt;&lt;/s:optiontransferselect&gt;-----左右选择框<br />
<br />
P：<br />
&lt;s:param&gt;&lt;/s:param&gt;-----为其他标签提供参数<br />
&lt;s:password&gt;&lt;/s:password&gt;-----密码输入框<br />
&lt;s:property/&gt;-----得到'value'的属性<br />
&lt;s:push value=""&gt;&lt;/s:push&gt;-----value的值push到栈中,从而使property标签的能够获取value的属性<br />
<br />
R：<br />
<p>&lt;s:radio list=""&gt;&lt;/s:radio&gt;-----单选按钮<br />
&lt;s:reset&gt;&lt;/s:reset&gt;-----重置按钮</p>
<br />
S：<br />
&lt;s:select list=""&gt;&lt;/s:select&gt;-----单选框<br />
&lt;s:set name=""&gt;&lt;/s:set&gt;-----赋予变量一个特定范围内的值<br />
&lt;s:sort comparator=""&gt;&lt;/s:sort&gt;-----通过属性给list分类<br />
&lt;s:submit&gt;&lt;/s:submit&gt;-----提交按钮<br />
&lt;s:subset&gt;&lt;/s:subset&gt;-----为遍历集合输出子集<br />
<br />
T：<br />
&lt;s:tabbedPanel id=""&gt;&lt;/s:tabbedPanel&gt;-----表格框<br />
&lt;s:table&gt;&lt;/s:table&gt;-----表格<br />
&lt;s:text name=""&gt;&lt;/s:text&gt;-----I18n文本信息<br />
&lt;s:textarea&gt;&lt;/s:textarea&gt;-----文本域输入框<br />
&lt;s:textfield&gt;&lt;/s:textfield&gt;-----文本输入框<br />
&lt;s:token&gt;&lt;/s:token&gt;-----拦截器<br />
&lt;s:tree&gt;&lt;/s:tree&gt;-----树<br />
&lt;s:treenode label=""&gt;&lt;/s:treenode&gt;-----树的结构<br />
<br />
U：<br />
&lt;s:updownselect list=""&gt;&lt;/s:updownselect&gt;-----多选择框<br />
&lt;s:url&gt;&lt;/s:url&gt;-----创建url<br />
<img src ="http://www.blogjava.net/wanghun723/aggbug/270380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 12:47 <a href="http://www.blogjava.net/wanghun723/articles/270380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2中的OGNL </title><link>http://www.blogjava.net/wanghun723/articles/270379.html</link><dc:creator>L.J.</dc:creator><author>L.J.</author><pubDate>Wed, 13 May 2009 04:44:00 GMT</pubDate><guid>http://www.blogjava.net/wanghun723/articles/270379.html</guid><wfw:comment>http://www.blogjava.net/wanghun723/comments/270379.html</wfw:comment><comments>http://www.blogjava.net/wanghun723/articles/270379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wanghun723/comments/commentRss/270379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wanghun723/services/trackbacks/270379.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本人是一个EL（Expression Language，以下译为表达式语言）的支持者。因为我对&lt;% %&gt;写法极为反感，忘记了在那本书上看到的一句话——&#8220;使用标志（Tag）的一个目的就是避免在JSP页面中出现过多的&lt;%%&gt;的语句，使页面与后台代码分离。&#8221;表达式语言主要有以下几大好处：    避免(MyType) request.getAtt...&nbsp;&nbsp;<a href='http://www.blogjava.net/wanghun723/articles/270379.html'>阅读全文</a><img src ="http://www.blogjava.net/wanghun723/aggbug/270379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wanghun723/" target="_blank">L.J.</a> 2009-05-13 12:44 <a href="http://www.blogjava.net/wanghun723/articles/270379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>