通过2种方式模拟单个文件上传,效果如下所示
第二种
struts.xml配置文件
上传表单页面
显示结果页面
开发步骤如下:
1、新建一个web工程,导入struts2上传文件所需jar,如下图
目录结构
2、新建Action
- package com.ljq.action;
- import java.io.File;
- import org.apache.commons.io.FileUtils;
- import org.apache.struts2.ServletActionContext;
- import com.opensymphony.xwork2.ActionContext;
- import com.opensymphony.xwork2.ActionSupport;
- @SuppressWarnings("serial")
- public class UploadAction extends ActionSupport{
- private File image; //上传的文件
- private String imageFileName; //文件名称
- private String imageContentType; //文件类型
- public String execute() throws Exception {
- //设置文件上传的路径默认在当前项目的根目录下
- String realpath = ServletActionContext.getServletContext().getRealPath("/images");
- //D:\apache-tomcat-6.0.18\webapps\struts2_upload\images
- System.out.println("realpath: "+realpath);
- if (image != null) {
- File savefile = new File(new File(realpath), imageFileName);
- if (!savefile.getParentFile().exists())
- savefile.getParentFile().mkdirs();
- FileUtils.copyFile(image, savefile);
- ActionContext.getContext().put("message", "文件上传成功");
- }
- return "success";
- }
- get.set方法省略
- }
第二种
- package com.ljq.action;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import org.apache.struts2.ServletActionContext;
- import com.opensymphony.xwork2.ActionSupport;
- @SuppressWarnings("serial")
- public class UploadAction2 extends ActionSupport {
- // 封装上传文件域的属性
- private File image;
- // 封装上传文件类型的属性
- private String imageContentType;
- // 封装上传文件名的属性
- private String imageFileName;
- // 接受依赖注入的属性
- private String savePath;
- @Override
- public String execute() {
- FileOutputStream fos = null;
- FileInputStream fis = null;
- try {
- // 建立文件输出流
- System.out.println(getSavePath());
- fos = new FileOutputStream(getSavePath() + "\\" + getImageFileName());
- // 建立文件上传流
- fis = new FileInputStream(getImage());
- byte[] buffer = new byte[1024];
- int len = 0;
- while ((len = fis.read(buffer)) > 0) {
- fos.write(buffer, 0, len);
- }
- } catch (Exception e) {
- System.out.println("文件上传失败");
- e.printStackTrace();
- } finally {
- close(fos, fis);
- }
- return SUCCESS;
- }
- /**
- * 返回上传文件的保存位置
- *
- * @return
- */
- public String getSavePath() throws Exception{
- return ServletActionContext.getServletContext().getRealPath(savePath);
- }
- public void setSavePath(String savePath) {
- this.savePath = savePath;
- }
- public File getImage() {
- return image;
- }
- public void setImage(File image) {
- this.image = image;
- }
- public String getImageContentType() {
- return imageContentType;
- }
- public void setImageContentType(String imageContentType) {
- this.imageContentType = imageContentType;
- }
- public String getImageFileName() {
- return imageFileName;
- }
- public void setImageFileName(String imageFileName) {
- this.imageFileName = imageFileName;
- }
- private void close(FileOutputStream fos, FileInputStream fis) {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- System.out.println("FileInputStream关闭失败");
- e.printStackTrace();
- }
- }
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException e) {
- System.out.println("FileOutputStream关闭失败");
- e.printStackTrace();
- }
- }
- }
- }
struts.xml配置文件
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <!-- 该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
- 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 -->
- <constant name="struts.action.extension" value="do,action" />
- <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->
- <constant name="struts.serve.static.browserCache" value="false" />
- <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->
- <constant name="struts.configuration.xml.reload" value="true" />
- <!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
- <constant name="struts.devMode" value="true" />
- <!-- 默认的视图主题 -->
- <constant name="struts.ui.theme" value="simple" />
- <!--<constant name="struts.objectFactory" value="spring" />-->
- <!--解决乱码 -->
- <constant name="struts.i18n.encoding" value="UTF-8" />
- 相当于request.setCharacterEncoding("utf-8");
- <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
- <constant name="struts.multipart.maxSize" value="10701096"/>
- <!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
- <constant name="struts.multipart.saveDir " value="d:/tmp" />
- strtus2框架默认加载的文件
- <constant name="struts.configuration.files" value="struts-default.xml,struts-plugin.xml,struts.xml"/>
- <constant name="struts.i18n.reload" value="true"/> 该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false,
提示 开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能
- <package name="upload" namespace="/upload" extends="struts-default">
- <action name="*_upload" class="com.ljq.action.UploadAction" method="{1}">
- <result name="success">/WEB-INF/page/message.jsp</result>
- </action>
- </package>
- <package name="upload2" extends="struts-default">
- <action name="upload2" class="com.ljq.action.UploadAction2" method="execute">
- <!-- 动态设置savePath的属性值 -->
- <param name="savePath">/images</param>
- <result name="success">/WEB-INF/page/message.jsp</result>
- <result name="input">/upload/upload.jsp</result>
- <interceptor-ref name="fileUpload">
- <!-- 文件过滤 -->
- <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
- <!-- 文件大小, 以字节为单位 -->
- <param name="maximumSize">1025956</param>
- </interceptor-ref>
- <!-- 默认拦截器必须放在fileUpload之后,否则无效 -->
- <interceptor-ref name="defaultStack" />
- </action>
- </package>
- </struts>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。
如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 -->
<constant name="struts.action.extension" value="do" />
<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->
<constant name="struts.devMode" value="true" />
<!-- 默认的视图主题 -->
<constant name="struts.ui.theme" value="simple" />
<!--<constant name="struts.objectFactory" value="spring" />-->
<!--解决乱码 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
<constant name="struts.multipart.maxSize" value="10701096"/>
<!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
<constant name="struts.multipart.saveDir " value="d:/tmp" />
<package name="upload" namespace="/upload" extends="struts-default">
<action name="*_upload" class="com.ljq.action.UploadAction" method="{1}">
<result name="success">/WEB-INF/page/message.jsp</result>
</action>
</package>
<package name="upload2" extends="struts-default">
<action name="upload2" class="com.ljq.action.UploadAction2" method="execute">
<!-- 动态设置savePath的属性值 -->
<param name="savePath">/images</param>
<result name="success">/WEB-INF/page/message.jsp</result>
<result name="input">/upload/upload.jsp</result>
<interceptor-ref name="fileUpload">
<!-- 文件过滤 -->
<param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param>
<!-- 文件大小, 以字节为单位 -->
<param name="maximumSize">1025956</param>
</interceptor-ref>
<!-- 默认拦截器必须放在fileUpload之后,否则无效 -->
<interceptor-ref name="defaultStack" />
</action>
</package>
</struts>
上传表单页面
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>文件上传</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- </head>
- <body>
- <!-- ${pageContext.request.contextPath}/upload/execute_upload.do -->
- <!-- ${pageContext.request.contextPath}/upload2/upload2.do -->
- <form action="${pageContext.request.contextPath}/upload2/upload2.do"
- enctype="multipart/form-data" method="post">
- 文件:<input type="file" name="image">
- <input type="submit" value="上传" />
- </form>
- <br/>
- <s:fielderror />
- </body>
- </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>文件上传</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<!-- ${pageContext.request.contextPath}/upload/execute_upload.do -->
<!-- ${pageContext.request.contextPath}/upload2/upload2.do -->
<form action="${pageContext.request.contextPath}/upload2/upload2.do"
enctype="multipart/form-data" method="post">
文件:<input type="file" name="image">
<input type="submit" value="上传" />
</form>
<br/>
<s:fielderror />
</body>
</html>
显示结果页面
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib uri="/struts-tags" prefix="s"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>上传成功</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- </head>
- <body>
- 上传成功!
- <br/><br/>
- <!-- ${pageContext.request.contextPath} tomcat部署路径,
- 如:D:\apache-tomcat-6.0.18\webapps\struts2_upload\ -->
- <img src="${pageContext.request.contextPath}/<s:property value="'images/'+imageFileName"/>">
- <s:debug></s:debug>
- </body>
- </html>
- Struts2框架通过validateable实现数据验证功能
- ActionSupport类实现了validateable接口(该接口一个方法validate()方法),
- public ValidateAction extends ActionSupport implments Validateable{
- private String msg;
- get.set方法……
- public String validate(){
- System.out.println("success");
- return "success";
- }
- public void validate(){
- if(msg.equalsEgnormal("hello")){
- this.addActionMessage("提交成功");
- }else{
- System.out.pritnln(“input”);
- this.addFieldError("msg.hello","必须输入hello");
- this.addActioinError("表单提交失败");
- }
- }
- }
- validate.jsp页面:
- <s:actionerror/>动作错误信息,有则显示无则不显示
<s:fielderror/>字段错误信息,有则显示无则不显示
<s:actionmessage/>动作信息,有则显示无则不显示
<s:form action="file/ValidateAction_execute.action" theme="simple">
<s:textfield name="msg"></s:textfield>
<!-- 错误信息 -->
<s:fielderror cssStyle="color:red"></s:fielderror>
<s:actionerror key="msg.hello" cssStyle="color:blue"/>
<br/>
<s:submit/>
</s:form> - struts.xml文件
- <package name="defaultPackage" extends="struts-default" namespace="/file">
<action name="*_*" class="useraction.{1}" method="{2}">
<!-- 配置fileUpload的拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型 -->
<param name="allowedTypes"></param>
<!-- 配置允许上传的文件大小 单位字节-->
<param name="maximumSize">1000</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<result name="success">/success.jsp</result>
<result name="input">/AddProducts.jsp</result>
<result>/validate.jsp</result>
<result name="input">/validate.jsp</result>//input返回至是struts2默认的在action 里面配置 - 请求在进入Action里面首先调用validate()方法,正确才会继续调用execute()方法,否则不调用。