Struts2学习总结(2)--数据接收,数据共享,类型转换,上传下载

本文包括以下两个部分:

1. Struts2的基本配置和通用功能。

2. Struts2的核心功能:数据接收,数据共享,类型转换,上传下载。

一、Struts2的基本配置和通用功能

1.1 Struts2中action类的三种写法

1.1.1 第一种写法:action类不实现任何接口,不继承任何类。

[java]  view plain  copy
 print ?
  1. package edu.scut.a_action;  
  2. public class UserAction1 {  
  3.     public String login(){  
  4.         System.out.println("执行了UserAction1!");  
  5.         return "success";  
  6.     }  
  7. }  

1.1.2 第二种写法:action类实现Action接口。

优点:a. 为action类提供了一个默认的execute方法;

            b. 为action类提供了常用的视图标记字符串,例如:SUCCESS、ERROR、INPUT、NONE、LOGIN。

[java]  view plain  copy
 print ?
  1. package edu.scut.a_action;  
  2. import com.opensymphony.xwork2.Action;  
  3. //实现action接口  
  4. public class UserAction2 implements Action{  
  5.   
  6.         @Override  
  7.         public String execute() throws Exception {  
  8.         System.out.println("执行了UserAction2!");  
  9.         return SUCCESS;  
  10.         }  
  11.   
  12. }  

1.1.3 第三种写法:action类继承ActionSupport类(常用方法)。

优点:a. 为action类提供了Action接口的默认实现,默认跳转到SUCESS;

            b. 为action类提供了常用的视图标记字符串,例如:SUCCESS、ERROR、INPUT、NONE、LOGIN。

            c. 为action类额外提供了数据表单验证以及国际化等功能。

[java]  view plain  copy
 print ?
  1. package edu.scut.a_action;  
  2. import com.opensymphony.xwork2.ActionSupport;  
  3. //继承actionSupport接口  
  4. public class UserAction3 extends ActionSupport{  
  5.     public String login(){  
  6.         System.out.println("执行了UserAction3!");  
  7.         return SUCCESS;  
  8.     }  
  9. }  

1.2 Struts2的常量配置

Struts2的常量配置文件在struts2-core-2.3.4.1.jar当中,查找路径为: /org/apache/struts2/default.properties(这是Struts2的默认常量配置文件!)

1.2.1 常用的常量配置:

a. struts.i18n.encoding. 请求参数的编码,相当于servlet中的request.setCharacterEncoding("utf-8")。

b. struts.multipart.parser. 文件上传使用的组件,默认为jakarta。

c. struts.multipart.saveDir. 文件上传时使用的临时目录,默认为windows的临时目录。       

d. struts.multipart.maxSize. 文件上传时最大的文件大小,默认为2MB。

e. struts.action.extension. action访问的后缀名, 默认为 action。

f.  struts.enable.DynamicMethodInvocation. 动态方法调用,默认为true,一般只在开发调试阶段使 用,建议项目上线时关闭此功能。

g. struts.ui.theme. struts2的UI的主题,默认为 xhtml。

1.2.2 Struts2的常量配置可以修改,在struts.xml文件中添加配置就可以将默认的配置覆盖。

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.      <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5. <struts>  
  6.     <!-- 动态方法调用 -->  
  7.     <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>  
  8.     <!-- 编码设置 -->  
  9.     <constant name="struts.i18n.encoding" value="utf-8"></constant>  
  10.     <!-- 扩展名称 -->  
  11.     <constant name="struts.action.extension" value="action"></constant>  
  12.   
  13.        <package name="constant" extends="struts-default" namespace="/constant">  
  14.         <action name="user_*" class="edu.scut.b_constant.UserAction" method="{1}">  
  15.             <result>/index.jsp</result>  
  16.         </action>  
  17.     </package>  
  18. </struts>  

1.3 action的全局视图和默认视图

1.3.1 全局视图

作用:在当前package下面的所有action都可以共享这个视图。

注意:如果在action中配置了同名的视图则会覆盖全局视图。

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.      <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5. <struts>  
  6.     <package name="constant" extends="struts-default" namespace="/constant">  
  7.         <!-- 配置全局视图 -->  
  8.         <global-results>  
  9.             <result>/index.jsp</result>  
  10.         </global-results>  
  11.       
  12.         <action name="user_*" class="edu.scut.b_constant.UserAction" method="{1}">  
  13.             <result>/index.jsp</result>  
  14.         </action>  
  15.     </package>  
  16. </struts>  

1.3.2 默认视图

注意:通常使用action的默认配置可以进行WEB-INF目录下的页面跳转,如下代码中的第2个action。

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.      <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5. <struts>  
  6.     <package name="constant" extends="struts-default" namespace="/constant">  
  7.         <!-- 配置全局视图 -->  
  8.         <global-results>  
  9.             <result>/index.jsp</result>  
  10.         </global-results>  
  11.           
  12.                 <action name="book" class="edu.scut.b_constant.BookAction" method="add">  
  13.         </action>  
  14.   
  15.                 <action name="types">  
  16.                          <result>/WEB-INF/user.jsp</result>  
  17.                 </action>  
  18.         </package>  
  19. </struts>  

 
 

1.4 注入action属性

作用:action的参数可以通过struts.xml文件设置到action中。

Example

需求:将c:/f.jpg图片复制到/c:targetFile/路径下。

注入属性的步骤:

a. 在对应action的配置中进行配置。

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.      <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5. <struts>  
  6.     <package name="property" extends="struts-default" namespace="/property">  
  7.         <action name="book" class="edu.scut.c_property.BookAction" method="addBook">  
  8.             <param name="serverPath">/c:targetFile/</param>  
  9.             <result name="success" >/index.jsp</result>  
  10.         </action>  
  11.     </package>  
  12. </struts>  

b. 在对应的action类中提供一个同名的setter方法。

[java]  view plain  copy
 print ?
  1. package edu.scut.c_property;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import org.apache.commons.io.FileUtils;  
  7. import com.opensymphony.xwork2.ActionSupport;  
  8.   
  9. public class BookAction extends ActionSupport {  
  10.     //通过配置注入action参数  
  11.     private String serverPath;  
  12.     public void setServerPath(String serverPath) {  
  13.         this.serverPath = serverPath;  
  14.     }  
  15.   
  16.     public String addBook() throws Exception{  
  17.         //1 接受图片的内容  
  18.         File file = new File("c:/f.jpg");  
  19.         FileInputStream fis = new FileInputStream(file);  
  20.           
  21.         //2 保存到硬盘  
  22.         FileUtils.copyInputStreamToFile(fis, new File(serverPath+file.getName()));  
  23.         return SUCCESS;  
  24.     }  
  25. }  

二、Struts2的核心功能

2.1 页面请求参数的三种接收方式

在Struts2框架中,有关于接参数的拦截器:com.opensymphony.xwork2.interceptor.PrepareInterceptor 。其作用是:把表单用户填写的数据接收过来,然后通过Action的setter方法赋值给Action类。因此,使用Struts2框架时,访问action,一般都要经过这个拦截器。

2.1.1 第一种方式:基本类型数据的接收

优点:参数数量少的时候比较简单使用。

缺点:如果参数数量多的时候,必须每个参数在Action类中提供setter方法逐个接收。

表单代码:

[html]  view plain  copy
 print ?
  1. <form action="${pageContext.request.contextPath }/constant/user_login.action" method="post">  
  2.     用户名:<input type="text" name="name"><br>  
  3.     密码:<input type="password" name="password"><br>  
  4.     <input type="submit" value="登录">  
  5. </form>  

Action代码:

[java]  view plain  copy
 print ?
  1. package edu.scut.d_param;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4. //1 采用setter方法的形式进行接收,接收基本数据类型,适合接受少量的数据  
  5. public class UserAction1 extends ActionSupport {  
  6.     private String name;  
  7.     private String password;  
  8.     public void setName(String name) {  
  9.         this.name = name;  
  10.     }  
  11.     public void setPassword(String password) {  
  12.         this.password = password;  
  13.     }  
  14.       
  15.     //注册方法  
  16.     public String reg(){  
  17.         System.out.println("执行了注册方法!");  
  18.         System.out.println(name);  
  19.         System.out.println(password);  
  20.         return SUCCESS;  
  21.     }  
  22. }  

2.1.2 第二种方式:JavaBan类型数据的接收

注意:在action类中必须同时提供getter和setter方法。

优点:a. 参数多的时候更方便地接收。
            b. 可以接收多个不同的表单(即封装多个不同的对象)。

缺点:需要修改表单的name属性值。name属性的值都要写成(实体类名.属性名)的形式。

表单代码:

[html]  view plain  copy
 print ?
  1. <form action="${pageContext.request.contextPath }/constant/user_login.action" method="post">  
  2.     用户名:<input type="text" name="user.name"><br>  
  3.     密码:<input type="password" name="user.password"><br>  
  4.     <input type="submit" value="登录">  
  5. </form>  

User类代码:

[java]  view plain  copy
 print ?
  1. package edu.scut.d_param;  
  2. import java.util.Arrays;  
  3. //约定:javabean的属性名称和表单的那么属性保持一致  
  4. public class User {  
  5.     private String name;  
  6.     private String password;  
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.     public void setName(String name) {  
  11.         this.name = name;  
  12.     }  
  13.     public String getPassword() {  
  14.         return password;  
  15.     }  
  16.     public void setPassword(String password) {  
  17.         this.password = password;  
  18.     }  
  19.   
  20.        @Override  
  21.     public String toString() {  
  22.         return "User [name=" + name + ", password=" + password +  "]";  
  23.     }  
  24. }  

Action代码:

[java]  view plain  copy
 print ?
  1. package edu.scut.d_param;  
  2. import com.opensymphony.xwork2.ActionSupport;  
  3. //2 采用javaBean的形式接受数据,表单的name一定要写成user.name的形式  
  4. public class UserAction2 extends ActionSupport {  
  5.     private User user;  
  6.     //必须同时提供setter和getter方法  
  7.     public User getUser() {  
  8.         return user;  
  9.     }  
  10.     public void setUser(User user) {  
  11.         this.user = user;  
  12.     }  
  13.   
  14.     //注册方法  
  15.     public String reg(){  
  16.         System.out.println("执行了注册方法!");  
  17.         System.out.println(user);  
  18.         return SUCCESS;  
  19.     }  
  20. }  

2.1.3 第三种方式:模型驱动的方法,action类实现ModelDriven接口

注意:

       a. Action类实现ModelDriven接口。
       b. 实现getModel()方法。
       c. 在Action类声明一个对象的成员变量在getModel方法中去接收表单的数据。

       d. 一定要给对象初始化(private User user=new User())。

优点:a. 参数多的时候更方便地接收。
            b. 不用修改表单。

             缺点:只能接收一个表单(只能封装一个对象)。

表单代码:

[html]  view plain  copy
 print ?
  1. <form action="${pageContext.request.contextPath }/constant/user_login.action" method="post">  
  2.         用户名:<input type="text" name="name"><br>  
  3.         密码:<input type="password" name="password"><br>  
  4.         <input type="submit" value="登录">  
  5.  </form>  

User类代码:

[java]  view plain  copy
 print ?
  1. package edu.scut.d_param;  
  2. import java.util.Arrays;  
  3. public class User {  
  4.     private String name;  
  5.     private String password;  
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public String getPassword() {  
  13.         return password;  
  14.     }  
  15.     public void setPassword(String password) {  
  16.         this.password = password;  
  17.     }  
  18.     @Override  
  19.     public String toString() {  
  20.         return "User [name=" + name + ", password=" + password +  "]";  
  21.     }  
  22. }  

Action代码:

[java]  view plain  copy
 print ?
  1. package edu.scut.d_param;  
  2. import com.opensymphony.xwork2.ActionSupport;  
  3. import com.opensymphony.xwork2.ModelDriven;  
  4. //采用modledriver的方式  
  5. public class UserAction3 extends ActionSupport<span style="color:#FF0000;"implements ModelDriven<User> </span>{  
  6.      private User user= new User();  
  7.     //一定要实现getModel方法  
  8.     @Override  
  9.     public User getModel() {  
  10.         return user;  
  11.     }  
  12.       
  13.     //注册方法  
  14.     public String reg(){  
  15.         System.out.println("执行了UserAction的注册方法!");  
  16.         System.out.println(user);  
  17.         return SUCCESS;  
  18.     }  
  19. }  

2.2 数据共享的三种方式

2.2.1 第一种方式:使用原生的servlet的api进行域对象共享

优点:

a. 可以使用servlet中的类。

b. 可以通过原生的request对象获取用户的浏览器的信息。

缺点:

依赖了servlet的api,而strut2框架并不建议使用servlet的api。

Book实体类代码:

[java]  view plain  copy
 print ?
  1. package edu.scut.e_data;  
  2. import java.io.Serializable;  
  3. public class Book implements Serializable {  
  4.     private String name;  
  5.     private double price;  
  6.     public Book() {  
  7.         super();  
  8.     }  
  9.     public Book(String name, double price) {  
  10.         super();  
  11.         this.name = name;  
  12.         this.price = price;  
  13.     }  
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20.     public double getPrice() {  
  21.         return price;  
  22.     }  
  23.     public void setPrice(double price) {  
  24.         this.price = price;  
  25.     }  
  26. }  

Action代码:

[java]  view plain  copy
 print ?
  1. package edu.scut.e_data;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import javax.servlet.ServletContext;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpSession;  
  8. import org.apache.struts2.ServletActionContext;  
  9. import com.opensymphony.xwork2.ActionSupport;  
  10.   
  11. //1 采用域对象实现数据共享,servlet的api共享数据  
  12. public class BookAction1 extends ActionSupport{  
  13.     public String list(){  
  14.         List<Book> books = new ArrayList<Book>();  
  15.         for(int i=0; i<5; i++){  
  16.             books.add(new Book("java编程思想"+i,50+i*5));  
  17.         }  
  18.           
  19.         //共享数据  
  20.         //request域  
  21.         HttpServletRequest request = ServletActionContext.getRequest();  
  22.         request.setAttribute("r_books", books);  
  23.           
  24.         //session域  
  25.         HttpSession session = request.getSession();  
  26.         session.setAttribute("s_books", books);  
  27.           
  28.         //context域  
  29.         ServletContext context = ServletActionContext.getServletContext();  
  30.         context.setAttribute("c_books", books);  
  31.           
  32.         return SUCCESS;  
  33.     }  
  34. }  

2.2.2 第二种方式:使用struts2提供的三个Map集合对象来共享数据

         RequestMap: 封装了HttpServletRequest对象
         SessionMap :封装了HttpSession对象
         ApplicationMap: 封装了ServletContext对象

优点:

a. 不依赖于servlet的api,可以更加方便地去测试action类。

b. 给jsp页面共享更多的数据。

缺点:

Action类中的每个方法都必须重新获取Map集合才能共享数据。

Action代码:

[java]  view plain  copy
 print ?
  1. package edu.scut.e_data;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import com.opensymphony.xwork2.ActionContext;  
  7. import com.opensymphony.xwork2.ActionSupport;  
  8.   
  9. //第二种方式 使用Struts2提供三个MAP集合进行数据共享  
  10. public class BookAction2 extends ActionSupport {  
  11.     public String list(){  
  12.         //模拟数据  
  13.         List<Book> books = new ArrayList<Book>();  
  14.         for(int i = 0 ; i<5; i++){  
  15.             books.add(new Book("计算机网络"+i,50+i*5));  
  16.         }  
  17.           
  18.         //获取Context属性  
  19.         ActionContext ac = ActionContext.getContext();  
  20.           
  21.         //获取RequestMap  
  22.         Map rmap = (Map)ac.get("request");  
  23.         rmap.put("r_books", books);  
  24.           
  25.         //获取SessionMap  
  26.         Map smap = ac.getSession();  
  27.         smap.put("s_books", books);  
  28.           
  29.         //获取ApplicationMap集合  
  30.         Map cmap = ac.getApplication();  
  31.         cmap.put("c_books", books);  
  32.           
  33.         return SUCCESS;  
  34.     }  
  35. }  

2.2.3 第三种方式:采用全局的方法获取Map集合共享数据

        分别实现三个接口:RequestAware,SessionAware, ApplicationAware

优点:

a. 不依赖servlet的api。

b. 可以在Action的任何方法去使用Map集合共享数据。

Action代码:

BaseAction

[java]  view plain  copy
 print ?
  1. package edu.scut.e_data;  
  2.   
  3. import java.util.Map;  
  4. import org.apache.struts2.interceptor.ApplicationAware;  
  5. import org.apache.struts2.interceptor.RequestAware;  
  6. import org.apache.struts2.interceptor.SessionAware;  
  7. import com.opensymphony.xwork2.ActionSupport;  
  8.   
  9. public class BaseAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {  
  10.     protected Map requestMap = null;  
  11.     protected Map sessionMap = null;  
  12.     protected Map applicationMap = null;  
  13.   
  14.        public void setRequest(Map<String,Object> request) {  
  15.         this.requestMap = request;  
  16.     }  
  17.     public void setSession(Map<String,Object> session) {  
  18.         this.sessionMap = session;  
  19.     }  
  20.     public void setApplication(Map<String,Object> application) {  
  21.         this.applicationMap = application;  
  22.     }  
  23. }  

Action

[java]  view plain  copy
 print ?
  1. package edu.scut.e_data;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import javax.faces.application.Application;  
  7. import org.apache.struts2.interceptor.ApplicationAware;  
  8. import org.apache.struts2.interceptor.RequestAware;  
  9. import org.apache.struts2.interceptor.SessionAware;  
  10. import com.opensymphony.xwork2.ActionSupport;  
  11. import com.sun.faces.context.ApplicationMap;  
  12. //三种方式  
  13. public class BookAction3 extends BaseAction {  
  14.     public String list(){  
  15.         //模拟数据  
  16.         List<Book> books = new ArrayList<Book>();  
  17.         for(int i=0; i<5; i++){  
  18.             books.add(new Book("计算机组成原理"+i,50+i*5));  
  19.         }  
  20.           
  21.         //将数据分别保存  
  22.         //RequestMap  
  23.         requestMap.put("r_books", books);  
  24.           
  25.         //SessionMap  
  26.         sessionMap.put("s_books", books);  
  27.           
  28.         //ApplicationMap  
  29.         applicationMap.put("c_books", books);  
  30.           
  31.         return SUCCESS;  
  32.     }  
  33. }  

2.3 数据类型转换

Struts2内置的参数拦截器可以把表单字符串(String)类型自动转换对应的其他类型。

         例如:将表单传过来的String类型转换成double,int,float,short,Java.util.Date。

但是表单输入的内容必须按照Struts框架能够识别的格式输入(日期类型默认只支持短日期类型,即yyyy-MM-dd)。 

如果需要扩展Struts2的转换类型,可以自定义类型转换器。

2.3.1 开发自定义类型转换器步骤

a. 编写java类,继承StrutsTypeConverter类。

[java]  view plain  copy
 print ?
  1. package edu.scut.c_convert;  
  2.   
  3. import java.text.ParseException;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.Date;  
  6. import java.util.Map;  
  7. import org.apache.struts2.util.StrutsTypeConverter;  
  8.   
  9. public class MyDateConverter extends StrutsTypeConverter {  
  10.     //设置转换格式,4种不同格式的日期类型的转换  
  11.     SimpleDateFormat[] sdf = new SimpleDateFormat[]{  
  12.             new SimpleDateFormat("yyyy/MM/dd"),  
  13.             new SimpleDateFormat("yyyy-MM-dd"),  
  14.             new SimpleDateFormat("yyyy.MM.dd"),  
  15.             new SimpleDateFormat("yyyy#MM#dd")  
  16.     };  
  17.       
  18.     @Override  
  19.     public Object convertFromString(Map context, String[] values, Class toClass) {  
  20.         //1 得到页面的日期数据  
  21.         String dateString = values[0];  
  22.           
  23.         /** 
  24.          * 页面数据》》》》action 
  25.          * convert:上下文对象 
  26.          * values:页面传过来的参数 
  27.          * toClass:需要转换的类型 
  28.          * 返回值为转换后的值 
  29.          */  
  30.         //2 数据类型转换  
  31.         //使用SimpleDateFormat对数据进行逐个转换  
  32.         for(SimpleDateFormat s : sdf){  
  33.             try {  
  34.                 Date date = s.parse(dateString);  
  35.                 return date;  
  36.             } catch (ParseException e) {  
  37.                 //使用下一个SimpleDateFormat继续进行转换  
  38.                 continue;  
  39.             }  
  40.         }    
  41.         return null;  
  42.     }  
  43.   
  44.     /** 
  45.      * action》》》》页面 
  46.      */  
  47.     @Override  
  48.     public String convertToString(Map context, Object o) {  
  49.         return null;  
  50.     }  
  51. }  


b. 绑定类型转换器。

局部绑定:只能绑定一个Action
            规则:在需要绑定类型转换器的Action同目录下建立properties文件:Action的名称-conversion.properties。

            内容:属性名称=gz.itcast.c_convert.MyDateConverter。

例如:BookAction-conversion.properties。

[html]  view plain  copy
 print ?
  1. publishtime=edu.scut.c_convert.MyDateConverter  

全局绑定:可以绑定项目中的全部Action

            规则:在src目录下创建xwork-conversion.properties文件。
            内容:java.util.Date=gz.itcast.c_convert.MyDateConverter。

[html]  view plain  copy
 print ?
  1. java.util.Date=edu.scut.c_convert.MyDateConverter  

2.3.2 三种不同接参方式的绑定规则

a. 基本数据类型接收参数

绑定类型转换器:在Action的同目录下建立  Action的名称-conversion.properties。

内容:属性名称=gz.itcast.c_convert.MyDateConverter。

b. javabean类型接收参数

绑定类型转换器:在Action的同目录下建立Action的名称-conversion.properties。

内容:book.publishtime=gz.itcast.c_convert.MyDateConverter。(注意是实体类名.属性名

c. 模型驱动接收参数

绑定类型转换器:在模型对象的同目录下建立模型的对象名称-conversion.properties。(注意是模型的对象名称,Book-conversion.properties。而不是BookAction-conversion.properties)

2.4 文件的上传与下载

2.4.1 文件上传

a. 文件上传的三个必要条件:

  • form表单,type="File"
  • post提交方式
  • form的enctype="multipart/form-data"

b. action类,其中包含单文件上传和多文件上传,两种方式都是通过setter方法接收表单上传的文件。多文件上传时,将接受的文件内容,名称,类型用集合封装。

[java]  view plain  copy
 print ?
  1. package edu.scut.b_upload_down;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.util.List;  
  6. import org.apache.commons.io.FileUtils;  
  7. import com.opensymphony.xwork2.ActionSupport;  
  8. import com.sun.org.apache.xml.internal.resolver.helpers.FileURL;  
  9.   
  10. public class UploadAction extends ActionSupport{  
  11.     //接收普通数据  
  12.     private String name;  
  13.     public void setName(String name) {  
  14.         this.name = name;  
  15.     }  
  16.       
  17.     //接收一个文件  
  18.     //1 文件内容  
  19.     private File attach;  
  20.     //2 文件名称  
  21.     private String attachFileName;  
  22.     //3 文件类型  
  23.     private String attachContentType;  
  24.     public void setAttach(File attach) {  
  25.         this.attach = attach;  
  26.     }  
  27.     public void setAttachFileName(String attachFileName) {  
  28.         this.attachFileName = attachFileName;  
  29.     }  
  30.     public void setAttachContentType(String attachContentType) {  
  31.         this.attachContentType = attachContentType;  
  32.     }  
  33.   
  34.     //注入serverPath  
  35.     private String serverPath;  
  36.     public void setServerPath(String serverPath) {  
  37.         this.serverPath = serverPath;  
  38.     }  
  39.       
  40.     //单文件上传  
  41.     public String upload1() throws Exception{  
  42.         //输出文件的相关信息  
  43.         System.out.println("用户名:"+name);  
  44.         System.out.println("文件名:"+attachFileName);  
  45.         System.out.println("文件类型:"+attachContentType);  
  46.         System.out.println("文件大小:"+attach.length());  
  47.         //将文件接收保存在serverPath  
  48.         FileUtils.copyFile(attach, new File(serverPath+attachFileName));  
  49.         return SUCCESS;  
  50.     }  
  51.       
  52.     //接收多个文件  
  53.     //1 文件内容  
  54.     private List<File> img;  
  55.     //2 文件名称  
  56.     private List<String> imgFileName;  
  57.     //3 文件类型  
  58.     private List<String> imgContentType;  
  59.     public void setImg(List<File> img) {  
  60.         this.img = img;  
  61.     }  
  62.     public void setImgFileName(List<String> imgFileName) {  
  63.         this.imgFileName = imgFileName;  
  64.     }  
  65.     public void setImgContentType(List<String> imgContentType) {  
  66.         this.imgContentType = imgContentType;  
  67.     }  
  68.       
  69.     //多文件上传  
  70.     public String upload2() throws Exception{  
  71.         //输出用户名  
  72.         System.out.println("用户名:"+name);  
  73.         if(img!=null){  
  74.             for (int i = 0; i < img.size(); i++) {  
  75.                 //输出文件的相关信息  
  76.                 System.out.println("文件名:"+imgFileName);  
  77.                 System.out.println("文件类型:"+imgContentType);  
  78.                 System.out.println("文件大小:"+img.get(i).length());  
  79.                 //将文件接收保存在serverPath  
  80.                 FileUtils.copyFile(img.get(i), new File(serverPath+(imgFileName.get(i))));  
  81.             }  
  82.             return SUCCESS;  
  83.         }  
  84.         return INPUT;  
  85.     }  
  86. }  

struts.xml配置

[html]  view plain  copy
 print ?
  1. <span style="color:#000000;"><?xml version="1.0" encoding="UTF-8"?>  
  2.  <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5. <struts>  
  6.     <package name="upload" extends="struts-default" namespace="/upload">  
  7.         <action name="upload_*" class="edu.scut.b_upload_down.UploadAction" method="{1}">  
  8.             <!-- 注入一个参数 -->  
  9.             <param name="serverPath" >/c:targetFiles/</param>  
  10.             <!-- 上传成功的页面 -->  
  11.             <result >/success.jsp</result>  
  12.             <!-- 上传失败的页面 -->  
  13.             <result name="input">/fail.jsp</result>  
  14.         </action>  
  15.     </package>  
  16. </struts>  

注意:
        INPUT 名称的result是struts2内置的处理错误的视图,struts2框架在文件上传时超过大小,类型转换时转换错误,表单数据验证错误时都会指向到INPUT的视图。

2.4.2 文件下载

Struts框架对文件的下载进行了简化。关键点:需要一个名称为steam的视图。

a. struts.xml的配置:

[html]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.  <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.3.dtd">  
  5. <struts>  
  6.     <package name="downLoad" extends="struts-default" namespace="/downLoad">  
  7.         <action name="down_*" class="edu.scut.b_upload_down.DownAction" method="{1}">  
  8.             <!-- 配置一个下载的视图,四个参数,文件类型,下载提示框,文件输入流,缓存大小 -->  
  9.             <result type="stream">   
  10.                  <!-- 配置视图参数:给视图注入参数 -->  
  11.                  <!-- 下载的文件类型:通用的二进制类型 -->  
  12.                  <param name="contentType">application/octet-stream</param>  
  13.                  <!-- 下载提示框 -->  
  14.                  <!-- ${fileName}会获取当前Action的getFileName方法的返回值 -->  
  15.                  <param name="contentDisposition">attachment;filename=${fileName}</param>  
  16.                  <!-- 需要下载的文件输入流:需要配置getter方法 -->  
  17.                  <param name="inputName">fileContent</param>  
  18.                  <!-- 下载的缓存大小:默认是1024 -->  
  19.                  <param name="bufferSize">512</param>  
  20.             </result>  
  21.         </action>  
  22.     </package>  
  23. </struts>  

b. action类

[java]  view plain  copy
 print ?
  1. package edu.scut.b_upload_down;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.InputStream;  
  7. import java.io.UnsupportedEncodingException;  
  8. import java.net.URLEncoder;  
  9. import org.apache.struts2.ServletActionContext;  
  10. import com.opensymphony.xwork2.ActionSupport;  
  11. //下载Action  
  12. public class DownAction extends ActionSupport {  
  13.     //需要下载的文件  
  14.     File file = null;  
  15.       
  16.     //将文件名称通过getter方法设置到struts.xml配置文件当中  
  17.     private String fileName;  
  18.     public String getFileName() throws Exception {  
  19.         //如果文件名是中文需要们进行URL编码  
  20.         return URLEncoder.encode(fileName,"utf-8");  
  21.     }  
  22.   
  23.     //需要下载的文件要以流的形式返回  
  24.     public InputStream getFileContent() throws Exception {  
  25.         return new FileInputStream(file);  
  26.     }  
  27.       
  28.     //下载方法  
  29.     public String down(){  
  30.                 //f.jpg放在WebRoot/download文件夹  
  31.                 file = new File(ServletActionContext.getServletContext().getRealPath("/download/f.jpg"));  
  32.         fileName = file.getName();  
  33.         return SUCCESS;  
  34.     }  
  35. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值