﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Java Study Center</title><link>http://www.blogjava.net/xmllong/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 11:41:48 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 11:41:48 GMT</pubDate><ttl>60</ttl><item><title>如何Netbeans 6.0 设置为英文界面</title><link>http://www.blogjava.net/xmllong/articles/312085.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Fri, 05 Feb 2010 04:18:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/articles/312085.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/312085.html</wfw:comment><comments>http://www.blogjava.net/xmllong/articles/312085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/312085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/312085.html</trackback:ping><description><![CDATA[<p>问题：从官网下载的NetBeans不论是中文版还是英文版默认的操作界面都是中文，并且字体十分恶心。因为NetBeans是根据用户本地的操作系统来自动设置界面语言的，并且没有提供更改的功能。笔者更习惯于在英文环境下开发，故希望能把界面语言改为英文并使系统能正常支持中文。</p>
<p>目标效果：把界面语言改成英文并使系统正常支持中文。</p>
<p>解决办法：<br />
进入{NB_HOME}\etc，其中{NB_HOME}为NetBeans的安装路径。编辑netbeans.conf文件。将其中的# command line switchs:下面那行命令后添加如下启动参数：<br />
-J-Duser.language=zh -J-Duser.country=US</p>
<p>　　添加后的效果示例如下：<br />
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Duser.language=zh -J-Duser.country=US"</p>
<p>　　如果觉得显示的字体太小，可在以上参数后面再添加参数--fontsize {FONT_SIZE}，改变显示字体的大小。如--fontsize 13，<br />
添加后的效果示例如下：<br />
netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Duser.language=zh -J-Duser.country=US --fontsize 13"</p>
<p>　　关于前面几个参数的解释，可以参照NetBeans的guide：<a href="http://www.netbeans.org/kb/55/using-netbeans/configuring.html#pgfId-1158626">http://www.netbeans.org/kb/55/using-netbeans/configuring.html#pgfId-1158626</a></p>
<p>　　后面添加的几个参数-J-Duser.language=zh -J-Duser.country=US是调用Java的本身系统属性，设置语言为zh（中文），国家为US（美国）。<br />
<br />
　　国家设为US，是为了使NetBeans的界面显示为英文，而语言设为zh，是为了使NetBeans能够支持中文。若只需要英文，则可以把language设为en。</p>
<p>　　不过，在调用file browser的时候会发现左边一系列windows特性的中文按钮都回变成乱码。<br />
　　在NetBeans的tools\options\fonts&amp;colors\syntax\下的language选项设置all languages的default的字体为一个能够支持中文的字体，如：Microsoft YaHei<br />
没有此字体的可以到<a href="http://xiazai.zol.com.cn/detail/26/253442.shtml#down">http://xiazai.zol.com.cn/detail/26/253442.shtml#down</a>下载</p>
<p>　　需要特别指出的是，编辑器中字体可以通过修改配置解决。但是Output字体无法通过配置进行修改。但我们可以通过修改JDK的默认配置达到目的。不过，这样做会导致所有的Java GUI程序都受影响。具体方法参见如下：</p>
<p>　　默认情况下，NetBeans编辑器和Output字体很难看。编辑器中字体可以通过修改配置解决。但是Output字体无法通过配置进行修改。可以通过修改JDK的默认配置达到目的，不过这样所有的Java GUI程序都会受影响。下面以JDK6 update 2为例说明。</p>
<p>　　在JDK安装目录/jre/lib下有一个名为fontconfig.properties.src，先备份。配置文件默认在GBK和GB18030时，等宽字（monospace）优先使用了SImSUN（即宋体），可以改成优先使用Courier New(文件中定义为alphabetic)。。。</p>
<p>找到 sequence.monospaced.GBK=chinese-ms936,alphabetic,dingbats,symbol<br />
换成 sequence.monospaced.GBK=alphabetic,chinese-ms936,dingbats,symbol</p>
<p>找到 sequence.monospaced.GB18030=chinese-gb18030,alphabetic,dingbats,symbol<br />
换成 sequence.monospaced.GB18030=alphabetic,chinese-gb18030,dingbats,symbol</p>
<p>　　如果觉得字体偏小，可以在启动netbeans 添加参数fontsize。如netbeans -fontsize 12</p>
<p>　　也可以将它写进netbeans配置文件文件&lt;netbeans安装位置&gt;/etc/netbeans.conf的启动参数中。</p>
<img src ="http://www.blogjava.net/xmllong/aggbug/312085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2010-02-05 12:18 <a href="http://www.blogjava.net/xmllong/articles/312085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何让netBeans启动快起来</title><link>http://www.blogjava.net/xmllong/articles/312079.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Fri, 05 Feb 2010 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/articles/312079.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/312079.html</wfw:comment><comments>http://www.blogjava.net/xmllong/articles/312079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/312079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/312079.html</trackback:ping><description><![CDATA[<p>我已经不只一次听到有人抱怨netbeans的启动速度慢的问题了，那么好吧让我们把netbeans的速度来提一个档次。请把下面代码粘贴到&lt;netbeans安装目录&gt;/ect/netbeans.conf&nbsp;&nbsp; <br />
&nbsp; -J-Xverify:none&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; -J-Xms32m&nbsp;&nbsp; <br />
&nbsp; -J-Xmx128m&nbsp;&nbsp; <br />
&nbsp; -J-XX:PermSize=40m&nbsp;&nbsp; <br />
&nbsp; 通过这些设置不仅可以让netbeans的启动速度慢加快10秒左右，还可以让256M的计算机流畅的跑netbeans4.1,5.0; <br />
<br />
解释如下：<br />
-J-Xverify:none&nbsp;&nbsp; ——关闭Java字节码校验&nbsp;&nbsp; <br />
-J-Xms32m&nbsp;&nbsp;&nbsp;&nbsp; ——Java虚拟机初始Heap大小为32M&nbsp;&nbsp; <br />
-J-Xmx128m&nbsp;&nbsp; ——指定Java虚拟机能使用的最大Heap大小为128M，注意，不要设置得跟机器的物理内存大小相近，否则&#8230;&#8230;呵呵！&nbsp;&nbsp; <br />
-J-XX:PermSize=40m——设置&#8220;持久内存&#8221;大小为40M，在这个内存区域中保持IDE的各种类，该设置告诉JVM将需要多少内存，并且能大大减少垃圾内存回收事件的产生。使用SunOne&nbsp;&nbsp; Studio或者其他含更多模块的IDE的用户需要把该参数设置更高．<br />
<br />
另外：&nbsp;</p>
<p>在netbeans中打"."来等待代码提示好象很慢，事实上这是一个假象，这个假象足以让我们认为netbeans的代码提示速度不如别的ide，其实netbeans比你我想象的要快的多，坦白的说我以前也被这中假象所迷惑！&nbsp;&nbsp; <br />
方法：在netbeans中--&gt;tools--&gt;options--&gt;Advanced&nbsp;&nbsp; options--&gt;Editor&nbsp;&nbsp; Settings--&gt;java&nbsp;&nbsp; Editor--&gt;Deley&nbsp;&nbsp; of&nbsp;&nbsp; Completion&nbsp;&nbsp; Window&nbsp;&nbsp; auto&nbsp;&nbsp; pop--&gt;把250该为0；好了现在netbeans的代码提示就像飞一样快了呵呵，如你还想更快的话把Auto&nbsp;&nbsp; pop&nbsp;&nbsp; javadoc&nbsp;&nbsp; Window的选择取消就好了。同样的你可以设置别的Editor。 </p>
<img src ="http://www.blogjava.net/xmllong/aggbug/312079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2010-02-05 11:40 <a href="http://www.blogjava.net/xmllong/articles/312079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转:谨以此文纪念逝去的SUN </title><link>http://www.blogjava.net/xmllong/archive/2010/01/22/310536.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Fri, 22 Jan 2010 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/archive/2010/01/22/310536.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/310536.html</wfw:comment><comments>http://www.blogjava.net/xmllong/archive/2010/01/22/310536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/310536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/310536.html</trackback:ping><description><![CDATA[<img height="547" alt="" src="http://www.blogjava.net/images/blogjava_net/sxyx2008/SunRIPsmall.jpg" width="700" border="0" /><br />
谨以此文纪念逝去的SUN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
此图转载自Java之父james gosling的blog&nbsp; <a href="http://blogs.sun.com/jag/entry/so_long_old_friend">http://blogs.sun.com/jag/entry/so_long_old_friend</a><br />
只希望若干年后大家还记得世界上最经典的编程语言出自---SUN 
<img src ="http://www.blogjava.net/xmllong/aggbug/310536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2010-01-22 16:04 <a href="http://www.blogjava.net/xmllong/archive/2010/01/22/310536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>commons-fileupload组件上传文件及相关问题 </title><link>http://www.blogjava.net/xmllong/archive/2008/09/18/229694.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Thu, 18 Sep 2008 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/archive/2008/09/18/229694.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/229694.html</wfw:comment><comments>http://www.blogjava.net/xmllong/archive/2008/09/18/229694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/229694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/229694.html</trackback:ping><description><![CDATA[<p>今天我用commons-fileupload组件上传文件，代码是正确的，而且我把commons-fileupload-1.2.1.jar,commons-io-1.4.jar也导入到项目目项中，但总是出现这样那样的错误，让我花了不少的时间,所以我把相关发出来,对有此类的问题的朋友有所帮助<br />
如:<br />
<span style="color: #ff0000">java.lang.RuntimeException: Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest (jakarta) - [unknown location] <br />
</span>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
在网上查了很多资料，后来总结了一下，如果你是在struts2项目中用commons-fileupload组件的话，那就应</p>
<p>该把修改web.xml，把原来的<br />
&lt;filter-mapping&gt;<br />
&nbsp; &lt;filter-name&gt;struts&lt;/filter-name&gt;<br />
&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;<br />
改为<br />
&lt;filter-mapping&gt;<br />
&nbsp; &lt;filter-name&gt;struts&lt;/filter-name&gt;<br />
&nbsp; &lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;<br />
而上传页面调用时直接用文件名调用（如upload.jsp）。struts2只处理 *.action 的请求。<br />
或者<br />
&lt;filter&gt; <br />
&lt;filter-name&gt;struts2&lt;/filter-name&gt; <br />
&lt;filter-class&gt; <br />
org.apache.struts2.dispatcher.FilterDispatcher <br />
&lt;/filter-class&gt; <br />
&lt;/filter&gt; </p>
<p>&lt;filter-mapping&gt; <br />
&lt;filter-name&gt;struts2&lt;/filter-name&gt; <br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />
&lt;/filter-mapping&gt; <br />
去掉也行</p>
<p>若是<span style="color: #ff0000">java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException</span>错误<br />
那就有可能是导包的问题，若用的是右击项目，选择属性，然后导入相应的包，就有可能出显此类的错误，解决方法是：把commons-fileupload-1.2.1.jar,commons-io-1.4.jar复制到到WEB-INF下的lib目录中，虽然效果是一样，但不会出错了<br />
<br />
附:<br />
upload.jsp</p>
<p>&lt;%@ page language="java" import="java.util.*" pageEncoding="GB2312"%&gt;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;My JSP 'upload.jsp' starting page&lt;/title&gt;<br />
&lt;/head&gt;&nbsp;&nbsp;<br />
&nbsp; &lt;body&gt;<br />
&nbsp; &lt;form action="upload" method="post" enctype="multipart/form-data"&gt; <br />
&nbsp; &nbsp;用户名：&lt;input type="text" name="username"&gt;&lt;br&gt;<br />
&nbsp; &nbsp;密码：&lt;input type="password" name="password"&gt;&lt;br&gt;<br />
&nbsp; &nbsp;文件1:&lt;input type="file" name="file1"&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp; 文件2:&lt;input type="file" name="file2"&gt;&lt;br&gt;&nbsp;<br />
&nbsp; &nbsp;&lt;input type="submit" value="提交"&gt;&lt;br&gt;<br />
&nbsp; &lt;/form&gt;<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
UploadServlet.java</p>
<p>package com.test.servlet1;</p>
<p>import java.io.File;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
import java.io.InputStream;<br />
import java.io.OutputStream;<br />
import java.util.List;</p>
<p>import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServlet;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p>import org.apache.commons.fileupload.FileItem;<br />
import org.apache.commons.fileupload.FileUploadException;<br />
import org.apache.commons.fileupload.disk.DiskFileItemFactory;<br />
import org.apache.commons.fileupload.servlet.ServletFileUpload;</p>
<p>public class UploadServlet extends HttpServlet {</p>
<p>&nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp;&nbsp;throws ServletException, IOException {<br />
&nbsp;&nbsp;DiskFileItemFactory factory = new DiskFileItemFactory();<br />
&nbsp;&nbsp;String path = request.getRealPath("/upload");<br />
&nbsp;&nbsp;// 设置传轮输文件的大小，当小于1024时，把文件存在兹盘上<br />
&nbsp;&nbsp;factory.setRepository(new File(path));<br />
&nbsp;&nbsp;factory.setSizeThreshold(1024 * 1024);<br />
&nbsp;&nbsp;ServletFileUpload upload = new ServletFileUpload(factory);<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;List&lt;FileItem&gt; list = upload.parseRequest(request);<br />
&nbsp;&nbsp;&nbsp;for(FileItem item : list){<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(item.isFormField()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name = item.getFieldName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String value&nbsp; = item.getString("GB2312");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(name, value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name = item.getFieldName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String value = item.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int start = value.lastIndexOf("\\");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String fileName = value.substring(start+1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(name, fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//item.write(new File(path,fileName));&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream os = new FileOutputStream(new File(path,fileName));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream is = item.getInputStream();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 将文件is写到os里<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[] buffer = new byte[400]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int lenght = 0 ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((lenght = is.read(buffer ))&gt;0){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.write(buffer,0,lenght);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} catch (FileUploadException e) {<br />
&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;System.out.println("文件上传出错"+e.getMessage());<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;request.getRequestDispatcher("upload/result.jsp").forward(request, response);<br />
&nbsp;}<br />
}<br />
result.jsp</p>
<p>&lt;%@ page language="java" import="java.util.*" pageEncoding="GB2312"%&gt;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp; &lt;head&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;My JSP 'result.jsp' starting page&lt;/title&gt;<br />
&nbsp; &lt;/head&gt;&nbsp; <br />
&nbsp; &lt;body&gt;<br />
&nbsp;用户名:${requestScope.username }<br />
&nbsp;密码:${requestScope.password }<br />
&nbsp;文件1:${requestScope.file1 }<br />
&nbsp;文件2:${requestScope.file2 }<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/xmllong/aggbug/229694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2008-09-18 14:57 <a href="http://www.blogjava.net/xmllong/archive/2008/09/18/229694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>铁手的《Struts in Action中文版》完整版  带源代码</title><link>http://www.blogjava.net/xmllong/archive/2008/09/17/229459.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Wed, 17 Sep 2008 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/archive/2008/09/17/229459.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/229459.html</wfw:comment><comments>http://www.blogjava.net/xmllong/archive/2008/09/17/229459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/229459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/229459.html</trackback:ping><description><![CDATA[<p><a href="http://www.namipan.com/d/Struts%20In%20Action%20%e4%b8%ad%e6%96%87%e7%89%88.rar/59ba9feb9ac3952c621ffde4131ba01f1cbb98f15d76a800">http://www.namipan.com/d/Struts%20In%20Action%20%e4%b8%ad%e6%96%87%e7%89%88.rar/59ba9feb9ac3952c621ffde4131ba01f1cbb98f15d76a800</a><br />
<br />
分卷压缩后，终于上传完了。<br />
下载地址分别是：<br />
<a href="http://www.blogjava.net/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part01.rar">Part1</a>&nbsp;<br />
<a href="http://www.blogjava.net/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part02.rar">Part2</a><br />
<a href="http://www.blogjava.net/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part03.rar">Part3</a><br />
<a href="http://www.blogjava.net/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part04.rar">Part4</a><br />
<a href="http://www.blogjava.net/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part05.rar">Part5</a><br />
<a href="http://www.blogjava.net/Files/SteelHand/Struts%20in%20Action%20%E4%B8%AD%E6%96%87%E7%89%88.part06.rar">Part6</a><br />
<br />
http://www.blogjava.net/SteelHand/archive/2009/01/05/15329.html</p>
<img src ="http://www.blogjava.net/xmllong/aggbug/229459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2008-09-17 16:12 <a href="http://www.blogjava.net/xmllong/archive/2008/09/17/229459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2中实现文件下载（修正中文问题） </title><link>http://www.blogjava.net/xmllong/archive/2008/09/17/229458.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Wed, 17 Sep 2008 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/archive/2008/09/17/229458.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/229458.html</wfw:comment><comments>http://www.blogjava.net/xmllong/archive/2008/09/17/229458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/229458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/229458.html</trackback:ping><description><![CDATA[<p>在BlogJava上已经有一位作者阐述了文件上传的问题，地址是<a href="http://www.blogjava.net/max/archive/2007/03/21/105124.html">在Struts 2中实现文件上传</a>，因此我就不再讨论那个话题了。我今天简单介绍一下Struts 2的文件下载问题。
<p>我们的项目名为 <em>struts2hello</em>，所使用的开发环境是MyEclipse 6，当然其实用哪个IDE都是一样的，只要把类库放进去就行了，文件下载不需要再加入任何额外的包。读者可以参考文档：<a href="http://beansoft.java-cn.org/myeclipse_doc_cn/struts2_demo.pdf">http://beansoft.java-cn.org/myeclipse_doc_cn/struts2_demo.pdf</a>，来了解怎么下载和配置基本的Struts 2开发环境。
<p>为了便于大家对比，我把完整的struts.xml的配置信息列出来：
<div>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">&lt;?</span><span style="color: #800000">xml</span> <span style="color: #ff0000">version</span><span style="color: #0000ff">="1.0"</span> <span style="color: #ff0000">encoding</span><span style="color: #0000ff">="UTF-8"</span> ?<span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;!</span><span style="color: #800000">DOCTYPE</span> <span style="color: #ff0000">struts</span> <span style="color: #ff0000">PUBLIC</span>
<span style="color: #0000ff">"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"</span>
<span style="color: #0000ff">"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">package</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="default"</span> <span style="color: #ff0000">extends</span><span style="color: #0000ff">="struts-default"</span>  <span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- 在这里添加Action定义 --&gt;</span>
<span style="color: #008000">&lt;!-- 简单文件下载 --&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">action</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="download"</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">="example.FileDownloadAction"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span> <span style="color: #ff0000">type</span><span style="color: #0000ff">="stream"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="contentType"</span><span style="color: #0000ff">&gt;</span>text/plain<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="inputName"</span><span style="color: #0000ff">&gt;</span>inputStream<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="contentDisposition"</span><span style="color: #0000ff">&gt;</span>attachment;filename="struts2中文.txt"<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="bufferSize"</span><span style="color: #0000ff">&gt;</span>4096<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- 文件下载，支持中文附件名 --&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">action</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="download2"</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">="example.FileDownloadAction2"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- 初始文件名 --&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="fileName"</span><span style="color: #0000ff">&gt;</span>Struts中文附件.txt<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span> <span style="color: #ff0000">type</span><span style="color: #0000ff">="stream"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="contentType"</span><span style="color: #0000ff">&gt;</span>text/plain<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="inputName"</span><span style="color: #0000ff">&gt;</span>inputStream<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- 使用经过转码的文件名作为下载文件名，downloadFileName属性</span>
<span style="color: #008000">                对应action类中的方法 getDownloadFileName() --&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="contentDisposition"</span><span style="color: #0000ff">&gt;</span>attachment;filename="${downloadFileName}"<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="bufferSize"</span><span style="color: #0000ff">&gt;</span>4096<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- 下载现有文件 --&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">action</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="download3"</span> <span style="color: #ff0000">class</span><span style="color: #0000ff">="example.FileDownloadAction3"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="inputPath"</span><span style="color: #0000ff">&gt;</span>/download/系统说明.doc<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- 初始文件名 --&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="fileName"</span><span style="color: #0000ff">&gt;</span>系统说明.doc<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span> <span style="color: #ff0000">type</span><span style="color: #0000ff">="stream"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="contentType"</span><span style="color: #0000ff">&gt;</span>application/octet-stream;charset=ISO8859-1<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="inputName"</span><span style="color: #0000ff">&gt;</span>inputStream<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #008000">&lt;!-- 使用经过转码的文件名作为下载文件名，downloadFileName属性</span>
<span style="color: #008000">                对应action类中的方法 getDownloadFileName() --&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="contentDisposition"</span><span style="color: #0000ff">&gt;</span>attachment;filename="${downloadFileName}"<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">param</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="bufferSize"</span><span style="color: #0000ff">&gt;</span>4096<span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span></pre>
</div>
<p>&nbsp;
<p>Struts 2中对文件下载做了直接的支持，相比起自己辛辛苦苦的设置种种HTTP头来说，现在实现文件下载无疑要简便的多。说起文件下载，最直接的方式恐怕是直接写一个超链接，让地址等于被下载的文件，例如：<em>&lt;a href=&#8221;file1.zip&#8221;&gt;</em><em>下载file1.zip&lt;/a&gt;</em>，之后用户在浏览器里面点击这个链接，就可以进行下载了。但是它有一些缺陷，例如如果地址是一个图片，那么浏览器会直接打开它，而不是显示保存文件的对话框。再比如如果文件名是中文的，它会显示一堆URL编码过的文件名例如%3457...。而假设你企图这样下载文件：<a href="http://localhost:8080/struts2hello/download/系统说明.doc">http://localhost:8080/struts2hello/download/系统说明.doc</a>，Tomcat会告诉你一个文件找不到的404错误：<em>HTTP Status 404 - /struts2hello/download/&#207;&#181;&#205;&#179;&#203;&#181;&#195;&#247;.doc</em>。虽然目前还没发现直接配置Struts 2来正确的下载中文名字的附件，不过好在作者对JSP中的文件下载比较了解，因此我们另有办法解决这个问题。另外一个最大的用途，就是动态的生成并下载文件了，例如动态的下载生成的EXCEL，PDF，验证码图片等等。本节内容就依次讨论简单的下载文件代码，下载中文附件，最后介绍如何下载已经存在的文件。
<p>先说文件下载，编写一个普通的Action就可以了，只需要提供一个返回InputStream流的方法，该输入流代表了被下载文件的入口，这个方法用来给被下载的数据提供输入流，意思是从这个流读出来，再写到浏览器那边供下载。这个方法需要由开发人员自己来编写，只需要返回值为InputStream即可。在我们的例子中方法的签名是：<em>public InputStream getInputStream() throws Exception</em>，当然它也可以是别的名字，例如<em>getDownloadFile()</em>。好了，现在我们所写的这个进行文件下载的Action类<strong>example.FileDownloadAction</strong> 的源代码清单如下：
<p><strong>package</strong> example;
<p><strong>import</strong> java.io.ByteArrayInputStream;
<p><strong>import</strong> java.io.InputStream;
<p><strong>import</strong> com.opensymphony.xwork2.Action;
<p><strong>public</strong> <strong>class</strong> FileDownloadAction <strong>implements</strong> Action {
<p><strong>public</strong> InputStream getInputStream() <strong>throws</strong> Exception {
<p><strong>return</strong> <strong>new</strong> ByteArrayInputStream("Struts 2 下载示例".getBytes());
<p>}
<p><strong>public</strong> String execute() <strong>throws</strong> Exception {
<p><strong>return</strong> <em>SUCCESS</em>;
<p>}
<p>}
<p>。注意这里唯一特殊的方法就是<em>getInputStream()</em>，在这个方法里面我们使用了一个数组输入流来从字符串转换成的数组作为数据的来源进行读取。也许方法体中使用这样的实现代码：
<p><em>return new java.io.FileInputStream(&#8220;c:\\test.txt&#8221;);//</em><em>从系统磁盘文件读取数据</em>
<p>这样会更直观一些。
<p>文件下载的第二步，乃是在<strong>struts.xml</strong>中对action进行配置，其代码清单如下所示：
<p>&lt;!-- 简单文件下载 --&gt;
<p>&lt;action name="download" class="example.FileDownloadAction"&gt;
<p>&lt;result name="success" type="<strong><em>stream</em></strong>"&gt;
<p>&lt;param name="contentType"&gt;text/plain&lt;/param&gt;
<p>&lt;param name="inputName"&gt;inputStream&lt;/param&gt;
<p>&lt;param name="contentDisposition"&gt;attachment;filename="struts2.txt"&lt;/param&gt;
<p>&lt;param name="bufferSize"&gt;4096&lt;/param&gt;
<p>&lt;/result&gt;
<p>&lt;/action&gt;
<p>。这个action特殊的地方在于result的类型是一个流（<em>stream</em>），配置stream类型的结果时，因为无需指定实际的显示的物理资源，所以无需指定<em>location</em>属性，只需要指定<em>inputName</em>属性，该属性指向被下载文件的来源，对应着Action类中的某个属性，类型为InputStream。下面则列出了和下载有关的一些参数列表：
<p><strong>参数</strong>
<p><strong>说明</strong>
<p><strong>contentType</strong>
<p>内容类型，和互联网MIME标准中的规定类型一致，例如text/plain代表纯文本，text/xml表示XML，image/gif代表GIF图片，image/jpeg代表JPG图片
<p><strong>inputName</strong>
<p>下载文件的来源流，对应着action类中某个类型为Inputstream的属性名，例如取值为<em>inputStream</em>的属性需要编写getInputStream()方法
<p><strong>contentDisposition</strong>
<p>文件下载的处理方式，包括内联(inline)和附件(attachment)两种方式，而附件方式会弹出文件保存对话框，否则浏览器会尝试直接显示文件。取值为：
<p><em>attachment;filename="struts2.txt"</em>，表示文件下载的时候保存的名字应为<em>struts2.txt</em>。如果直接写<em>filename="struts2.txt"</em>，那么默认情况是代表<em>inline</em>，浏览器会尝试自动打开它，等价于这样的写法：<em>inline; filename="struts2.txt"</em>
<p><strong>bufferSize</strong>
<p>下载缓冲区的大小
<p>。在这里面，<strong>contentType</strong>属性和<strong>contentDisposition</strong>分别对应着HTTP响应中的头<em>Content-Type</em>和<em>Content-disposition</em>头。好，我们先来看看这个例子，发布运行项目后键入测试地址：<a href="http://localhost:8080/struts2hello/download.action">http://localhost:8080/struts2hello/download.action</a>，将会看到浏览器弹出一个文件保存对话框，如图12.12所示。
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image002_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="133" alt="clip_image002" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image002_thumb.jpg" width="244" border="0" /></a>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image004_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="153" alt="clip_image004" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image004_thumb.jpg" width="244" border="0" /></a>
<p>图12.12 文件下载对话框（IE 7和Firefox 3）
<p>如果此时使用某些工具来探测浏览器返回的HTTP头，将会看到下列内容：
<p>HTTP/1.1 200 OK
<p>Server: Apache-Coyote/1.1
<p>Content-disposition: attachment;filename="struts2.txt"
<p>Content-Type: text/plain
<p>Transfer-Encoding: chunked
<p>Date: Sun, 02 Mar 2008 02:58:25 GMT
<p>。所以用来下载的action配置中，只有两个是和浏览器有关的：<em>contentType</em>和<em>contentDisposition</em>。关于<em>contentType</em>的取值，如果是未知的文件类型，或者说出现了浏览器不能打开的文件，例如<em>.bean</em>文件，或者说这个action是用来做动态文件下载的，事先并不知道未来的文件类型是什么，那么我们可以把它的值设置成为：<em>application/octet-stream;charset=ISO8859-1</em> ，注意一定要加入<em>charset</em>，否则某些时候会导致下载的文件出错；有人说这时也可以设置成为<em>application/x-download</em>，根据笔者的实践，这个头也能正常工作，然而个别时候会出现浏览器无法识别的问题。而<em>contentDisposition</em>，如果其取值是<em>filename="struts2.txt"</em>，或者是<em>inline; filename="struts2.txt"</em>，运行后你可以看到浏览器直接显示了文件的内容：
<p><em>Struts 2 </em><em>下载示例</em>，而不再弹出对话框提示用户保存文件到硬盘上。所以读者如果想确保文件是被下载而不是被打开，务必使用格式<strong><em>attachment</em></strong><em>;filename="struts2.txt"</em>，不要丢了<em>attachment;</em>这个类型信息。
<p>至此，关于文件下载的技术内容，已经告一段落。然而做中文系统，不可避免的要解决中文附件的下载问题。关于这个内容，也无权威的资料可查，我们只能用实践中得到的解决方案来处理。也许有读者以为将<strong>filename</strong>属性设置为<em>filename=&#8221;struts2</em><em>中文.txt&#8221;</em>就能解决问题了，好，就来试试，把contentDisposition修改成：
<p><em>&lt;param name="contentDisposition"&gt;attachment;filename="struts2</em><em>中文.txt"&lt;/param&gt;</em>
<p>。再次键入地址进行测试，看看显示的结果，如图12.13所示。唉，真是完全不给面子！IE压根就不能显示出来文件名，草草敷衍了download_action了事。Firefox稍好点，还出来了一个对话框，但是很显然，那个显示的<em>struts2--txt</em>绝对不是我们日思夜想的<em>struts2</em><em>中文.txt</em>。怎么办？解决方法是有，那就是用ISO8859-1编码来显示这个中文字符，可以阅读<u>12.8</u><u>参考资料</u>一节中的<em>JSP </em><em>文件下载的相对完整代码(</em><em>解决中文问题和Weblogic</em><em>报错</em>)这篇文章，可以这样认为，所有的文件下载代码都是基于同样的纯Servlet的方式来进行的。如果是Java代码，我们可以这样做：
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image006_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="101" alt="clip_image006" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image006_thumb.jpg" width="244" border="0" /></a>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image008_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="94" alt="clip_image008" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image008_thumb.jpg" width="244" border="0" /></a>
<p>图12.13 IE和Firefox下的中文文件下载对话框
<p><em>String downFileName = new String(&#8220;struts2</em><em>中文.txt&#8221;.getBytes(), "ISO8859-1");</em>
<p>然后把生成的结果字符串放到XML文件中就行了，然而它的输出类似于<em>struts2??.txt</em>，是无法直接写道我们的XML配置文件中的。所以，我们想到的的办法，就是在Action类中写一个方法来做转码，使它成为某个属性，所以要以get开头。然后，再用<u>12.3.8 </u><u>给Action</u><u>注入参数（param</u><u>）值</u>一节的内容，将文件名以正常的方式设置为action类的某个属性，最后呢，再利用一个小小的param参数取值中的伎俩：<em>${</em><em>属性名}</em>，它可以直接从action类中动态获取某个属性值。好了，现在让我们来看看第二个文件下载类<strong>FileDownloadAction2</strong>的代码：
<p><strong>package</strong> example;
<p><strong>import</strong> java.io.ByteArrayInputStream;
<p><strong>import</strong> java.io.InputStream;
<p><strong>import</strong> java.io.UnsupportedEncodingException;
<p><strong>import</strong> com.opensymphony.xwork2.Action;
<p><strong>public</strong> <strong>class</strong> FileDownloadAction2 <strong>implements</strong> Action {
<p><strong>private</strong> String fileName;// 初始的通过param指定的文件名属性
<p><strong>public</strong> InputStream getInputStream() <strong>throws</strong> Exception {
<p><strong>return</strong> <strong>new</strong> ByteArrayInputStream("Struts 2 下载示例".getBytes());
<p>}
<p><strong>public</strong> String execute() <strong>throws</strong> Exception {
<p><strong>return</strong> <em>SUCCESS</em>;
<p>}
<p><strong>public</strong> <strong>void</strong> setFileName(String fileName) {
<p><strong>this</strong>.fileName = fileName;
<p>}
<p>/** 提供转换编码后的供下载用的文件名 */
<p><strong>public</strong> String getDownloadFileName() {
<p>String downFileName = fileName;
<p><strong>try</strong> {
<p>downFileName = <strong>new</strong> String(downFileName.getBytes(), "ISO8859-1");
<p>} <strong>catch</strong> (UnsupportedEncodingException e) {
<p>e.printStackTrace();
<p>}
<p><strong>return</strong> downFileName;
<p>}
<p>}
<p>。这个类有两个属性，第一个是<em>fileName</em>，它是需要被指定的下载文件名；第二个则是动态的仅仅由<em>getDownloadFileName()</em>这个方法定义的属性<em>downloadFileName</em>，它的值随着fileName而动态变动，仅仅是把它转换成了ISO8859方式的西欧字符集。
<p>接下来就是如何配置这个action了，这是关键的地方所在，现在配置一个新的action，名为<em>download2</em>，其源代码如下：
<p>&lt;!-- 文件下载，支持中文附件名 --&gt;
<p>&lt;action name="download2" class="example.FileDownloadAction2"&gt;
<p>&lt;!-- 初始文件名 --&gt;
<p>&lt;param name="fileName"&gt;Struts中文附件.txt&lt;/param&gt;
<p>&lt;result name="success" type="stream"&gt;
<p>&lt;param name="contentType"&gt;text/plain&lt;/param&gt;
<p>&lt;param name="inputName"&gt;inputStream&lt;/param&gt;
<p>&lt;!-- 使用经过转码的文件名作为下载文件名，downloadFileName属性
<p>对应action类中的方法 getDownloadFileName() --&gt;
<p>&lt;param name="contentDisposition"&gt;attachment;filename="${downloadFileName}"&lt;/param&gt;
<p>&lt;param name="bufferSize"&gt;4096&lt;/param&gt;
<p>&lt;/result&gt;
<p>&lt;/action&gt;
<p>。其中特殊的代码就是<em>${downloadFileName}</em>，它的效果相当于运行的时候将action对象的属性的取值动态的填充在<em>${}</em>中间的部分，我们可以认为它等价于<em>＋</em><em>action.</em> <em>getDownloadFileName()</em>。
<p>好了，现在让我们重新发布然后运行这个项目，键入地址：
<p><a href="http://localhost:8080/struts2hello/download2.action">http://localhost:8080/struts2hello/download2.action</a> 进行访问，可以看到运行结果完全正确，如图12.14所示。
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image010_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="118" alt="clip_image010" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image010_thumb.jpg" width="244" border="0" /></a>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image012_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="90" alt="clip_image012" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/Struts2_D44C/clip_image012_thumb.jpg" width="244" border="0" /></a>
<p>图 12.14 正确显示了文件下载名的对话框（IE和Firefox）
<p>在本节的最后部分，我们来讨论一下如何下载已经存在于当前Web应用目录下的已经存在的文件。一般的网站可能会把要下载的文件放在某个固定的目录下，例如<em>WebRoot/download</em>，在这个子目录下，我们放了一个名为<em>系统说明</em><em>.doc</em>的文件，希望最后我们的action能够正确的下载这个文件。要检验下载是否成功非常简单，文件内容仅仅是粗体的<strong>系统说明书</strong>这五个字，而word文件坏一个字节的话都是打不开的，所以下载后再用word打开即可检验是否成功。现在我们创建第三个文件下载的Action类，名为<strong>example. FileDownloadAction3</strong>，其源代码清单如下所示：
<p><strong>package</strong> example;
<p><strong>import</strong> java.io.InputStream;
<p><strong>import</strong> java.io.UnsupportedEncodingException;
<p><strong>import</strong> org.apache.struts2.ServletActionContext;
<p><strong>import</strong> com.opensymphony.xwork2.Action;
<p><strong>public</strong> <strong>class</strong> FileDownloadAction3 <strong>implements</strong> Action {
<p><strong>private</strong> String fileName;// 初始的通过param指定的文件名属性
<p><strong><em></em></strong><strong><em>private</em></strong><strong><em> String </em></strong><strong><em>inputPath</em></strong><strong><em>;</em></strong><strong><em>// </em></strong><strong><em>指定要被下载的文件路径</em></strong><strong><em></em></strong>
<p><strong><em></em></strong>
<p><strong><em></em></strong><strong><em>public</em></strong><strong><em> InputStream getInputStream() </em></strong><strong><em>throws</em></strong><strong><em> Exception {</em></strong><strong><em></em></strong>
<p><strong><em></em></strong><strong><em>// </em></strong><strong><em>通过</em></strong><strong><em> ServletContext</em></strong><strong><em>，也就是</em></strong><strong><em>application </em></strong><strong><em>来读取数据</em></strong><strong><em></em></strong>
<p><strong><em></em></strong><strong><em>return</em></strong><strong><em> ServletActionContext.getServletContext().getResourceAsStream(</em></strong><strong><em>inputPath</em></strong><strong><em>);</em></strong><strong><em></em></strong>
<p><strong><em>}</em></strong><strong><em></em></strong>
<p><strong>public</strong> String execute() <strong>throws</strong> Exception {
<p><strong>return</strong> <em>SUCCESS</em>;
<p>}
<p><strong><em></em></strong><strong><em>public</em></strong><strong><em> </em></strong><strong><em>void</em></strong><strong><em> setInputPath(String value) {</em></strong><strong><em></em></strong>
<p><strong><em></em></strong><strong><em>inputPath</em></strong><strong><em> = value;</em></strong><strong><em></em></strong>
<p><strong><em>}</em></strong><strong><em></em></strong>
<p><strong>public</strong> <strong>void</strong> setFileName(String fileName) {
<p><strong>this</strong>.fileName = fileName;
<p>}
<p>/** 提供转换编码后的供下载用的文件名 */
<p><strong>public</strong> String getDownloadFileName() {
<p>String downFileName = fileName;
<p><strong>try</strong> {
<p>downFileName = <strong>new</strong> String(downFileName.getBytes(), "ISO8859-1");
<p>} <strong>catch</strong> (UnsupportedEncodingException e) {
<p>e.printStackTrace();
<p>}
<p><strong>return</strong> downFileName;
<p>}
<p>}<strong></strong>
<p>。代码中被改动的部分已经用粗斜体的方式显示出来了。首先是新加入了一个名为<em>inputPath</em>的属性，用来制定被下载文件的路径。接着就是<em>ServletActionContext.getServletContext()</em>这段代码，它的意义我们将在<u>12.6</u>节详细讨论，在这里读者只需要知道它获取了当前Servlet容器的<em>ServletContext</em>，也就是大家常说的jsp中的<strong>application</strong>对象，然后用它来打开文件的输入流。
<p>接着要做的就是配置action，它和刚刚配置过的download2的内容差不多，只是多了一个被下载的资源的路径属性。现在我们在struts.xml中加入这个新的action定义：
<p>&lt;!-- 下载现有文件 --&gt;
<p>&lt;action name="download3" class="example.FileDownloadAction3"&gt;
<p><strong><em>&lt;</em></strong><strong><em>param </em></strong><strong><em>name</em></strong><strong><em>=</em></strong><strong><em>"inputPath"</em></strong><strong><em>&gt;</em></strong><strong><em>/download/</em></strong><strong><em>系统说明</em></strong><strong><em>.doc</em></strong><strong><em>&lt;/</em></strong><strong><em>param</em></strong><strong><em>&gt;</em></strong><strong><em></em></strong>
<p>&lt;!-- 初始文件名 --&gt;
<p>&lt;param name="fileName"&gt;系统说明.doc&lt;/param&gt;
<p>&lt;result name="success" type="stream"&gt;
<p>&lt;param name="contentType"&gt;<strong><em>application/octet-stream;charset=ISO8859-1</em></strong>&lt;/param&gt;
<p>&lt;param name="inputName"&gt;inputStream&lt;/param&gt;
<p>&lt;!-- 使用经过转码的文件名作为下载文件名，downloadFileName属性
<p>对应action类中的方法 getDownloadFileName() --&gt;
<p>&lt;param name="contentDisposition"&gt;attachment;filename="${downloadFileName}"&lt;/param&gt;
<p>&lt;param name="bufferSize"&gt;4096&lt;/param&gt;
<p>&lt;/result&gt;
<p>&lt;/action&gt;
<p>。查看粗斜体的部分，首先就是自定了被下载文件的路径，inputPath，接着就是修改了contentType为二进制方式。最后重新发布项目并运行，键入地址进行访问：<a href="http://localhost:8080/struts2hello/download3.action">http://localhost:8080/struts2hello/download3.action</a> 。很好，可以看到文件下载对话框，保存<em>系统说明</em><em>.doc</em>后再用word打开它，内容正确。
<p><strong>注意：</strong>而这种文件下载方式却是存在安全隐患的，因为访问者如果精通Struts 2的话，它可能使用这样的带有表单参数的地址来访问：<a href="http://localhost:8080/struts2hello/download3.action?inputPath=/WEB-INF/web.xml">http://localhost:8080/struts2hello/download3.action?inputPath=/WEB-INF/web.xml</a>，这样的结果就是下载后的文件内容是您系统里面的web.xml的文件的源代码，甚至还可以用这种方式来下载任何其它JSP文件的源码。这对系统安全是个很大的威胁。作为一种变通的方法，读者最好是从数据库中进行路径配置，然后把Action类中的设置inputPath的方法统统去掉，简言之就是删除这个方法定义：
<p><em>public void setInputPath(String value) {</em>
<p><em>inputPath = value;</em>
<p><em>}</em>
<p>。而实际情况则应该成为 <em>download3.action?fileid=1</em> 类似于这样的形式来进行。或者呢，读者可以在execute()方法中进行路径检查，如果发现有访问不属于download下面文件的代码，就一律拒绝，不给他们返回文件内容。例如，我们可以把刚才类中的execute()方法加以改进，成为这样：
<p><strong>public</strong> String execute() <strong>throws</strong> Exception {
<p>// 文件下载目录路径
<p>String downloadDir = ServletActionContext.<em>getServletContext</em>().getRealPath("/download");
<p>// 文件下载路径
<p>String downloadFile = ServletActionContext.<em>getServletContext</em>().getRealPath(inputPath);
<p>java.io.File file = <strong>new</strong> java.io.File(downloadFile);
<p>downloadFile = file.getCanonicalPath();// 真实文件路径,去掉里面的..等信息
<p>// 发现企图下载不在 /download 下的文件, 就显示空内容
<p><strong>if</strong>(!downloadFile.startsWith(downloadDir)) {
<p><strong>return</strong> <strong>null</strong>;
<p>}
<p><strong>return</strong> <em>SUCCESS</em>;
<p>}
<p>。这时候如果访问者再企图下载web.xml的内容，它只能得到一个空白页，现在访问者只能下载位于<em>/download</em>目录下的文件。 </p>
<img src ="http://www.blogjava.net/xmllong/aggbug/229458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2008-09-17 16:10 <a href="http://www.blogjava.net/xmllong/archive/2008/09/17/229458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse 6 实战开发讲解视频入门 13 Struts 2 入门开发 </title><link>http://www.blogjava.net/xmllong/archive/2008/09/17/229457.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Wed, 17 Sep 2008 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/archive/2008/09/17/229457.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/229457.html</wfw:comment><comments>http://www.blogjava.net/xmllong/archive/2008/09/17/229457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/229457.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/229457.html</trackback:ping><description><![CDATA[<p>最近忙着过年,身体也不太舒服，所以视频的事情很久没弄了。很早就有人想看看Struts 2 的视频, 今天我就做了个入门的Struts 2 视频，因为嗓子不舒服，所以声音比较沉闷，大家其实可以直接下载例子代码就行了，下载后可以直接运行，不需要额外下载其它框架。</p>
<p>视频内容包括三个例子的实际开发：</p>
<p><a href="http://beansoft-aty280:8080/HelloWorld.action">HelloWorld</a> －－继承自ActionSupport的Action<br />
<a href="http://beansoft-aty280:8080/HelloPOJO.action">HelloPOJO</a>－－ POJO 模式的 Action 开发<br />
<a href="http://beansoft-aty280:8080/Login.jsp">登录</a>－－简单登录，表单验证和form标签
<p>并包含了如何下载，配置Struts 2 开发环境，通过视频你可以了解到用 Struts 2 进行开发其实是非常容易上手的，总的来说它是和JSF类似的开发模式，而Spring Web MVC 则只能和Struts 1 处于一样的开发模式上!</p>
<p><font color="#ff0000"><strong>友情提示</strong><strong>: </strong><strong>下载微软网盘文件时关闭下载工具</strong><strong>,&nbsp; </strong><strong>否则你将得到错误的文件</strong><strong>, </strong><strong>双击</strong><strong> EXE </strong><strong>会出来</strong><strong> DOS </strong><strong>窗口</strong><strong>. </strong><strong>正确操作是点击文件名后能看到显示下载链接和文件大小等信息</strong><strong>.</strong></font>
<p>代码: <a href="http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/13_struts2hello.zip">http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/13_struts2hello.zip</a> 3.25 MB
<p>视频:&nbsp; <a title="http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/MyEclipse6_13.exe" href="http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/MyEclipse6_13.exe">http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/MyEclipse6Videos/MyEclipse6_13.exe</a>&nbsp; 49分14秒 15.2 MB </p>
<p>视频截图:</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/f4a8ed1cf85c_DC2C/MyEclipse6_13_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="462" alt="MyEclipse6_13" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/f4a8ed1cf85c_DC2C/MyEclipse6_13_thumb.png" width="640" border="0" /></a></p>
<img src ="http://www.blogjava.net/xmllong/aggbug/229457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2008-09-17 16:10 <a href="http://www.blogjava.net/xmllong/archive/2008/09/17/229457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts1.1 入门(台湾版1-29章)</title><link>http://www.blogjava.net/xmllong/archive/2008/09/17/229452.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Wed, 17 Sep 2008 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/archive/2008/09/17/229452.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/229452.html</wfw:comment><comments>http://www.blogjava.net/xmllong/archive/2008/09/17/229452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/229452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/229452.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;struts1.1入门(台湾版1-29章)http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=1958入门 01 - Struts 在线资源Struts的在线资源不少，随便Google都会有一堆，但多数为英文，中文资源比较零散，这边收集几个比较完整的Struts资源网站。　S...&nbsp;&nbsp;<a href='http://www.blogjava.net/xmllong/archive/2008/09/17/229452.html'>阅读全文</a><img src ="http://www.blogjava.net/xmllong/aggbug/229452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2008-09-17 15:51 <a href="http://www.blogjava.net/xmllong/archive/2008/09/17/229452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Structs2基本配置入门 </title><link>http://www.blogjava.net/xmllong/archive/2008/09/17/229451.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Wed, 17 Sep 2008 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/archive/2008/09/17/229451.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/229451.html</wfw:comment><comments>http://www.blogjava.net/xmllong/archive/2008/09/17/229451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/229451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/229451.html</trackback:ping><description><![CDATA[&nbsp;
<table style="width: 100%" cellspacing="3" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体">Structs2</span><span style="font-size: 12pt; font-family: 宋体">基本配置入门</span></p>
            <div style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体">
            <hr align="center" width="70%" size="2" />
            </span></div>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p style="text-align: center" align="center"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;</span><span style="font-size: 12pt; font-family: 宋体">来源:javaresearch.org &nbsp;作者:liudayong</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; padding-bottom: 2.25pt; padding-top: 2.25pt" valign="top">
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">1</span><span style="font-size: 12pt; font-family: 宋体">、为Structs应用配置Web.xml文件<br />
            <br />
            第一步:配置ActionServlet</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;servlet&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&lt;servlet-name&gt;action&lt;/servlet-name&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&lt;servlet-class&gt;org.appache. structs.ActionServlet&lt;/servlet-class&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/servlet&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;servlet-mapping&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;action&lt;/servlet-name&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&lt;uri-pattern&gt;*.do&lt;/url-pattern&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/servlet-mapping&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">注意:不管应用中包含多少个子应用,都只需配置一个ActionServlet,因为ActionServlet支持多线程,目前的Structs框架只允许在应用中配置一个ActionServlet。 <br />
            <br />
            第二步：初始化参数对Servlet的运行环境进行初始化配置。</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;servlet&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;&nbsp;action&lt;/servlet-name&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;&nbsp;org.appache. structs.ActionServlet&nbsp;&lt;/servlet-class&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&lt;init-param&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;param-name&gt;config&lt;/param-name&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;param-value&gt;/WEB-INF/structs-config.xml&lt;/param-value&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/init-param&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&lt;/servlet&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">表2-1. Struts1.1中用到的初始化参数</span></p>
            <div align="center">
            <table cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">参数名</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">含义/默认值</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">config</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">以相对路径的方式指明 Struts应用程序 的配置文件位置。 如不设置，则默认值为/WEB-INF /struts-config.xml。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">config/sub1</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">以相对路径的方式指明子应用程序 的配置文件位置，一般来说， 很少用到子应用程序， 在此不多描述。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">debug</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">设置Servlet的debug级别， 控制日志记录的详细程度。 默认为0， 记录相对最少的日志信息。</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">detail</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">设置Digester的debug级别， Digester是Struts框架所使用的 用来解析xml配置文件的一个框架， 通过该设置，可以查看不同详细 等级的解析日志。默认为0， 记录相对最少的日志信息。</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            <br />
            </span><span style="font-size: 12pt; font-family: 宋体">第三步：配置欢迎清单 <br />
            <br />
            当客户访问Web应用时，如果仅仅给出Web应用的Root URL，没用指定具体的文件名，Web容器会自动调用Web应用的欢迎文件。</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;welcome-file-list&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;welcome-file&gt;welcome.jsp&lt;/welcome-file&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;&nbsp; &nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&lt;/welcome-fiel-list&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">说明： <br />
            <br />
            可以包含多个子元素，首先查找第一个文件。 <br />
            <br />
            由于元素中不能配置Servlet映射，因此不能直接把Structs的Action作为欢迎文件，可以采用一种变通的方法来实现在欢迎文件中调用Structs Action。 <br />
            <br />
            首先，在Structs配置文件中为被调用的Action创建一个全局的转发项，例如：</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;global-forwards&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;name=&#8221;welcome&#8221;&nbsp;&nbsp;path=&#8221;HelloWord.do&#8221;/&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/global-forwords&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">创建一个welcome.jsp的文件，最后在web.xml文件中把welcome.jsp文件配置为欢迎文件，代码如下：</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;welcome-file-list&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;welcome-file&gt;welcome.jsp&lt;/welcome-file&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/welcome-file-list&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">第四步：配置错误处理</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;error-page&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&lt;error-code&gt;404&lt;/error-code&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&lt;location&gt;/commom/404.jsp&lt;/location&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/error-page&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;error-page&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&lt;error-code&gt;505&lt;/error-code&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&lt;location&gt;/commom/505.jsp&lt;/location&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/error-page&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">也可以为Web容器捕获的Java异常配置,需要设置子元素，它用于指定Java异常类。Web容器可能捕获如下异常：RuntimeException或Error ServletException或它的子类，IOException或它的子类：</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;error-page&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&lt;exception-type&gt;java.io.IOException&lt;/exception-type&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&lt;location&gt;/common/system_ioerror.jsp&lt;/location&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/error-page&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp; &nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">第五步：配置Structs标签库 <br />
            <br />
            使用客户化的标签库，要配置它们：</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;taglib&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tag-uri&gt;/WEB-INF/structs-html.tld&lt;/tag-uri&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-location&gt;&nbsp;/WEB-INF/structs-html.tld&lt;/taglib-location&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&lt;/taglib&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp; &nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">用于指定标签库的相对或者绝对URI地址，Web应用根据这一URI来访问标签库。 <br />
            <br />
            指定标签描述文件在文件资源系统中的物理位置。 <br />
            <br />
            2、Structs配置文件<br />
            <br />
            Structs框架在启动时会读入其配置文件，根据它来创建和配置各种Structs组件。<br />
            <br />
            （1）元素<br />
            <br />
            元素是Structs配置文件的根元素，元素有8个子元素。它的DTD定义如下：</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;!ELEMENT&nbsp;structs-config &nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">(data-sources?,formbean?, &nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">global-exeception?,global-forward?, &nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">action-mapping,controller?, &nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">message-resources*,plug-in*)&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">在Struts配置中，必须按照以上的DTD指定的先后顺序来配置元素的各个子元素，如果颠倒了这些元素的配置文件中的位置，在Structs应用启动时会生成错误。 <br />
            <br />
            元素 <br />
            <br />
            元素包含零个、一个或者多个子元素，用于配置特定的数据源，它可以包含多个子元素，用于设置数据源的各种属性。 <br />
            <br />
            配置了数据源后，就可以在Action类中访问数据源，在org.apache.structs.action.Action类中定义了getDataSource(HttpRequrst)方法，它用于获取数据源对象的引用。</span></p>
            <div align="center">
            <table style="width: 300pt" cellspacing="0" cellpadding="0" width="400" border="1">
                <tbody>
                    <tr>
                        <td style="padding-right: 1.5pt; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; padding-top: 1.5pt">
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">DataSource&nbsp;dataSource;</span></p>
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp; Connection&nbsp;connection;</span></p>
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataSource =getDataSource(request);</span></p>
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection=dataSource.getConnection();</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            <br />
            </span><span style="font-size: 12pt; font-family: 宋体">也可以在配置文件中声明多个数据源，此时需要为每一个数据源分配唯一的key值，通过改值来标识特定的数据源。 <br />
            <br />
            （2） 元素 <br />
            <br />
            元素用来配置多个ActionForm Bean， 包含多个子元素，,每个包含多个属性，ClassName , name,type：</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;form-beans&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-bean&nbsp;name="HelloForm"&nbsp; &nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="hello.HelloForm"/&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;/form-beans&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp; &nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">注意：配置动态ActionForm Bean，还必须配置 元素的 元素。</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;form-beans&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-bean&nbsp;name="HelloForm"&nbsp; &nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="hello.HelloForm"/&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-bean&nbsp;name="userForm"&nbsp;type="org.apache.structs.action.DynaAction"&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;from-property&nbsp;name="firstname"&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="java.lang.String"/&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-property&nbsp;name="secondname"&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="java.lang.String"&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-property&nbsp;name="age"&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type="java.Integer"&nbsp;initial="18"&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form-beans&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            (3)</span><span style="font-size: 12pt; font-family: 宋体">元素 <br />
            <br />
            用于配置异常处理，元素可以包含零个或者多个元素。 <br />
            <br />
            元素用来设置java异常和异常处理类org.apache.structs.action,Exception Hander之间的映射。 <br />
            <br />
            (4)元素 <br />
            <br />
            元素用来声明全局的转发关系，有零个或多个元素组成。元素用于把一个逻辑映射到特定的URL </span></p>
            <div align="center">
            <table cellpadding="0" border="1">
                <tbody>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">属性</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">描 述</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">className</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">和元素对应的配置类， 默认为org.apache.structs. action.ActionForWard</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">name</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">转发路径的逻辑名， 此项时必须的</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">path</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">指定或者重定向的URI。 此项时必须的， 必须以&#8221;/&#8221;开头</span></p>
                        </td>
                    </tr>
                    <tr>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">redirect</span></p>
                        </td>
                        <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
                        <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">此项是true，表示是执行重定向的操作， 此项是false时， 表示请求转发。</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;global-forwards&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;forward&nbsp;name="forward1"&nbsp;path="/Action1.do"/&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;forward&nbsp;name="forward2"&nbsp;&nbsp;path="/Action2.do"/&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp;&lt;/global-forwards&gt;&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&nbsp; &nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            <br />
            </span><span style="font-size: 12pt; font-family: 宋体">如果jsp1.jsp把请求转发给Action1,可以使用以下代码：</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;html:link&nbsp;forward=&#8221;forward1&#8221;&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">或者</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;logic:forward&nbsp;name=&#8221;forward1&#8221;&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            </span><span style="font-size: 12pt; font-family: 宋体">如果Action1的execute（）方法把请求转发给JSP2.jsp，可以使用一下代码：</span></p>
            <div align="center">
            <table style="width: 300pt" cellspacing="0" cellpadding="0" width="400" border="1">
                <tbody>
                    <tr>
                        <td style="padding-right: 1.5pt; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; padding-top: 1.5pt">
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">return(mapping.findForward(&#8220;forward2&#8221;))</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            <br />
            (5)</span><span style="font-size: 12pt; font-family: 宋体">元素 <br />
            <br />
            元素包含零个或者多个元素。元素描述了从特定的请求路径到相应的Action类的映射。 <br />
            <br />
            (6)元素 <br />
            <br />
            元素用于配置ActionServlet。 <br />
            <br />
            (7)&lt; message-resources&gt;元素 <br />
            <br />
            元素用于配置Resource Bundle，Resource Budle用于存放本地化消息文件。 <br />
            <br />
            Structs标签 <br />
            <br />
            HTML标签 <br />
            <br />
            标签名 描述 <br />
            <br />
            base 包装HTML的base元素 <br />
            <br />
            button 包装HTML的 button类型的input元素 <br />
            <br />
            cancel 包装HTML cancel 按钮 <br />
            <br />
            checkbox 包装HTML checkbox 类型的输入域 <br />
            <br />
            errors 有条件地显示一些error消息，显示ActionErrors信息 <br />
            <br />
            file 包装HTML文件上传输入域 <br />
            <br />
            form 定义HTML form 元素 <br />
            <br />
            frame 包装HTML frame 元素 <br />
            <br />
            hidden 包装HTML hidden 输入域 <br />
            <br />
            html 包装 HTML中的 html 元素 <br />
            <br />
            image 包装 "image"类型的输入域 <br />
            <br />
            img 包装HTML的 img 元素 <br />
            <br />
            javascript 包装根据ValidatorPlugIn提供的校验规则所提供的javascript校验脚本 <br />
            <br />
            link 包装超链接 <br />
            <br />
            messages 有条件地显示一些提示信息，显示ActionMessages信息 <br />
            <br />
            multibox 包装多选输入框 <br />
            <br />
            option 包装一个选择输入框 <br />
            <br />
            options 包装一批选择输入框 <br />
            <br />
            optionsCollection 包装一批选择输入框集 <br />
            <br />
            password 包装密文输入框 <br />
            <br />
            radio 包装单选输入框 <br />
            <br />
            reset 包装&#8220;重置&#8221;功能的按钮 <br />
            <br />
            rewrite 包装一个URL <br />
            <br />
            select 包装一个选择输入框 <br />
            <br />
            submit 包装一个提交按钮 <br />
            <br />
            text 包装一个文本输入框 <br />
            <br />
            textarea 包装一个备注输入框 <br />
            <br />
            ActionForm <br />
            <br />
            ActionForm 的要求 <br />
            <br />
            创建一个ActionForm 并不困难，但是你的类必须符合一些要求： <br />
            <br />
            ActionForm 必须扩展自org.apache.struts.ActionForm。基类ActionForm 是不能实 <br />
            <br />
            例化的。 <br />
            <br />
            ActionForm 必须为每个应该从请求中收集的HTML控件定义一个公共属性。 <br />
            <br />
            (Struts 1.0 要求每个属性都要mutator 和accessor 。Struts 1.1 则没有如此严格) <br />
            <br />
            ActionForm还可能要符合一些可选的要求: <br />
            <br />
            如果你要求ActionForm 在传递属性到Action之前校验它们，你就必须实现validate <br />
            <br />
            方法，如果想在组装前初始化属性，必须实现reset , 它在ActionForm 组装前被调用。 <br />
            <br />
            动态ActionForm <br />
            <br />
            ActionForm 作为类型转换器 <br />
            <br />
            ActionForm的一个强制点是应该使用String 和boolean属性。实际上，这意味着属性 <br />
            <br />
            必须得从一种转换到另一种类型。大部分应用也需要一些属性，比如电话号码或者数量，以一种格式化的方式出现。 <br />
            <br />
            核心Java 包提供一些工具来做这种事情，但是要清楚地将他们集成到应用中仍然是一个挑战。 <br />
            <br />
            Struts开发人员经常在ActionForm中包含helper方法，来进行类型转换。helper 方法 <br />
            <br />
            可以有很多种实现方式。 <br />
            <br />
            5.2.6 ActionForm 作为防火墙 <br />
            <br />
            当请求提交时，ActionServlet 使用一个自动组装机制来从请求参数中设置请求的 <br />
            <br />
            ActionForm属性。这让你可以通过控制哪个ActionForm 属性被暴露来控制哪个请求参数 <br />
            <br />
            是可接受的。这也意味着如果你的ActionForm 的粗心设计你可能失去控制哪个参数可以接受的能力。ActionForm一定不能包含看起来像是一个JavaBean属性，但不能从HTTP请求设置的属性方法。 <br />
            <br />
            5.3.4 ActionForm 可以嵌套其它bean <br />
            <br />
            因为Struts标签扩展和自动组装机制都支持点号语法来从ActionForm访问其它bean。这是一个方便的方式，可以通过ActionForm来组装存在的bean。在JSP页面,你可以象这样引用一个嵌套的bean：</span></p>
            <p style="text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体">xml </span><span style="font-size: 12pt; font-family: 宋体">代码</span></p>
            <ol type="1">
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">&lt;html:text&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">propety="values.telephoneText"&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">size="14"&nbsp;&nbsp; </span></li>
                <li style="text-align: left; tab-stops: list 36.0pt"><span style="font-size: 12pt; font-family: 宋体">maxlength="14"/&gt;&nbsp;&nbsp; </span></li>
            </ol>
            <p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            5.7.2 </span><span style="font-size: 12pt; font-family: 宋体">分发（Dispatch ） <br />
            <br />
            Struts 开发人员通常使用同一个Action处理相关的操作。一个通常做法来选择操作是在 <br />
            <br />
            HTML表单中使用隐藏属性。BaseForm 的dispatch 属性也可用作这个目的：</span></p>
            <div align="center">
            <table style="width: 300pt" cellspacing="0" cellpadding="0" width="400" border="1">
                <tbody>
                    <tr>
                        <td style="padding-right: 1.5pt; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; padding-top: 1.5pt">
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">public void setDispatch(String dispatch);</span></p>
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">public String getDispatch();</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            <p style="margin-bottom: 12pt; text-align: left" align="left"><span style="font-size: 12pt; font-family: 宋体"><br />
            <br />
            Struts </span><span style="font-size: 12pt; font-family: 宋体">配置提供连个级别嵌套的ActionForward: <br />
            <br />
            Global （全局） ActionForward对整个应用中的所有Action 对象均有效； <br />
            <br />
            Local （局部） ActionForward 则在ActionMapping 元素中定义。 <br />
            <br />
            仅对那些在这个ActionMapping中调用的Action对象有效。从Action 对象内部来看，forward 通常像这样来选择：</span></p>
            <div align="center">
            <table style="width: 300pt" cellspacing="0" cellpadding="0" width="400" border="1">
                <tbody>
                    <tr>
                        <td style="padding-right: 1.5pt; padding-left: 1.5pt; background: #e6e6e6; padding-bottom: 1.5pt; padding-top: 1.5pt">
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">ActionForward forward = </span></p>
                        <p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">mapping.findForward("continue");</span></p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/xmllong/aggbug/229451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2008-09-17 15:49 <a href="http://www.blogjava.net/xmllong/archive/2008/09/17/229451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决 Struts2中表单中输入中文的问题 </title><link>http://www.blogjava.net/xmllong/archive/2008/09/17/229449.html</link><dc:creator>绿茶＿郑州</dc:creator><author>绿茶＿郑州</author><pubDate>Wed, 17 Sep 2008 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/xmllong/archive/2008/09/17/229449.html</guid><wfw:comment>http://www.blogjava.net/xmllong/comments/229449.html</wfw:comment><comments>http://www.blogjava.net/xmllong/archive/2008/09/17/229449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xmllong/comments/commentRss/229449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xmllong/services/trackbacks/229449.html</trackback:ping><description><![CDATA[在Struts2中我建立了一个简单的表单,也就是大家熟知的"Say hello". <br />
在s:textfield中输入英文然后提交没问题,但是输入中文后提交,就变成乱码. <br />
在struts1.x中可以通过自定义的filter来进行设置转换.但在struts2中如何设置呢? <br />
期待能者解答.. <br />
<br />
已经解决了. <br />
<p>原来把JSP中的字符编码设为UTF-8,再把整个工程的编码设为UTF-8就可以了. <br />
在tomcat5.5中已经好了.不知道其它的服务器怎么样. <br />
<p>还以为需要在拦截器或filter中设置呢. </p>
<br />
<br />
<div class="mb cb fontsize2 " id="body">
<div id="inbdy">
<p><a name="msg_aee1755d491ef4f8"></a>做项目都应该加上字符编码的filter： <br />
例如：（下面是用到spring里面的filter） <br />
&lt;!-- 用于解决请求编码乱码问题 --&gt; <br />
&nbsp; &nbsp; &lt;filter&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;filter-class&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.springframework.web.filter.CharacterEncodingFilter <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/filter-class&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;init-param&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param-value&gt;UTF-8&lt;/param-value&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/init-param&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;init-param&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param-name&gt;forceEncoding&lt;/param-name&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param-value&gt;true&lt;/param-value&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/init-param&gt; <br />
&nbsp; &nbsp; &lt;/filter&gt; <br />
&nbsp; &nbsp; &lt;filter-mapping&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />
&nbsp; &nbsp; &lt;/filter-mapping&gt; <br />
</p>
</div>
<br style="font-size: 8px" clear="all" />
</div>
<img src ="http://www.blogjava.net/xmllong/aggbug/229449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xmllong/" target="_blank">绿茶＿郑州</a> 2008-09-17 15:47 <a href="http://www.blogjava.net/xmllong/archive/2008/09/17/229449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>