struts2多文件上传下载
struts2_day5课堂笔记

Struts2 文件上传和下载和综合案例说明1.struts2的上传文件实现1.1.struts2文件上传回顾javaweb学习文件上传⏹客户端<form> 设置enctype编码类型multipart/form-data<form> 设置method 提交方式post<input type=”file”> 元素,必须提供name属性⏹服务器commons-fileupload 组件Struts2 内部文件上传,默认采用apache commons-fileuploadStruts2 默认导入文件上传jar包defaultStack 默认拦截器栈,提供fileUpload的拦截器,用于实现文件上传程序员编码: 仅仅需要接受上传文件不需要解析上传的文件.action 提供规则setXXX即可业务方法里面获取服务器绝对路径将该文件io拷贝到目下! 第一步:编写upload.jsp 上传文件表单第二步:编写UploadAction 接收上传后的文件名称必须对应!!表单的name 属性值要求和action 属性名称要求一致!!查看源码分析:如图:第三步:配置struts.xmlaction 业务方法完成文件上传到服务器指定位置要求: 学会工具类的使用和io 流的文件拷贝.1.2.上传中参数设置在struts2 文件上传,存在一些限制参数,当违背参数,跳转input 视图需要注意: 上传文件的大小限定的错误信息拦截器存放在ActionErrors 对象保存上传文件的类型限定错误信息拦截器存放在FiledErrors当发生错误时: 拦截器默认跳转到Input 视图获取错误信息代码:获取错误信息error.jspdefault.properties 设置默认上传的文件大小: 2M配置input视图显示错误信息<s:actionerror>自定义上传错误信息用户自定义1: 上传文件大小修改默认大小: default.properties修改: struts.xml 文件重写大小在struts.xml 修改上传文件默认大小该配置作用: 设置文件上传总大小.自定义上传文件大写: 搜索默认配置文件struts-message.properties需要重写value值可以自定义国际化配置文件信息提示用户上传文件大小限定保持key 不变value 书写自定义的信息注意默认{0} 默认上传文件大小{1} 自己上传文件实际大小代表的意思2: 设置上传文件类型mime类型限定扩展名的限定⏹如果执行影响当前这个功能,配置fileUpload 拦截器参数⏹源码对于上传参数的说明找到下列位置:⏹⏹maximunSize 设置单个文件大小allowedExtesions 允许上传文件扩展名类型struts.xml 配置定制上传文件类型的错误信息(参考struts-messages.properties )1.3.struts2文件下载(不是拦截器完成! 结果集完成)结果集实现类完成页面的响应一个输出流,两个头信息使用response输出流,将文件信息打印到客户端设置Content-Type头信息,通过servletContext.getMimeType(文件名) 获取设置Content-Disposition 头信息,attachment;filename=文件名Struts2 实现文件下载,可以通过stream 类型结果集下载完成输出流的工作通过默认结果集type="stream" 实现类完成流输出!!源码分析contentType 下载文件mime类型contentDisposition: 下载的形式直接打开inlineInputStream 需要输入流之前action 提供给结果集!! 结果集帮助用户完成输出流的代码给输入流起一个名称inputStream 之前action 提供一个输入的流方法名称必须和名称一致!! 结果集就可以获取输入流对象!第一步:编写Action ,使用Stream 结果集,提供文件下载提供三个参数: 文件类型文件下载形式文件输入流提供给结果集!!需要三个东西inputName :用来配置文件读取输入流方法的名称(默认值inputStream ,在Action提供getInputStream 方法)⏹contentType :下载文件Mime类型获取文件类型,放入值栈⏹contentDisposition :以附件形式下载(attachment;filename=文件名)⏹放入值栈:IE 采用URL编码火狐采用Base64编码引入之前工具类完成附件名浏览器兼容问题第二步:配置struts.xml 结果集下载原理分析2.struts2综合练习综合案例安排:1、导入员工管理系统静态页面,分析功能2、数据库创建3、员工登陆功能4、员工添加功能5、员工列表查询功能3.在开发工具中导入练习项目代码企业开发项目结构存在多样性(eclipse、myeclipse、netbeans、maven、ant ),导入企业项目最好做法,在开发工具新建项目,将原型代码复制过来(不建议import )将WebRoot 中页面,复制项目WebRoot通过分析页面效果,目标开发功能:1、员工登陆2、员工添加(上传简历)3、员工列表查询(多条件组合查询)4、员工编辑5、员工详细信息查看(简历下载)6、员工删除页面文件分析:login 目录用户登陆以及网站主体布局user目录需要完成主要操作人员管理crud 操作add 添加员工edit 编辑员工页面list 显示员工信息页面view 查看员工明细页面4.设计数据表4.1.建立数据库环境在mysql系统中,一个项目对应一个mysql数据库创建数据库4.2.导入数据表#用户表INSERT INTO s_user (userID,userName,logonName,logonPwd) VALUES (1,'超级管理员','admin','admin');5.搭建项目服务器开发环境5.1.导入jar包和配置文件技术选型:Struts2 + JavaBean + Apache DbUtils + C3P0 + Mysql + Tomcat 6/7导入struts2导入struts2 jar包(struts2 解压目录/apps/struts2_blank.war)添加数据库驱动包+ c3p0+dbutils 建立包的层次结构: 在web.xml 配置struts2 核心Filter在src下新建struts.xml⏹导入dbutils导入commons-dbutils-1.4.jar⏹导入c3p0导入c3p0-0.9.1.2.jar在src下,导入c3p0-config.xml (修改文件中数据库连接参数)导入JdbcUtils 工具类,在开发环境获取唯一连接池对象⏹导入mysql 数据库驱动导入mysql-connector-java-5.0.8-bin.jar5.2.编写实体类Apache DbUtils 内置BeanHandler 、BeanListHandler 要求实体类属性必须要和数据表中字段名称一致!要求表字段一致6.功能:用户登陆6.1.修改页面form表单将<form>改造为<s :form>使用struts2标签库1: login.jsp 改造form2:表单里面的内容:struts.xml 添加<constant> 标签login.jsp6.2.Action表单校验(登录名、密码非空)采用xml 局部校验方式编写UserAction配置struts.xml action 映射针对login 操作的请求参数校验器文件编写编写校验器配置国际化资源信息info.properties完成登陆业务测试!1: 配置登陆跳转页面视图struts.xml 配置login.jsp回显错误信息完成登陆参数的校验6.3.实现服务器登录功能需要查询数据库!!实现登陆业务完成三层调用!调用业务层调用dao完成登陆基本操作!!! 注意后续操作添加权限: 登陆session 添加用户信息7.功能:添加用户添加用户入口对应的页面打开页面改造: 传统form --->struts 表单7.1.修改添加用户form表单7.2.实现服务器添加用户实现业务功能!!接受表单信息MOdelDriver<User> login.jsp 信息封装到User 对象调用业务层和dao 完成数据库插入完成添加功能跳转到查询action 业务方法配置struts.xml 8.功能:用户列表显示查询员工列表入口页面left.jsp修改userAction_queryUserAction 完成查询业务!配置struts.xml 转发集合给list.jsp页面实现业务层和dao 除了管理员其他员工全部显示list.jsp 页面通过ognl 表达式获取值栈集合数据list如下所示<s:if test="users==null"><font color="red">没有任何员工</font></s:if><s:else><s:iterator var="u"value="users"><tr onmouseover="this.style.backgroundColor = 'white'" onmouseout="this.style.backgroundColor = '#F5FAFE';"> <td style="CURSOR: hand; HEIGHT: 22px"align="center" width="18%"><s:property value="loginName"/></td><td style="CURSOR: hand; HEIGHT: 22px"align="center" width="17%"><s:property value="userName"/></td><td style="CURSOR: hand; HEIGHT: 22px"align="center" width="8%"><s:property value="sex"/></td><td style="CURSOR: hand; HEIGHT: 22px"align="center"width="23%"><s:property value="telephone"/></td><td style="CURSOR: hand; HEIGHT: 22px"align="center"><s:property value="education"/></td><td align="center"style="HEIGHT: 22px"><a href="${pageContext.request.contextPath}/user/edit.jsp?userID=15"><img src="${pageContext.request.contextPath}/images/i_edit.gif"border="0"style="CURSOR: hand"></a></td><td align="center"style="HEIGHT: 22px"><a href="${pageContext.request.contextPath}/user/view.jsp?userID=15"><img src="${pageContext.request.contextPath}/images/button_view.gif"border="0"style="CURSOR: hand"></a></td><td align="center"style="HEIGHT: 22px"><a href="${pageContext.request.contextPath}/user/list.jsp?userID=15"><img src="${pageContext.request.contextPath}/images/i_del.gif"width="16"height="16"border="0"style="CURSOR: hand"> </a></td></tr></s:iterator></s:else>8.1.添加员工登陆用户名唯一struts2 和json 插件结合使用:ajax 发送请求判断用户名是否唯一. 给予用户提示: 决定表单是否提交导入插件包到工程lib 下使用json 一般参照插件配置文件继承与struts2 基本包定义一个结果集类型json 相当于扩展原始struts2基本包的结果类型. 结果集将值栈中获取action数据输出ajax json 格式给前台js. 拦截器: 扩展strtus2拦截器帮助实现json数据传输.1:在struts.xml 修改自己包继承关系2: 业务功能实现add.jsp 离焦发送数据给action 数据库查询有无用户名重复数据库存在不能添加新用户给予用户提示信息表单不能提交数据库不存在该用户名给予用户提示表单提交.开始编码找add.jsp引入jquery 知识找到目标标签发送ajax 请求给后台action 响应结果数据结果集源码分析:。
Struts2之文件上传与下载

Struts2之文件上传与下载一、Struts2文件上传Struts2的文件上传实现非常简单,只需要简单几步就可完成;注意:(1)文件上传的struts2标签为:<s:file name="" label="上传"/>(2)文件上传的前提是表单属性method="post" enctype="multipart/form-data";(3)web应用中必须包含common-fileupload.jar和common-io.jar,因为struts2默认上传解析器使用的是jakarta;(4)可以在struts.xml中配置最大允许上传的文件大小:<constantname="struts.multipart.maxSize" value="....."/>,默认为2M;1.普通文件上传实现规则:(1)在JSP中设定表单控件<s:file name="upload" label="上传"/>(2)在Action中定义属性:private File upload; //包含文件内容private String uploadFileName; //上传文件的名称;private String uploadContentType; //上传文件的MIME类型;这些属性都会随着文件的上传自动赋值;(3)在execute()中完成写入磁盘功能;代码示例:Upload01Action.java[java]view plaincopyprint?1.package org.upload.action;2.3.import java.io.File;4.import java.io.FileInputStream;5.import java.io.FileOutputStream;6.7.import org.apache.struts2.ServletActionContext;8.9.import com.opensymphony.xwork2.ActionSupport;10.11.public class Upload01Action extends ActionSupport {12.private File upload;13.private String uploadFileName;14.private String uploadContentType;15.private String name;16.public String execute()throws Exception{17.String path =ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");18.String filename = path+File.separator+name;19.FileInputStream in = new FileInputStream(upload);20.FileOutputStream out = new FileOutputStream(filename);21.byte[]b = new byte[1024];22.intlen = 0;23.while((len=in.read(b))>0){24.out.write(b,0,len);25.}26.out.close();27.return SUCCESS;28.}29.30.public File getUpload() {31.return upload;32.}33.34.public void setUpload(File upload) {35.this.upload = upload;36.}37.38.public String getUploadFileName() {39.return uploadFileName;40.}41.42.public void setUploadFileName(String uploadFileName) {43.this.uploadFileName = uploadFileName;44.}45.46.public String getUploadContentType() {47.return uploadContentType;48.}49.50.public void setUploadContentType(String uploadContentType) {51.this.uploadContentType = uploadContentType;52.}53.54.public String getName() {55.return name;56.}57.58.public void setName(String name) { = name;60.}61.62.63.}struts.xml[html]view plaincopyprint?1.<?xml version="1.0"encoding="UTF-8"?>2.<!DOCTYPE struts PUBLIC3."-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"4."/dtds/struts-2.0.dtd">5.6.<struts>7.<constant name="struts.devMode"value="true"/>8.<constant name="struts.custom.i18n.resources"value="message"></constant>9.<package name="default"namespace="/"extends="struts-default">10.<action name="upload0*"class="org.upload.action.Upload0{1}Action">11.<param name="name">1.jpg</param>12.<result>/{1}.jsp</result>13.</action>14.</package>15.</struts>1.jsp[html]view plaincopyprint?1.<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>2.<%@taglib prefix="s"uri="/struts-tags" %>3.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML4.01 Transitional//EN">4.<html>5.<head>6.<title>My JSP '1.jsp' starting page</title>7.</head>8.9.<body>10.<s:form action="upload01"method="post"enctype="multipart/form-data">11.<s:file name="upload"label="上传"></s:file>12.<s:submit value="上传"></s:submit>13.</s:form>14.</body>15.</html>2.利用拦截器进行过滤手动实现过滤的方式非常简单,就是利用输入校验的方式进行过滤,即在validate()中进行过滤;而这里要讲的拦截器方式是很好的方式,只需要在配置文件中配置,灵活性很好,能够限制文件的类型、文件的大小;如果上传的文件不符合要求,则返回input逻辑视图;配置拦截器步骤:(1)文件上传的拦截器为fileUpload;(2)需要给定参数allowedTypes、maximumSize;(3)在fileUpload拦截器后,需要添加<interceptor-ref name="defaultStack"/>代码示例:由于通过拦截器进行过滤只需要配置struts.xml,因此这里只给出struts.xml的配置[html]view plaincopyprint?1.<?xml version="1.0"encoding="UTF-8"?>2.<!DOCTYPE struts PUBLIC3."-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"4."/dtds/struts-2.0.dtd">5.6.<struts>7.<constant name="struts.devMode"value="true"/>8.<constant name="struts.custom.i18n.resources"value="message"></constant>9.<package name="default"namespace="/"extends="struts-default">10.<action name="upload0*"class="org.upload.action.Upload0{1}Action">11.<interceptor-ref name="fileUpload">12.<param name="allowedTypes">image/jpeg,image/gif</param>13.<param name="maximumSize">1024*1024</param>14.</interceptor-ref>15.<interceptor-ref name="defaultStack"></interceptor-ref>16.<param name="name">1.jpg</param>17.<result>/{1}.jsp</result>18.<result name="input">/{1}.jsp</result>19.</action>20.</package>21.</struts>我们还需要配置文件上传失败后的错误提示信息,我们需要在全局国际化资源文件中配置:[html]view plaincopyprint?1.struts.messages.error.content.type.not.allowed=文件类型不匹配2.rge=文件太大二、Struts2文件下载我们在学习Servlet和HTTP协议时已经可以实现文件下载,即写content-disposition头即可,struts2的实现原理也是这个,但是提供了更好的封装性;struts2的stream结果类型专门用于实现文件下载;(1)struts.xml中配置stream结果类型,并配置contentType、contentDisposition、bufferSize 参数即可,模板:[html]view plaincopyprint?1.<action name="download"class="">2.<result type="stream"name="success">3.<param name="contentType"></param>4.<param name="contentDisposition">attachment;filename=""</param>5.<param name="bufferSize">4096</param>6.</result>7.</action>(2)在Action中创建public InputStreamgetInputStream()throws Exception;方法,此方法用于获得下载文件的输入流;DownloadAction.java[java]view plaincopyprint?1.package org.download.action;2.3.import java.io.InputStream;4.5.import org.apache.struts2.ServletActionContext;6.7.import com.opensymphony.xwork2.ActionSupport;8.9.public class DownloadAction extends ActionSupport {10.public InputStreamgetInputStream()throws Exception{11.12.returnServletActionContext.getServletContext().getResourceAsStream("/WEB-INF/upload/1.jpg");13.14.}15.public String execute()throws Exception{16.return SUCCESS;17.}18.}struts.xml[html]view plaincopyprint?1.<action name="download"class="org.download.action.DownloadAction">2.<result type="stream"name="success">3.<param name="contentType">image/jpeg</param>4.<param name="contentDisposition">attachment;filename="1.jpg"</param>5.<param name="bufferSize">4096</param>6.</result>7.</action>就可以完成下载。
struts2下载(使用配置文件)

struts2下载(使用配置文件)1.第一步web.xml2.<?xml version="1.0" encoding="UTF-8"?>3.<web-app version="2.4"4.xmlns="/xml/ns/j2ee"5.xmlns:xsi="/2001/XMLSchema-instance"6.xsi:schemaLocation="/xml/ns/j2ee7./xml/ns/j2ee/web-app_2_4.xsd">8.<welcome-file-list>9.<welcome-file>index.jsp</welcome-file>10.</welcome-file-list>11.12.<filter>13.<filter-name>struts2</filter-name>14.<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>15.</filter>16.<filter-mapping>17.<filter-name>struts2</filter-name>18.<url-pattern>/*</url-pattern>19.</filter-mapping>20.21.</web-app>第二步:struts.xml1.<!DOCTYPE struts PUBLIC2."-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"3."/dtds/struts-2.0.dtd">4.<struts>5.<package name="default" extends="struts-default">6.<action name="download" class="action.DownloadAction">7.<result type="stream">8.<param name="contentType">application/octet-stream</param>9.<param name="inputName">inputStream</param>10.<param name="contentDisposition">attachment;filename="${fileName}"</param>11.<param name="bufferSize">4096</param>12.</result>13.</action>14.</package>15.</struts>当result为stream类型时,struts2会自动根据你配置好的参数下载文件。
struts上传下载、Ognl、国际化

Ognl及struts标签:OGNL (Object Graph Navigation Language)对象图导航语言OGNL是一门独立的语言,struct2 使用了这种语言,Struts2默认的表达式语言是OGNL。
它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。
注意!!:在Struts2中,根对象就是ValueStack。
在Struts的任何流程当中,valueStack中的最顶层对象一定是Action对象。
<s:property value="username"/>当简单地访问action属性时直接在value属性取值即可。
而如果是放在命名对象里的值,要想获取时,需加上#对象名.属性,如下:request , #ernamesession, #ernameapplication, #ername以上几个对象叫做命名对象#相当于ActionContext.getContext() .实例:1、写一个请求页面:<body><form action="ognlAction.action" method="post"> username : <input name="username"><br/>password : <input name="password"><br/><input type="submit"value="submit"></form></body>2、写一个实体类UserInfor:public class UserInfor {private String username;private int age;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}3、写对应的action处理类:public class OgnlAction extends ActionSupport { private String username ;private String password ;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String execute() throws Exception {Set<UserInfor> users = new HashSet<UserInfor>();for (int i = 0; i < 10; i++) {UserInfor e = new UserInfor();e.setUsername("zhangsan"+i);e.setAge(20+i);users.add(e);}//把users集合放在request对象里ServletActionContext.getRequest().setAttribute("users", users);UserInfor userinfo = new UserInfor();userinfo.setUsername("zhangsan");userinfo.setAge(123);//把对象值放在request里ServletActionContext.getRequest().setAttribute("userin fo", userinfo);return SUCCESS;}}4、配置struts.xml文件:<struts><package name="struts"extends="struts-default"> <action name="ognlAction"class="com.strong.action.OgnlAction"><result name="success">/ognlResult.jsp</result> </action><action name="urlaction"class="com.strong.action.URLAction"><result name="success">/urlResult.jsp</result> </action></package></struts>5、写结果显示页面ognlResult.jsp:<body>取action中普通属性的值:username : <s:property value="username"/><br/>password : <s:property value="password"/><br/>--------------------------------------<br/> <!-- 如何去命名对象里的值 -->取命名对象里的值为:<s:property value="%{#ername}"/><br /><!-- 如何迭代取集合里的值? -->迭代取得值为:<br/><s:iterator value="#ers"><s:property value="username"/><s:property value="age"/><br/></s:iterator></body>struts上传下载:(1)、单文件上传:1、写一个上传页面upload.jsp:<body><h4>this is the fileupload.jsp</h4><form action="uploadtest.action"method="post" enctype="multipart/form-data">username : <input type="text"name="username"><br>file1 : <input type="file"name="file"><br><input type="submit"value="submit"><br></form></body>2、写对应的action类:public class UploadAction extends ActionSupport{private String username ;private File file ;//固定的模式表单中的名称+FileNameprivate String fileFileName ;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public File getFile() {return file;}public void setFile(File file) {this.file = file;}public String getFileFileName() {return fileFileName;}public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName;}@Overridepublic String execute() throws Exception {String root =ServletActionContext.getRequest().getRealPath("/upload");InputStream is = new FileInputStream(file);File dest = new File(root ,fileFileName);OutputStream os = new FileOutputStream(dest);byte[] buffer = new byte[1024];int len = 0 ;while((len = is.read(buffer)) != -1){os.write(buffer , 0 , len);}is.close();os.close();return SUCCESS;}}3、配置struts.xml文件:<struts><package name="struts"extends="struts-default"> <action name="uploadtest"class="com.strong.action.UploadAction"><result name="success">/present.jsp</result> </action></package></struts>4、结果显示页面:<body><h4>this is the fileuploadresult.jsp</h4>username : <s:property value="username"/><br>name : <s:property value="fileFileName"/><br></body>(2)多文件上传:1、建一个上传页面multiUpload.jsp:<body><h4>this is the fileupload2.jsp for many file</h4><form action="fileupload"method="post"enctype="multipart/form-data">username : <input type="text"name="username"><br>file1 : <input type="file"name="file"><br>file2 : <input type="file"name="file"><br>file3 : <input type="file"name="file"><br><input type="submit"value="submit"><br></form></body>2、写对应的action处理类:public class UpLoad2Action extends ActionSupport {private String username;private List<File> file;private List<String> fileFileName;private List<String> fileContentType;public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public List<File> getFile() {return file;}public void setFile(List<File> file) {this.file = file;}public List<String> getFileFileName() {return fileFileName;}public void setFileFileName(List<String> fileFileName) { this.fileFileName = fileFileName;}public List<String> getFileContentType() {return fileContentType;}public void setFileContentType(List<String> fileContentType) {this.fileContentType = fileContentType;}@Overridepublic String execute() throws Exception {for (int i = 0; i < file.size(); i++) {InputStream is = new FileInputStream(file.get(i));String root =ServletActionContext.getRequest().getRealPath("/upload");File dest = new File(root, fileFileName.get(i));OutputStream os = new FileOutputStream(dest);byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len);}is.close();os.close();}return SUCCESS;}}3、配置struts.xml文件:<action name="fileupload"class="com.strong.action.UpLoad2Action"><result name="success">/present2.jsp</result> </action>4、显示页面:<body><h4>this is the fileUploadResult2.jsp</h4>username : <s:property value="username"/><br> <!-- 迭代去取上传文件的名字,--><s:iterator value="fileFileName"id="f">fileName: <s:property value="#f"/><br></s:iterator></body>文件下载:1、下载页面:<body><h4>this is the download.jsp</h4><a href="download">文件下載</a></body>2、写对应action处理类:public class DownloadAction extends ActionSupport{ private String filename ;public String getFilename() {return filename;}public void setFilename(String filename) {this.filename = filename;}public InputStream getDownloadFile() throws UnsupportedEncodingException{filename = "downloadFile";returnServletActionContext.getServletContext().getResourceAsStr eam("/upload/java泛型.docx");}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubreturn SUCCESS;}}3、在struts.xml中配置action:<action name="download"class="com.strong.action.DownloadAction"><result name="success"type="stream"><param name="contentDisposition">filename=${filename}</param><param name="inputName">downloadFile</param> </result></action>国际化:概念:i18n:internationalizationI和n之间一共有18个字母。
Struts2上传下载

Struts2上传下载
1
struts2并没有定义自己的文件解析器,而是采用 了其他的开源组件 支持三种文件上传组件
如果要使用其他两种,必须将对应的库文件导入工 程,并修改Struts2的default.properties文件 丌管使用哪一种方式上传,代码没有区别 通过FileUploadInterceptor截拦器完成
文件
public class FileuploadAction extends ActionSupport { private String desc; private File file1; private String file1FileName; private String savePath = "G:" +
文件过滤
9
文件大小先后经过两重验证
◦ struts.properties(默认2M左右)
struts.multipart.maxSize=91344570
◦ <param name="maximumSize">5485760</param>
注意
10
在classpath下创建testmessages_zh_CN.properties文 件,输入下面内容
文件下载
13
下载代码
14
Struts2的文件下载Action不普通的Action并没 有太大的丌同,仅仅是该Action需要提供一个返 回InputStream流的方法,该输入流代表了被下 载的文件的入口。
第八章struts2文件上传下载精品PPT课件

IBM Software Group
两个上传框架
CommoInBM-的Sof开twar源e G项roup目,由jakarta项目组开发 。
功能强大,简单易用,可以实现一次上传一个或 多个文件,并可限制文件大小。
COS:O‘Reilly公司开发的开源框架
会不定期的增加一些新功能。
IBM Software Group
</form>
或者
<%@ taglib uri="/struts-tags" prefix="s" %>
IBM Software Group
上传Action类UploadAction
IBM Software Group
IBM Software Group
上传Action类UploadAction
IBM Software Group
Struts2对文件下载的支持
Struts2通IBM过Software Group org.apache.struts2.dispatcher.StreamResult 结果类型来支持文件下载,使得原本编写就简 单的下载程序变得更加简单了。
使用数组同时上传多个文件
IBM Software Group
IBM Software Group
使用list同时上传多个文件
IBM Software Group
IBM Software Group
使用list同时上传多个文件
IBM Software Group
IBM Software Group
IBM Software Group
使用数组同时上传多个文件
IBM Software Group
用struts2实现下载文件

1.创建Maven工程,导入jar,pom.xml添加如下代码:<dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.3.8</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency></dependencies>2.在WEB-INF/web.xml中配置filter<filter><filter-name>mvc</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepa reAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>mvc</filter-name><url-pattern>*.action</url-pattern></filter-mapping>3.编写action类ToDownAction 和FileDownAction ;package cn.tedu;/*** 跳转至下载页面* @author Administrator**/publicclass ToDownAction {public String execute() {return"success";}package cn.tedu;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;/*** 实现文件传输* @author Administrator**/publicclass FileDownAction {private InputStream fileInputStream;private String fileName;public InputStream getFileInputStream() {return fileInputStream;}publicvoid setFileInputStream(InputStream fileInputStream) {this.fileInputStream = fileInputStream;}public String getFileName() {return fileName;}publicvoid setFileName(String fileName) {this.fileName = fileName;}public String execute() {File file = newFile("F:/Eclipse/15_STRUTS2_IMAGE.pdf");fileName = file.getName();try {fileInputStream = new FileInputStream(file);} catch (FileNotFoundException e) {e.printStackTrace();}return"success";}4.在src/main/resources文件夹下编辑写struts.xml,如下:<?xml version="1.0"encoding="UTF-8"?><!-- struts.xml --><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""/dtds/struts-2.3.dtd"><struts><package name="test"namespace="/test"extends="struts -default"><action name="hello"class="cn.tedu.ToDownAction"> <!-- execute方法返回success 时候,转发到msg.jsp --><result name="success">/WEB-INF/fileDown.jsp</result></action><action name="filedown"class="cn.tedu.FileDownAction "><result name="success"type="stream"><param name="inputName">fileInputStream</param><param name="contentDisposition">attachment;filename ="${fileName}"</param><param name="contentType">application/octet-stream</ param><param name="bufferSize">4096</param></result></action></package></struts>5.项目结构如下图6.测试结果:下载页面:下载时:7.Debug:Can not find a java.io.InputStream with the name [inputS tream] in the invocation stack意味着你的文件路径有问题,请看看你的路径下有没有该文件!。
struts上传和下载

struts上传和下载<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4"xmlns=""xmlns:xsi=""xsi:schemaLocation="/web-app_2_4.xsd"><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><filter><filter-name > struts2 </filter-name ><filter-class >org.apache.struts2.dispatcher.FilterDispatcher</filter-class ></filter ><filter-mapping><filter-name >struts2 </filter-name ><url-pattern > /* </url-pattern ></filter-mapping ></web-app>2》。
struts.xml文件:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"""><struts><constant name="struts.il8n.encoding" value="GBK" /><constant name="struts.multipart.maxSize" value="102400000000" /><!-- 文件上传 --><constant name="struts.custom.i18n.resources" value="ApplicationResources" /><!-- 利用struts.multipart.saveDirg属性来改变临时文件存放的目录--><constant name="struts.multipart.saveDirg" value="e:\\temp" /><package name="default" extends="struts-default"><!-- 自定义下载时用拦截器 --><interceptors><interceptor name="download"class="org.sunxin.struts2.action.FileDownloadInterceptor" /> </interceptors><action name="upload" class="org.sunxin.struts2.action.FileUploadAction"><interceptor-ref name="defaultStack"><!-- 设置上传文件的大小及类型 --><!-- <param name="fileUpload.maximumSize">10240000</param>--> <param name="fileUpload.allowedTypes"> image/gif,image/jpg,image/bmp</param></interceptor-ref><result name="input">/upload.jsp</result><result name="success">/success.jsp</result><param name="uploadDir">/WEB-INF/UploadFiles</param> </action><!-- 文件下载 1--><action name="download" class="org.sunxin.struts2.action.FileDownloadAction"> <!-- 指定下载文件的路径,该路径相对于web应用程序所在的目录 --><param name="inputPath1">/WEB-INF/UploadFiles/65_Fetch_2.avi</param><param name="inputPath2">/WEB-INF/UploadFiles/AJAX.bmp</param><result name="success" type="stream"><!-- 指定下载文件内容类型 application/zip --><param name="contentType">imag/bmp,*./avi</param> <!--inputName默认值是InputStream,如果action中用于读取下载文件内容的属性名是inputStream,那麽可以省略这个参数--><param name="inputName">InputStream</param><paramname="contentDisposition">filename="${filename}"</param> <param name="bufferSize">2048</param></result></action></package></struts>3》。
struts2上传下载---学习笔记(下)

Struts2上传下载续上传续在昨天的笔记中,我们学习了struts2的基本上传方法,并完成了一个上传的实例,下面我们在学习上传的一些相关知识。
1.在上传中,我们写的小程序是可以上传任何类型文件的,可是在我们的真实开发中,一定会对上传文件的类型进行严格的控制,那我们该如何对上传文件的类型进行控制呢,我们前面已经学习了struts2的核心部分——拦截器,拦截器的功能十分的强大,那么下面我们就用拦截器来实现对上传文件的类型控制。
Struts2已经对上传有了默认的拦截器,我们就用struts2的默认拦截器进行类型控制,首先我们来看下我们所需要的拦截器:①.打开struts-default.xml文件,找到<interceptors>标签,我们找到了我们需要的拦截器,名为fileUpload,该拦截器的定义如下:<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>②.根据上面的定义,我们找到了org.apache.struts2.interceptor.FileUploadInterceptor类③.我们关联源码,打开FileUploadInterceptor类,我们找到了如下信息:④.下面我们就要在struts.xml文件中进行拦截器的配置⑤.我们将fileUpload拦截器配置到我们的action中,可是类型该怎么写呢,没关系,我们可以在tomcat的conf目录下的web.xml文件中查找,例如,我们只允许上传以ppt为扩展名的文件,按Ctrl+F查找,输入PPT,出现下面结果:⑥.我们将<mime-type>标签中的内容复制到struts.xml中我们配置的拦截器中的<param>标签下,如④中的图。
JAVA Web 之 struts2文件上传下载演示

44.System.out.println("文件类型:"+ fileContentType);
45.
46.if(file !=null) {
47.//文件的保存路径是WebContent/file目录下
48.String realpath = ServletActionContext.getServletContext()
27.*定义为String imgFileName
28.*/
29.privateString fileFileName;
30./*
31.*这里定义的是文件的类型,如果不需要获取文件类型的话,可以不定义.
32.*命名规则跟xxxFileName类似,这里一定要定义成xxxContentType形式.
33.*/
9.</filter>
10.<!--所有类型的请求都会被struts拦截-->
11.<filter-mapping>
12.<filter-name>struts2</filter-name>
13.<url-pattern>/*</url-pattern>
14.</filter-mapping>
15.
7.<resultname="input">download.jsp</result>
8.</action>
9.</package>
10.</struts>
Struts2实现文件上传和下载

一、Struts2实现文件上传1、添加必备jar包commons-logging-1.1.jarfreemarker-2.3.8.jarognl-2.6.11.jarstruts2-core-2.0.6.jarxwork-2.0.1.jarcommons-io-1.3.1.jarcommons-fileupload-1.2.jar2、jsp页面设置1)表单的提交方式必须为post2)表单标签必须添加属性enctype="multipart/form-data"3)表单元素file添加name属性3、Action类的编写1)根据表单元素file的name属性声明三个对应属性,一个是File类型,两个是字符串类型,并且三个属性名字固定,分别用于存储上传的文件,文件名及文件类型private file name属性名;private String name属性名FileName;private String name属性名ConentType;并提供对应的setter/getter方法2)在execute方法中编写代码Stringpath=ServletActionContext.getServletContext().getRealPath("/")+"/ images/"+headerFileName;FileUtils.copyFile(header, new File(path));3)如果一次上传多个文件,则需要保证所有上传控件的名字相同,在Action中声明三个集合或数组来接收上传上来的所有文件信息,并在execute方法中操作文件集合或数组即可for(int i=0;i<header.size();i++){File file=header.get(i);if(file!=null && file.exists()){Stringpath=ServletActionContext.getServletContext().getRealPath("/")+"/imag es/"+headerFileName.get(i);FileUtils.copyFile(file, new File(path));}}4、struts.xml配置文件1)注意,上传使用的action必须引用了fileupload拦截器,默认拦截器栈中已经包含了次拦截器了;只需注意如果引用了自定义拦截器,默认拦截器无效了;2)可以通过配置一些常量值,来控制上传文件的大小<constant name="struts.multipart.maxSize"value="1024000"></constant> 二、Struts2实现文件下载1、添加必备jar包commons-logging-1.1.jarfreemarker-2.3.8.jarognl-2.6.11.jarstruts2-core-2.0.6.jarxwork-2.0.1.jarcommons-io-1.3.1.jarcommons-fileupload-1.2.jar2、jsp页面设置<a href="download.action?fileName=${'权限练习.doc' }">权限需求文档</a><a href="download.action?fileName=${'Wind.jpg' }">风景画</a>提供超链接进行下载,点击时提交给action,并提供要下载的文件的名字及地址2、Action类的编写1)创建属性,接收提交过来的路径名及文件名,并提供getter/setter方法2)exectue方法直接return即可,无需编写任何代码3)编写下载方法public InputStream getDownloadFile()throws IOException{Stringpathname=ServletActionContext.getServletContext().getRealPath("/")+"/ images/"+fileName;HttpServletResponseresponse=ServletActionContext.getResponse();response.setContentType("application/x-msdownload");FileInputStream stream=new FileInputStream(new File(pathname));try {response.setHeader("Content-Disposition","attachment;filename="+newString(fileName.getBytes("gbk"),"iso-8859-1"));} catch (Exception e) {System.out.println("error:"+e.getMessage());}return stream;}注意此方法是自定义的,注意方法名字,必须符合驼峰命名法,以get开头即可3、struts.xml配置文件<action name="download"class="cn.mystruts.action.DownloadAction"> <result name="ok"type="stream"><param name="inputName">downloadFile</param><param name="bufferSize">1024</param></result></action>注意:1、参数inputName给的值是所编写的下载方法的名字去掉get,并要求符合驼峰命名法2、在tomcat/conf/server.xml中修改默认端口号的connector节点后添加属性URIEncoding=”UTF-8”。
Struts2的文件上传和下载问题

Struts2的文件上传和下载问题2012-05-231、Strusts2文件的上传:1、要实现文件上传必须将表单的method属性设置成post,将enctype设置成multipart/form-data,即<s:form action=”…” method=”post” enctype=”multipart/form-data”><input type=”file” name=”…”/>…</s:form>enctyp=”multipart/form-data”表示数据将以二进制流处理。
而在引用struts2的标签的时,应该引入该标签<%@taglib prefix=”s” uri=”/struts-tags”/>2、如果表单中包含一个name属性为***的文件域,则对应的处理Action中应使用以下三个属性来封装***文件域的信息***:File 封装文件域对应的文件内容***FileName:String 封装文件域对应的文件名称***ContentType:String 封装文件域对应的文件类型实现文件上传的主要代码如下:public String execute() throws Exception{ FileOutputStream fos = newFileOutputStream(要将文件上传到那个文件夹的路径);FileInputStream fis = new FileInputStream(getUpload());byte[] buffer =newbyte[1024];int len = 0;while ((len =fis.read(buffer)) > 0){fos.write(buffer, 0,len);}return SUCCESS;}3、应用拦截器实现文件的过滤(Struts2文件上传的拦截器是fileUpload<action name=”uploadPro” class=”…”><interceptor-ref name=”fileUpload”><param name=”allowedTypes”>image/png,imgae/gif,application/ms word</param><!-- 指定允许上传的文件类型--><param name=”maximumSize”>2000</param><!—指定上传的最大文件的大小--></interceptor-ref><interceptor-ref name=”defaultStack”/>…</action>4、上传文件太大的提示信息的key:rge上传文件的文件类型不允许的提示信息的key:struts.messages.error.content.type.not.allowed上传文件失败的提示信息的key:struts.messages.error.uploading设置文件上传的临时路经:struts.multipart.saveDir=”…”2、Struts2文件的下载:Struts2提供stream结果类型来支持文件的下载功能,而配置stream类型的结果需要给出一下四个属性:contentType:被下载文件的类型inputName:为被下载文件创建的一个输入流,在相应的Action中必须为其提供一个返回类型为InputStream的getter方法。
Struts结构的JAVA Web开发中实现文件上传与下载

字符也要 用” 0 代替。那 么 , %2 ” 通过 U L R 编码 方式 上 载的文件将 会是 原 来 的 2—3倍 大。而 使 用 RC8 7 F 16
联 系需要使 用 H- 协议 而不能是 FP协议 。 1P r T
在 H- 1P协议 中上 下载 文件 主要 运 用 RC8 7方 r F16
序 地都要 用到 文件 的 上传 与下 载 功能 。本 文将 对 如
何 在 Sr s结构 的 J V B编程 中 实现上 下载进 行 tt u A A WE
l d类 , 中 og a ah . t t. p a . omRe是 o a 其 r. p ce s s u l d Fr l u r o
并且在表单本 身 中加入 了不 同 的编码 方案 , 它不 再使用典型的 :
< om a t n= ts i ”meh d=” ot fr co ”ets i .p to ps ”>
讨论 , 并给 出具体解 决方法。S us t t 是基 于 MV 模型 r C(
一
视 图 一 制 ) We 控 的 b应 用框 架 , 过它可 以实现模 通
式 。RC8 7在作为标准发布之 前首先被 N t o e的 F16 e cp s N v ao . a i tr 0中采 用。随后 被 Mio ot I . g 2 c sf的 E 0的附 r 3 件和 l . 3的一 部分 使 用。它是 一种 简 单实 用 的方 E 0 3 法。只在表单宇段 中定义一个 f i l e类型的 i u : n t p
页 H ML T 文件 中加入 J V A A程序 片段和 JP标记就构成 S 了 JP网页 。w b 务器在遇 到访 问 JP网页请求时 , S e服 S
尚学堂Struts2_03

版权所有:尚学堂科技
尚学堂
手把手教程
Struts+Hibernate+Spring
Struts2的上传与下载——多文件上传
版权所有:尚学堂科技
尚学堂
手把手教程
Struts+Hibernate+Spring
Struts2的上传与下载——文件下载(Action)
编写用于下载的DownLoadAction 添加String类型属性用于接收下载的文件名
版权所有:尚学堂科技
尚学堂
手把手教程
Struts+Hibernate+Spring
ValueStack——认识ValueStack(二)
值栈(ValueStack)是Struts 2 的一个核心概念,类似于正常的栈,符合 后进先出的栈特点,可以在值栈中放入、删除和查询对象。Struts 2对 OGNL进行了扩充,将值栈作为OGNL的根对象。 ValueStack实际上就是 对OGNL的封装,OGNL主要的功能就是赋值与取值,Struts2正是通过 ValueStack来进行赋值与取值的! 在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会 被压入ValueStack(实际上就是放到ValueStack的Object Stack中),所 以Action对象是Object Stack中的一个元素。
版权所有:尚学堂科技
尚学堂
手把手教程
Struts+Hibernate+Spring
Struts2的上传与下载
回顾Java流:复制文件 Struts2实现单个文件上传 实现任意多个文件的上传,只需要修改上传页面,动态生成多个文件域即 可。( 使用JS实现,详见:addOption.html) 实现上传文件的限制(大小、类型):配置fileUpload拦截器 关于struts2中的大文件上传问题? 上传的错误消息的处理和国际化 文件的下载 文件下载乱码问题
struts2上传文件

1. struts2中的文件上传第一步:在WEB=INF/lib下加入commons-fileupload-1.2.1.jar ,commons-io-1.3.2.jar。
第二步:把form表单的enctype属性设置为"multipart/form-data",如Java代码1.<form action="${pageContext.request.contextPath}/control/employee/list_execute.action" enctype="multipart/form-data" method="p ost">2.文件:<input type="file" name="image">3. <input type="submit" value="上传"/>4. </form>5. //${pageContext.request.contextPath}:获取服务器根路径第三步:在action中添加一下属性,Java代码1.public class HelloWorldAction {2. private File image; //与jsp表单中的名称对应3. private String imageFileName; //FileName为固定格式4. private String imageContentType ;//ContentType为固定格式5.6. public String getImageContentType() {7. return imageContentType;8. }9. public void setImageContentType(String imageContentType) {10. this.imageContentType = imageContentType;11. }12. public String getImageFileName() {13. return imageFileName;14. }15. public void setImageFileName(String imageFileName) {16. this.imageFileName = imageFileName;17. }18. public File getImage() {19. return image;20. }21. public void setImage(File image) {22. this.image = image;23. }24. public String execute() throws Exception{25.System.out.println("imageFileName = "+imageFileName);26.System.out.println("imageContentType = "+imageContentType);27. //获取服务器的根路径realpath28. String realpath = ServletActionContext.getServletContext().getRealPath("/images");29.System.out.println(realpath);30. if(image!=null){31. File savefile = new File(new File(realpath), imageFileName);32. if(!savefile.getParentFile().exists()) savefile.getParentFile().mkdirs();33. FileUtils.copyFile(image, savefile);34. ActionContext.getContext().put("message", "上传成功");35. }else{36. ActionContext.getContext().put("message", "上传失败");37. }38. return "success";39. }40.}此外,可以在struts.xml中配置上传文件的大小<constant name="struts.multipart.maxSize" value="10701096"/> //最大上传配置成10M默认的上传大小为2M思维拓展:如果要上传的文件非常大,如上传的是电影,好几百M ,用web上传一般是不可能难上传成功的,这时候要安装一个插件,类似于应用程序socket ,通过网络通讯上传。
Struts2下多文件的上传与下载

Struts2下多文件的上传与下载目录关键词 (1)写在前面 (1)需求 (1)环境 (2)目录结构 (3)重要文件的看点 (3)web.xml (3)struts.xml (4)UploadAction (5)DownloadAction (8)UploadConfigurationRead (10)工程结果截图 (13)提供原代码下载 (14)关键词多文件上传下载随意文件 java Struts2 单例配置动态读取李顺利写在前面在网络上,对于Java处理文件上传和下载的技术比较多,而Struts作为一款优秀的框架也提供了非常方便的文件上传和下载,而网上的一些例程都非常的不全面,概括来:1)文件上传比较多,多文件上传少一点2)文件下载很少的,看似简单,实则不然3)文件下载一般都是单文件或者固定的文件,并没有(很少)实现随意文件的下载的例子最近也在研究一下文件的上传和下载,在整合网上、浪曦风中叶老师和自己的学习的思想,写了这个工程,提供给大家参考,所以的代码终在IE、FireFox、Chrome测试通过。
需求1.能够对多个文件进行上传(可以选择上传文件个数,也即上传文件个数不定)2.能够对上传路径进行配置文件(upload.properties)指定,使用了一些类似单例模式的静态代码块3.对配置文件中的路径可以进行动态读取(不重启服务器)4.Struts2进行下载处理,能对上传的所有文件进行下载(多个)5.文件保存的名称UUID生成,不过显示并下载的名称都是原文件名称(人性化,通过UploadFiles处理)环境最新的Struts2:struts-2.1.8、MyEclipse、Tomcat、IE、FireFox、Chrome目录结构重要文件的看点web.xml…<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAn dExecuteFilter</filter-class></filter>…在web.xml中使用了最新的Struts2的中央处理器类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter ,而不再是以前的org.apache.struts2.dispatcher.FilterDispatcher,FilterDispatcher在新版本Struts2中已经标注为过时了,请大家尽量使用最新的filter。
Struts上传下载开发指南

byte[] buffer = new byte[8192]; //将数据读入 byte 数组的一部分,其中读入字节数的最大值是 8192,读入的字 节将存储到,buffer[0]到 buffer[0+8190-1]的部分中 //streamIn.read 方法返回的是实际读取字节数目 . 如果读到末尾则返回 -1. 如果 bytesRead 返回为 0 则表示没有读取任何字节。 while ((bytesRead = streamIn.read(buffer, 0, 8192)) != -1) { //写入 buffer 数组的一部分,从 buf[0]开始写入并写入 bytesRead 个字节,这个 write 方法将发生阻塞直至字节写入完成。 streamOut.write(buffer, 0, bytesRead); } //关闭输出输入流,销毁 File 流。 streamOut.close(); streamIn.close(); file.destroy(); String paths=path; System.out.println(paths); //获取文件的名称 String fileName = Chinese.toChinese(fileActionForm.getFileName()); //String fileSize = String.valueOf(file.getFileSize()); String fileDate = DateFormat.getDateInstance().format(date); String sql = "insert into tb_file values('" + fileName + "','" + strFee + "','" + fileDate + "','" + paths + "')"; connection.executeUpdate(sql); connection.closeConnection(); forward=mapping.findForward("upLoadFileResult"); } return forward; } //实现文件的下载 public ActionForward downFile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { String path = request.getParameter("path"); System.out.println(path+"111"); BufferedInputStream bis = null; BufferedOutputStream bos = null; OutputStream fos = null; InputStream fis = null; // 如果是从服务器上取就用这个获得系统的绝对路径方法。 servlet.getServletContext().getRealPath("/" + path); String filepath=path; System.out.println("文件路径"+filepath); String filepath =
Struts2架构中的Commons-fileupload组件应用技术

Struts2架构中的Commons-fileupload组件应用技术李静梅;王超宇【摘要】基于HTTP传输协议的Web网页中,采用嵌人Commons-fileupload组件的Struts2框架,实现了文件的上传与下载.利用OGNL表达式提取Session持久层中的文件名,并利用此文件名实现下载文件的动态更名.灵活利用struts2.0自身提供的字段类型,提高下载的鲁棒性.并列举实例体现整合技术和动态文件下载的实用性,最后通过与以往2种常用开发框架的对比数据加以验证说明.【期刊名称】《应用科技》【年(卷),期】2011(038)004【总页数】5页(P39-43)【关键词】上传下载;Struts2架构;Commons-fileupload组件;OGNL表达式【作者】李静梅;王超宇【作者单位】哈尔滨工程大学,计算机科学与技术学院,黑龙江,哈尔滨,150001;哈尔滨工程大学,计算机科学与技术学院,黑龙江,哈尔滨,150001【正文语种】中文【中图分类】TP311.1随着Internet的飞速发展,越来越多的人参与到网络活动中.博客、Email等网络应用如雨后春笋般大量涌现,它们充分利用了现有的网络资源,不仅给人们的生活带来了巨大的方便,同时也正在逐渐影响、改变着人们的日常生活方式.网络应用的大量涌现,使得在Web页面上完成基于HTTP超文本传输协议的上传下载功能显得越来越重要.针对这一问题,近几年科研院所和一部分公司提出了一些行之有效的可行性框架和解决方案.Struts2就是众多框架中的佼佼者.Struts2凭借其良好的扩展性,使其在Web应用中展现出了特有的优势.Common-fileupload是由阿帕奇基金会旗下的java开源社区Jakarta社区开发的一款组件,主要作OGNL expression用是提供文件管理功能.Jakarta社区是一个非常成熟的社区,不仅有着稳定的开发团队,而且参与过Tomcat的研发,因此在利用Tomcat为服务器的网络应用程序中,Common-fileupload组件在速度和稳定性上都具有一定的优势.1 Struts2框架Struts2是Struts系列框架的第2代产品.是在Struts1和WebWork的技术基础上进行了合并,形成的全新的框架.全新的Struts 2框架与Struts1存在着巨大的差别.Struts2大量地借鉴WebWork相关技术,采用拦截器来处理用户的请求,这样的设计降低了框架的耦合性,提高了框架的性能.1.1 Struts2的体系结构Struts2与传统的Struts框架在整个体系结构上有了很大的变化.下面对Struts2的体系机构作下简要的介绍.图1为Struts2的体系结构图.图1 Struts2体系结构利用struts2体系结构展开的工作严格遵循下述开发流程:1)浏览器发送一个请求;2)核心控制器FilterDispatcher根据请求决定调用合适的Action;3)WebWork的拦截器自动对请求应用调用功能,如验证等;4)回调Action的execute方法,该execute方法根据请求的参数来执行一定的操作;5)Action的execute方法处理的结果信息将被输出到浏览器中,支持多种形式的视图.1.2 Struts2中的拦截器Struts2框架以拦截器为所有功能的基础.根据WebWork的中文文档,其解释为——拦截器是动态拦截Action调用的对象.拦截器提供了一种机制,不仅使开发者可以定义一个在action执行前、后执行的代码,而且可以在一个action执行前阻止其执行,同时还能提供一种可以提取action中可重用部分的方法.当请求到达Struts2的拦截器时,Struts2会查找配置文件,并根据其配置文件实例化拦截器的对象,然后串成一个列表(list),最后按照FIFO算法调用列表中的拦截器实例化改对象.2 文件上传2.1 常用上传方式基于HTTP传输协议的文件上传主要有手工上传和框架上传2种方式.采用手工文件上传方式时是由表单元素中的enctype属性决定提交表单的方式,并最终由该属性决定最终是以字符串方式还是以二进制编码方式提交请求.当enctype的值为multipart/formdata时,无法直接通过HttpServletRequest的getParameter方法获取请求参数的值,需要通过二进制流来获取请求内容,从而实现文件的上传.这种传统手工编码方式相当繁琐,因此很少被采用.框架上传方式是将手工上传中的一些可以由计算机自动执行的部分,由框架替程序员完成,这样大大简化了编程,使程序更易于维护和管理.框架中的解释器通过分析HTTP请求中的二进制流,解析出二进制流中所包含的全部表单域,并分析出每个表单域的类型.基于框架的文件上传,允许开发者以简单的方式来取得文件域的内容字节、文件名以及文件内容等信息.目前主流上传下载组件主要有3种,分别是COS、JspSmartUpload和Commons-fileupload.这 3 种组件的最大作用是提供自己的请求解释器,并通过自身提供的解释器解析HTTP请求.Struts2由于其自身优秀的模块化设计,使程序员可以在其上添加任何一种组件,实现自己的不同要求.经过标准测试发现,当采用JspSmartUpload组件进行文件上传时,若上传文件大于200 M,JspSmartUpload自身会因为堆栈溢出而崩溃,给程序带来不可预知的隐患,因此本组件并不适合负载较重、稳定性要求比较高的应用.而COS组件单就性能上来说,要略高于Commons-fileupload,但由于 Struts2与 Commons-fileupload 有更高的契合度,整合较为方便,因此选择后者成为实际上传时所采用的组件. 2.2 基于Commons-fileupload组件的上传Commons-fileupload组件最重要的组成部分是自己提出的请求解释器.Struts2采用拦截器列表实现具体功能,因此并未提出自己的请求解释器.通过上面的分析知道,要利用框架实现文件上传,在程序提出一个上传请求后,Struts2框架本身无法解析这样处理请求,因此文中在实现上传这个功能时的主要贡献就是将Commons-fileupload组件中的请求解释器集成到Struts2.0框架中,通过traditional-API实现整合的方案[1-3].在测试了上述整合方案后,发现利用traditionalAPI实现文件上传占用的内存较多,上传速度较慢.通过阅读官方资料发现common-fileupload组件提供了2种请求解释器,分别是TraditionalAPI 和StreamingAPI这2种方式.经具体测试发现,利用StreamingAPI方式实现上传,能有效降低内存占用量,并能提高上传速度.因此这里采用StreamingAPI解释器实现文件上传.当有multipart/formdata请求时,Struts2.0中的拦截器会将请求拦截下来,并通过配置文件中关于解释器的配置信息,调用Commons-fileupload组件中相应的请求解释器对请求作出分析,通过isFormfiled()方法判断表单是一个普通的表单还是一个文件域,最后将解析出来的信息按照数据流方式传给Struts2框架的拦截器,Struts2将对数据进行进一步的操作.图2 文件上传的过程流程实现文件上传的功能逻辑关系如图2所示.在上述理论指导下,在此按照文件上传功能逻辑关系图进行了实际开发,通过实际程序验证了上述理论.Struts2中的Action并不负责处理HttpServletRequest请求,只是通过拦截器获得文件内容、文件名称和文件类型3个属性值.文件提交到后台时,拦截器通过3个属性值来过滤文件,同时将获得的属性值传递给Commons-fileupLoad组件的解释器,如果程序在完成上述关系图上任何一步出错时,拦截器都会返回错误信息.3 文件下载3.1 利用Stream类型字段解决字符库不匹配问题下载文件时,一般将传输数据的数据类型定义为数据库中的数据类型[4-5],这样的优势是数据不需进行转换就可在前台页面与数据库之间来回传递并显示,降低了编程的难度.但其也存在一个致命的缺陷,就是如果数据库与前台页面字符集不匹配,将造成前台页面显示乱码现象.经过分析与研究发现,在Struts2框架中有一种Stream结果类型,它的本意是处理流类型的数据,例如图片和音乐.通过试验发现只要对数据进行适当的更改,Stream这个字段类型除了可以处理图片、声音等数据外,还可以很好地解决字符库不匹配问题.在提取数据库中数据时,利用 StringBufferInput-Stream函数将数据转换成二进制流信息,然后通过Stream字段将二进制流信息传到程序的前台,在前台利用解析程序将二进制流信息还原成原始信息进行展示.由于采用ASCII码形式传送数据,字符库不匹配问题消弭于无形,大大提高了系统的鲁棒性.3.2 利用OGNL表达式提取session内的文件名OGNL(object-graph navigation language)是一种功能强大的表达式语言,通过表达式语法,可以实现存取对象的任意属性、调用对象的方法、遍历整个对象的结构图、字段类型转化等功能.通过OGNL强大的存取功能,实现了文件下载时的动态更名.当用户点击下载时,后台程序中的OGNL表达式会在整个程序的Session持久层中按照ID号提取文件名,并在调用Windows下载API之前将文件名以动态赋值的方式传给下载API,这样在下载对话框中显示出来的就已经是要下载的文件名,而并非像传统的处理方式那样,在下载完毕后更新文件名.用户可以在下载的过程中直观地了解自己所下载文件的名字.动态文件下载的基本流程如图3所示.图3 实现的下载功能过程流程4 Struts2与2类常用开发框架比较Struts2框架是在Struts1和WebWork的技术基础上进行了合并,形成的全新的框架.在大量吸收原有框架的优点后,Struts 2已经是一个非常具有实用价值的MVC框架.与传统Struts框架相比,Struts2在Action类的实现上更为方便,在线程安全和可测试方面做得都要更好.Struts2相比WebWork来说,不再提供内在的IoC容器支持,转而将Spring作为缺省实现,扬长避短,提高了用户体验,同时Struts2还全面引入了Dojo.5 应用实例测试文件上传下载在工作流引擎中的应用相当广泛,选择一种高效的文件上传下载在工作流引擎中有其重要的实用价值.jBPM(java业务流程管理)是一种基于J2EE的轻量级工作流管理系统,其后成为JBoss企业中间件平台的一个组成部分,改名为JBoss jBPM.以Struts2框架为jBPM开发的工作流引擎,便捷地增加一个文件上传下载模块.整合思想是利用Struts2作为工作流引擎的MVC框架,将Commons-Fileuplod 作为容器,把Struts2的控制与业务逻辑组件相分离.下面是嵌入了Commons-fileUpload组件的Struts2框架关于上传下载应用的配置文件和核心代码:1)Struts.xml配置文件核心代码:上述代码为实现将Commons-fileupload组件中的解释器嵌入到Struts2中的配置文件代码和通过Stream字段类型以二进制流的形式传输数据库内数据的核心代码.下面为了凸显文中提出整合方式的优势,通过标准测试上传了4次大小不同的文件,上传不同大小文件耗时对比结果见表1.表1 不同组件在上传文件时的耗时对比 ms组件名称2 M 20 M 45 M 200 M COS 245 2 391 5 000 53 520 Commons-fileupload 297 3 293 6 700 76 210 JspSmartUpload 536 4 371 8 745堆栈溢出为使对比更直观、明显,这里参照上述数据绘制了具体如图4所示,嵌入不同组件的Struts2框架上传速度对比图.图4 嵌入不同组件的Struts2框架上传速度对比一般系统所要上传下载的文件大小主要集中在2~45 M区间内,但难免有可能会出现上传下载大文件的时候,因此选择上述几个文件大小作为测试上传的测试集[6].根据图4可以看出,上传20 M左右的文件时,采用了Commons-fileupload和COS组件的速度性能相差无几,但是JspSmartUpload与其他2种的差距就已经很明显了,当文件大于200 M时,JspSmartUpload已经因为堆栈溢出而崩溃了.通过表格和对比图可以发现,采用Commons-fileupload组件的系统无论从速度还是稳定性上都比JspSmartUpload组件有很大提高.Commons-fileupload与COS在上传速度与稳定性上差别不大,但是Commons-fileupload比COS更易于整合到Struts2框架中;因此从系统整体的开发效率和性能上来说,Commons-fileupload组件无疑是最佳选择,同时也更适合以业务为主的web环境.6 结束语提出了一种将Commons-fileupload组件嵌入到Struts2中形成的新框架,该框架已成功地应用于多种文件上传下载系统中.通过实际使用证明:带有新元素的Struts2框架,提高了文件上传下载的速度,通过文件动态更名,增加了文件上传下载的实用性.通过实验证明了新框架在文件上传速度和准确率上的优越性.基于Struts2形成的新框架不拘泥于一种文件形式,符合文件上传下载的通用性,有利于文件上传下载功能的推广,具有良好的应用前景.参考文献:[1]WU M.Analytical method for the lateral buckling of the struts in beam string structures[J].Engineering Structures,2008,30(9):2301-2310. [2]SAHOO D K,GAUTERM R K.Strength and deformation characteristics of bottle-shaped struts[J].Magazine of Concrete Research,2008,8(9):137-144.[3]于银山,胡正华.基于Struts2框架的Web应用开发[J].电脑知识与技术,2009,5(16):59-62.[4]段旭光,李岚,董立岩,等.基于HTTP文件上传进度显示组件的设计及实现[J].吉林大学学报:信息科学版,2006,24(1):89-93.[5]李林珊,郑丽娅.基于JXL的数据导入导出处理[J].计算机软件与应用,2008,27(9):95-96.[6]刘锦锦.基于Struts框架的Web网站开发及数据分析[D].北京:北京化工大学,2005.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
struts2多文件上传下载文件上传:1,upload.jsp如下:<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <%@ taglib prefix="s" uri="/struts-tags"%><%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";%><title>My JSP 'upload.jsp' starting page</title><!--下面script实现多文件上传--><script type ="text/javascript">function onMore(){var td =document.getElementById("more");varbr = document.createElement("br");var input = document.createElement("input");var button = document.createElement("input");input.type = "file";="file";button.type="button";button.value="删除";//当点击删除时,删除一行。
button.onclick = function(){td.removeChild(br);td.removeChild(input);td.removeChild(button);}// 下面三句增加一行。
td.appendChild(br);td.appendChild(input);td.appendChild(button);}</script></head><body><table align = "center"><tr><td><s:fielderrorcssStyle="color:red"></s:fielderror></td></tr></table><s:form action="upload" theme="simple" method="post" enctype="multipart/form-data"> <table align="center" border="1" width="60%"><tr><td>文件</td><td id = "more"><s:file name="file"></s:file><input type = "button" value = "更多.." onclick = "onMore()"></td></tr><br><tr><td><s:submit value="submit"></s:submit></td><td><s:reset value="reset"></s:reset></td></tr></table></s:form></body></html>2.struts.xml配置:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""/dtds/struts-2.0.dtd"><struts><constant name="struts.custom.i18n.resources" value="message"></constant> <!-- 上传文件编码--><constant name="struts.i18n.encoding" value="gbk"></constant><!-- 上传文件临时文件位置--><constant name="struts.multipart.saveDir" value="c:\"></constant><package name="struts2" extends="struts-default"><action name="upload" class = "com.struct2.test.UploadAction"> <result name = "success">/UpLoad/uploadresult.jsp</result><result name = "input">/UpLoad/upload.jsp</result><interceptor-ref name="fileUpload"><!-- 单个上传文件的最大值--><param name="maximumSize">409600</param><!-- 只能上传的文件的类型,可到tomcat的web-xml中查看各种文件类型--> <param name="allowedTypes">text/html</param></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></action></package>3.UploadAction.jsp:package com.struct2.test;importjava.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.util.List;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport {private String username;private String password;private List<File> file;private List<String>fileFileName;//文件名+FileName private List<String>fileContentType;//文件名+ContentType public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public List<File>getFile() {return file;}public void setFile(List<File> file) {this.file = file;}public List<String>getFileFileName() {return fileFileName;}public void setFileFileName(List<String>fileFileName) {this.fileFileName = fileFileName;}public List<String>getFileContentType() {return fileContentType;}public void setFileContentType(List<String>fileContentType) { this.fileContentType = fileContentType;}@Overridepublic String execute() throws Exception {for(int i = 0 ;i<file.size();++i){System.out.println(file.get(i));if(!file.get(i).exists()){return INPUT;}//拿到上传的文件InputStream is = new FileInputStream(file.get(i));//设置文件存储位置.String root = ServletActionContext.getRequest().getRealPath("/UpLoad");File destFile = new File(root,this.getFileFileName().get(i));//将上传得到的文件输出.OutputStreamos = new FileOutputStream(destFile);byte[] buffer = new byte[400];int length = 0;while((length=is.read(buffer))>0){os.write(buffer,0,length);}is.close();os.close();}return SUCCESS;}}</struts>4.uploadresult.jsp ...............................<body>username:<s:property value="username"/><br>password:<s:property value = "password"/><br>file:<s:property value = "fileFileName"/></body>文件下载:1.download.jsp:<body><a href = "download.action">下载</a></body>2.struts.xml中配置:<action name="download" class = "com.struct2.test.DownloadAction"> <result name = "success" type = "stream"><!-- 设置为attachment,否则浏览器直接打开而不会出现下载页面--> <paramname="contentDisposition">attachment;filename=${fileName}</param> <!-- downloadFile为DownloadAction中的方法名中的属性--><param name="inputName">downloadFile</param><!-- 下载文件的类型,可到tomcat的web-xml中查看各种文件类型--> <param name="contentType">text/html</param><!-- 输出时缓冲区的大小--><param name="bufferSize">4096</param></result>3.DowmloadAction.javapackage com.struct2.test;importjava.io.InputStream;import java.io.UnsupportedEncodingException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class DownloadAction extends ActionSupport {//String fileName = "";public InputStream getDownloadFile(){return ServletActionContext.getServletContext().getResourceAsStream("/下载中文文件测试.html"); }@Overridepublic String execute() throws Exception {//这里添加下载权限设置.return SUCCESS;}public String getFileName() {// DateFormatdf = new SimpleDateFormat("yyyy-MM-dd");String fileName = "下载中文文件测试.html";// fileName = "序列号(" + df.format(new Date()) + ").html";try {//设置下载文件名编码return new String(fileName.getBytes(), "ISO8859-1");} catch (UnsupportedEncodingException e) {return "impossible.txt";}}}国际化资源文件message.properties:xwork.default.invalid.fieldvalue={0}\u8f93\u5165\u9519\u8befrge=File too largestruts.messages.error.content.type.not.allowed=file type not be allowed下载文档收藏struts2实现多文件上传struts2实现多文件上传Struts2 实现多文件上传实现原理 Struts 2 是通过 Commons FileUpload 文件上传。