<转载> struts2文件上传

本文详细介绍使用Struts2框架实现文件上传功能的方法,包括页面设计、上传逻辑处理及配置等关键步骤。

技术要点 
本节代码详细说明文件上传功能的开发流程,介绍知识点如下:

    文件上传页面和显示上传成功页面代码内容。 
    UploadAction类中实现上传功能方法和上传文件属性介绍。 
    struts.xml中UploadAction配置,以及字符编码、文件临时存放路径配置。 
    上传后所处路径和最终上传成功后效果展示。


演示代码 
上传文件页面,这里笔者定义的是多个文件上传。

Java代码   收藏代码
  1. <!---------------------文件名:upload.jsp----------------->  
  2. <%@taglib prefix="s" uri="/struts-tags"%>  
  3. <html>  
  4.     <head>  
  5.         <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  6.         <title>上传文件</title>  
  7.     </head>  
  8.     <body>  
  9.     <!-- 上传文件表单定义 -->  
  10.     <s:form action="upload" method="post" enctype="multipart/form-data">  
  11.         <tr>  
  12.     <!-- 上传文件标签定义 -->  
  13.     <td>上传文件:<s:file name="file"></s:file></td>  
  14.     </tr>  
  15.     <tr>  
  16.     <td>再次上传文件:<s:file name="file"></s:file></td>  
  17.     </tr>  
  18.     <tr>  
  19.     <td align="left"><s:submit name="submit" value="提交"></s:submit></td>  
  20.     </tr>  
  21.     </s:form>  
  22.     </body>  
  23. </html>  


上传文件成功后结果页面

Java代码   收藏代码
  1. <!-------------------文件名:result.jsp ----------------->  
  2. <%@taglib prefix="s" uri="/struts-tags"%>  
  3. <html>  
  4.     <head>  
  5.         <meta http-equiv="Content-Type" content="text/html; charset=gb2312">  
  6.         <title>上传结果</title>  
  7.     </head>  
  8.     <body>  
  9.         上传文件:  
  10.         <!-- 显示上传成功文件名 -->  
  11.         <s:property value="fileFileName" />  
  12.     </body>  
  13. </html>  


UploadAction类代码

Java代码   收藏代码
  1. <!------------------文件名:UploadAction.java ------------------>  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.util.List;  
  10.   
  11. import org.apache.struts2.ServletActionContext;  
  12. import com.opensymphony.xwork2.ActionSupport;  
  13.   
  14. //文件上传Action  
  15. public class UploadAction extends ActionSupport {  
  16.     //上传文件存放路径  
  17.     private final static String UPLOADDIR = "/upload";  
  18.     //上传文件集合  
  19.     private List<File> file;  
  20.     //上传文件名集合  
  21.     private List<String> fileFileName;  
  22.     //上传文件内容类型集合  
  23.     private List<String> fileContentType;  
  24.   
  25.     public List<File> getFile() {  
  26.         return file;  
  27.     }  
  28.   
  29.     public void setFile(List<File> file) {  
  30.         this.file = file;  
  31.     }  
  32.   
  33.     public List<String> getFileFileName() {  
  34.         return fileFileName;  
  35.     }  
  36.   
  37.     public void setFileFileName(List<String> fileFileName) {  
  38.         this.fileFileName = fileFileName;  
  39.     }  
  40.   
  41.     public List<String> getFileContentType() {  
  42.         return fileContentType;  
  43.     }  
  44.   
  45.     public void setFileContentType(List<String> fileContentType) {  
  46.         this.fileContentType = fileContentType;  
  47.     }  
  48.   
  49.     public String execute() throws Exception {  
  50.         for (int i = 0; i < file.size(); i++) {  
  51.             //循环上传每个文件  
  52.             uploadFile(i);  
  53.         }  
  54.         return "success";  
  55.     }  
  56.   
  57.     //执行上传功能  
  58.     private void uploadFile(int i) throws FileNotFoundException, IOException {  
  59.         try {  
  60.             InputStream in = new FileInputStream(file.get(i));  
  61.             String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);  
  62.             File uploadFile = new File(dir, this.getFileFileName().get(i));  
  63.             OutputStream out = new FileOutputStream(uploadFile);  
  64.             byte[] buffer = new byte[1024 * 1024];  
  65.             int length;  
  66.             while ((length = in.read(buffer)) > 0) {  
  67.                 out.write(buffer, 0, length);  
  68.             }  
  69.   
  70.             in.close();  
  71.             out.close();  
  72.         } catch (FileNotFoundException ex) {  
  73.             ex.printStackTrace();  
  74.         } catch (IOException ex) {  
  75.             ex.printStackTrace();  
  76.         }  
  77.     }  
  78. }  


struts.xml配置文件中有关文件上传的配置:

 
Java代码   收藏代码
  1. <!--------------------文件名:struts.xml------------------->  
  2. <struts>  
  3.     <!-- 系统常量定义,定义上传文件字符集编码 -->  
  4.     <constant name="struts.i18n.encoding" value="gb2312"></constant>  
  5.     <!-- 系统常量定义,定义上传文件临时存放路径 -->  
  6.     <constant name="struts.multipart.saveDir" value="c:\"></constant>  
  7.     <!-- Action所在包定义 -->  
  8.     <package name="C04.4" extends="struts-default">  
  9.         <!-- Action名字,类以及导航页面定义 -->  
  10.         <!-- 通过Action类处理才导航的的Action定义 -->  
  11.         <action name="upload" class="action.UploadAction">  
  12.             <result name="input">/jsp/upload.jsp</result>  
  13.             <result name="success">/jsp/result.jsp</result>  
  14.         </action>  
  15.     </package>  
  16. </struts>   


(1):文件上传页面如图4.8所示。 

图4.8  文件上传 
(2):选择文件如图4.9所示。 

图4.9  选择上传的文件 
(3):单击“提交”按钮后文件上传成功页面,并显示上传文件名,如图4.10所示。 

图4.10  上传文件成功后效果 
(4):两个被上传文件最终在服务器上存放路径效果如图4.11所示。 

图4.11  上传文件存放路径图


代码解释 
(1)在upload.jsp中通过Form标签和File标签定义了两个上传文件。Struts2标签笔者会在之后章节里具体介绍,这里只是让读者知道是如何使用标签显示图4.8显示的内容。如果上传成功,笔者在result.jsp中“[”和“]”之间显示上传文件的文件名,如果是多个文件,以“,”相隔。这些显示格式都是用Property标签定义的。 
注意:如果上传文件,在JSP的Form中一定要定义如upload.jsp文件中黑体表示的部分。method和enctype属性都必须要如代码中所示。这样Form中上传文件才会起作用。 
(2)UploadAction文件中先定义了常量UPLOADDIR,它是上传文件上传后存放的文件夹名字。比如笔者使用的是JBoss(附录中有安装和在MyEclipse中部署的操作说明),则在它的已部署Web项目下的upload文件夹中,会有所有上传成功的文件。如图4.11读者也可以看见它的上传文件最终存放路径。 
注意:在MyEclipse中开发的“WebRoot”目录下也要新建一个upload文件夹,否则部署后在JBoss的已部署Web项目下将没有upload文件夹。因为部署的时候会将所有“WebRoot”目录下的文件夹和文件都部署到JBoss的已部署Web项目下。 
定义好UPLOADDIR后,在定义上传文件的属性变量。也许其中的“fileFileName”和“fileContentType”读者看了有点别扭,尤其是“fileFileName”感觉不符合Java命名规范,但是这两个属性变量是4.1小节中介绍的“fileUpload”拦截器类中的类公有变量名字,只有这样定义,UploadAction执行时候会把在页面上选择的上传文件的属性值放在这两个变量里面,否则调试UploadAction时候会发现这两个变量都会是“null”即空值。不相信的读者可以自行改变这两个变量名再执行上传文件功能进行调试看一下这两个变量得到的值。 
注意:因为这里笔者是进行多个文件上传功能开发,因此“file”、“fileFileName”、“fileFileName”属性变量都设定为List类型,其实还可以设定为数组类型。个人觉得没有啥大区别。完全凭个人喜好而定。还有如果读者自己开发单个文件上传,就没必要把它们设定为List类型或数组类型。直接把“file”定义为Java的IO包中的File类型,“fileFileName”、“fileFileName”定义为普通的String类型即字符串类型。 
之后在execute方法中,写一个循环,对所有页面中选择的上传文件一个个进行上传。这里笔者运用了重构中的“抽取方法”的方式,将上传文件的功能封装成一个私有方法,名字为“uploadFile”。其中运用了Java的IO包中很多API方法。有对重构和Java的IO功能不了解的读者可以去查阅相关资料去理解掌握,这里不是本书以及本节重点,因此不再具体记述。 
(3)struts.xml中定义了<constant>标签,主要定义了文件名和文件内容显示的字符编码集以及这些被上传文件临时存放路径。 
先说明一下<constant>标签,顾名思义这是定义整个Web项目的一些常量属性值,如果不定义则在Struts2自带的default.properties(读者们可到自己安装Struts2的文件路径src\core\src\main\resources\org\apache\struts2\下找到)文件中有这些常量的定义,比如在本节struts.xml文件中的“struts.i18n.encoding”和“struts.multipart.saveDir”在default.properties定义代码如下:

Java代码   收藏代码
  1. <!--------------------文件名:default.properties---------------->  
  2. ### This can be used to set your default locale and encoding scheme  
  3. # struts.locale=en_US  
  4. struts.i18n.encoding=UTF-8  
  5.   
  6. ### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data  
  7. # struts.multipart.parser=cos  
  8. # struts.multipart.parser=pell  
  9. struts.multipart.parser=jakarta  
  10. # uses javax.servlet.context.tempdir by default  
  11. struts.multipart.saveDir=  


如果不在struts.xml文件中定义,则Web项目会缺省使用default.properties文件中这两个常量属性的定义。一个将使字符编码集变为“UTF-8”,另一个干脆没有任何文件路径指定。而笔者开发的该Web项目缺省支持的字符编码集是“gb2312”,而且需要指定临时上传文件存放路径。(当然如果读者开发的Web项目缺省编码集就是“UTF-8”,而且也并不需要指定临时路径时候,就没必要在struts.xml中定义这两个<constant>),因此有必要定义这两个属性符合项目开发要求。 
注意:也可以如第3章那样,把这两个属性定义在自定义的struts.properties文件中,具体代码可以如下:

Java代码   收藏代码
  1. <!------------------------文件名:struts.properties------------------>  
  2. struts.i18n.encoding =gb2312  
  3. struts.multipart.saveDir= c:\  


笔者个人认为比在struts.xml中定义更加好,毕竟Struts2自己也是定义在properties属性文件中,而不是定义在自己的xml配置文件中。(Struts2自带的xml配置文件为struts-default.xml,在4.1小节中已记述)。这里是为了让读者知道struts.xml配置文件也可以配置这些属性,因此写在struts.xml配置文件中。从3.2小节笔者说明struts.xml配置文件时并没有介绍<constant>标签这点也可以知道笔者个人其实是不赞同这样的配置手段即在struts.xml中配置<constant>标签。 
在<Action>标签中配置“result”,和第3章类似,将这两个JSP文件的导航流程配置好即可。 
(4)开始进行文件上传功能展示,按照如上记述的步骤执行即可。笔者在桌面上新建了两个文本文件,将它们上传到JBoss已部署的Web项目中展示文件上传的upload文件夹下。如图4.11所示。 
其实还可以指定上传文件的格式,让它只上传特定类型的文件。比如只能上传文本和xml文件,则在struts.xml需要显示配置“uploadFile”拦截器。如下代码:

Java代码   收藏代码
  1. <!-----------------------文件名:struts.xml------------------>  
  2. <struts>  
  3.     <!-- Action所在包定义 -->  
  4.     <package name="C04.4" extends="struts-default">  
  5.         <!-- Action名字,类以及导航页面定义 -->  
  6.         <!-- 通过Action类处理才导航的的Action定义 -->  
  7.         <action name="upload" class="action.UploadAction">  
  8.             <result name="input">/jsp/upload.jsp</result>  
  9.             <result name="success">/jsp/result.jsp</result>  
  10.         </action>  
  11. <!—显示配置文件上传拦截器 -->  
  12. <interceptor-ref name=”fileUpload”>  
  13. <!—指定特定类型的上传文件 -->  
  14. <param name =”allowedTypes”>text/plain,application/xml</param>  
  15. </ interceptor-ref >  
  16. <interceptor-ref name=”defaultStack”></ interceptor-ref >  
  17.     </package>  
  18. </struts>   


定义了一个名为“allowedTypes”的参数,其中在<param></param>之间的是文件类型,也可以用“,”间隔,表示允许上传多个文件类型。这里允许上传文件类型为txt、xml格式的文件。如果读者不知道各个文件类型的定义,可在自己的JBoss安装目录中的server\default\deploy\jboss-web.deployer\conf\下的web.xml文件中找到(搜索<mime-mapping>即可)。 
注意:如果显示配置Struts2自己的缺省拦截器一定要写在“defaultStack”前,否则“fileUpload”拦截器不会执行拦截。因为Struts2中如果某个拦截器执行拦截时候发现自己已经执行过,第二个乃至之后同名的拦截器都不会执行。这里因为“defaultStack”拦截器栈中包含了“fileUpload”拦截器,而“fileUpload”拦截器已经执行拦截了,则不会再执行拦截。如果把“defaultStack”拦截器栈放在“fileUpload”拦截器前配置,则只执行“defaultStack”拦截器栈中的“fileUpload”拦截器,这里是没有定义“allowedTypes”的,Struts2缺省默认的是支持所有文件类型。因此它会支持所有文件类型的文件上传。因此再设定“allowedTypes”就没有任何意义了。

附件下载:http://dl.iteye.com/topics/download/45b325fd-945a-3946-813c-b75e265b6620

【电力系统】单机无穷大电力系统短路故障暂态稳定Simulink仿真(带说明文档)内容概要:本文档围绕“单机无穷大电力系统短路故障暂态稳定Simulink仿真”展开,提供了完整的仿真模型与说明文档,重点研究电力系统在发生短路故障后的暂态稳定性问题。通过Simulink搭建单机无穷大系统模型,模拟不同类型的短路故障(如三相短路),分析系统在故障期间及切除后的动态响应,包括发电机转子角度、转速、电压和功率等关键参数的变化,进而评估系统的暂态稳定能力。该仿真有助于理解电力系统稳定性机理,掌握暂态过程分析方法。; 适合人群:电气工程及相关专业的本科生、研究生,以及从事电力系统分析、运行与控制工作的科研人员和工程师。; 使用场景及目标:①学习电力系统暂态稳定的基本概念与分析方法;②掌握利用Simulink进行电力系统建模与仿真的技能;③研究短路故障对系统稳定性的影响及提高稳定性的措施(如故障清除时间优化);④辅助课程设计、毕业设计或科研项目中的系统仿真验证。; 阅读建议:建议结合电力系统稳定性理论知识进行学习,先理解仿真模型各模块的功能与参数设置,再运行仿真并仔细分析输出结果,尝试改变故障类型或系统参数以观察其对稳定性的影响,从而深化对暂态稳定问题的理解。
本研究聚焦于运用MATLAB平台,将支持向量机(SVM)应用于数据预测任务,并引入粒子群优化(PSO)算法对模型的关键参数进行自动调优。该研究属于机器学习领域的典型实践,其核心在于利用SVM构建分类模型,同时借助PSO的全局搜索能力,高效确定SVM的最优超参数配置,从而显著增强模型的整体预测效能。 支持向量机作为一种经典的监督学习方法,其基本原理是通过在高维特征空间中构造一个具有最大间隔的决策边界,以实现对样本数据的分类或回归分析。该算法擅长处理小规模样本集、非线性关系以及高维度特征识别问题,其有效性源于通过核函数将原始数据映射至更高维的空间,使得原本复杂的分类问题变得线性可分。 粒子群优化算法是一种模拟鸟群社会行为的群体智能优化技术。在该算法框架下,每个潜在解被视作一个“粒子”,粒子群在解空间中协同搜索,通过不断迭代更新自身速度与位置,并参考个体历史最优解和群体全局最优解的信息,逐步逼近问题的最优解。在本应用中,PSO被专门用于搜寻SVM中影响模型性能的两个关键参数——正则化参数C与核函数参数γ的最优组合。 项目所提供的实现代码涵盖了从数据加载、预处理(如标准化处理)、基础SVM模型构建到PSO优化流程的完整步骤。优化过程会针对不同的核函数(例如线性核、多项式核及径向基函数核等)进行参数寻优,并系统评估优化前后模型性能的差异。性能对比通常基于准确率、精确率、召回率及F1分数等多项分类指标展开,从而定量验证PSO算法在提升SVM模型分类能力方面的实际效果。 本研究通过一个具体的MATLAB实现案例,旨在演示如何将全局优化算法与机器学习模型相结合,以解决模型参数选择这一关键问题。通过此实践,研究者不仅能够深入理解SVM的工作原理,还能掌握利用智能优化技术提升模型泛化性能的有效方法,这对于机器学习在实际问题中的应用具有重要的参考价值。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值