struts2文件上传

Struts2使用开源项目Apache Jakarta Commons FileUpload和内建的FileUploadInterceptor拦截器实现文件上传,所需的jar包如下:

commons-logging-1.1.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.6.jar
xwork-2.0.1.jar
commons-io-1.3.1.jar
commons-fileupload-1.2.jar

★ 文件上传页面 fileupload.jsp

  1. <%@ page language="java" contentType="text/html; charset=GBK"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags" %>  
  3.   
  4. <html>  
  5.   <head>  
  6.   <head>  
  7.      
  8.   <body>  
  9.     <s:form action="fileUpload" method="post" enctype="multipart/form-data">  
  10.       <s:file name="doc" label="File"/>  
  11.       <s:submit/>  
  12.     <s:form>  
  13.   <body>  
  14. <html>  

这里需要注意的是,form的enctype属性必须设置为multipart/form-data。

★ 处理文件上传 FileUploadAction.java

  1. package fileupload;   
  2.   
  3. import java.io.File;   
  4. import java.text.DateFormat;   
  5. import java.text.SimpleDateFormat;   
  6. import java.util.Date;   
  7. import java.util.Random;   
  8.   
  9. import javax.servlet.ServletContext;   
  10.   
  11. import org.apache.commons.io.FileUtils;   
  12. import org.apache.struts2.util.ServletContextAware;   
  13.   
  14. import com.opensymphony.xwork2.ActionSupport;   
  15.   
  16. public class FileUploadAction extends ActionSupport implements ServletContextAware {   
  17.        
  18.     private static final long serialVersionUID = -5016873153441103539L;   
  19.        
  20.     private File doc;   
  21.     private String fileName;   
  22.     private String contentType;   
  23.        
  24.     private ServletContext context;   
  25.            
  26.     public void setDoc(File file) {   
  27.         this.doc = file;   
  28.     }   
  29.        
  30.     public void setDocFileName(String fileName) {   
  31.         this.fileName = fileName;   
  32.     }   
  33.        
  34.     public void setDocContentType(String contentType) {   
  35.         this.contentType = contentType;   
  36.     }   
  37.        
  38.     public void setServletContext(ServletContext context) {   
  39.         this.context = context;   
  40.     }   
  41.        
  42.     public String execute() throws Exception {   
  43.         String targetDirectory = context.getRealPath("/upload");   
  44.         
  45.         File target = new File(targetDirectory, filename);   
  46.            
  47.         FileUtils.copyFile(doc, target);   
  48.            
  49.         return SUCCESS;   
  50.     }   
  51.        
  52.    
  53. }  

在fileupload.jsp中,只有doc一个字段,而FileUploadAction.java中,却有三个字段,Struts2怎么通过页面的一个字段设置Action里的三个字段呢?没错,这就是FileUploadInterceptor的功劳了!你所要做的只是按照一定的样式命名这三个字段的set方法,而字段名可以任意命名。第一个File类型的字段的set方法还是以常规的方式命名,另两个String类型的字段的set方法必须分别以“File字段的set方法名+FileName”和“File字段的set方法名+ContentType”来命名。

★ 配置文件 struts.xml 

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC   
  3.         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   
  4.         "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.   
  8.     <package name="fileupload" namespace="/fileupload" extends="struts-default">  
  9.            
  10.         <action name="fileUpload" class="fileupload.FileUploadAction">  
  11.             <result>/fileupload/upload_success.jsp</result>  
  12.         </action>  
  13.        
  14.     </package>  
  15.   
  16. </struts>  

★ 配置文件 web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"    
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"    
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.        
  8.     <filter>  
  9.         <filter-name>struts-cleanup</filter-name>  
  10.         <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>  
  11.     </filter>  
  12.        
  13.     <filter>  
  14.         <filter-name>struts2</filter-name>  
  15.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  16.     </filter>  
  17.        
  18.     <filter-mapping>  
  19.         <filter-name>struts-cleanup</filter-name>  
  20.         <url-pattern>/*</url-pattern>  
  21.     </filter-mapping>  
  22.        
  23.     <filter-mapping>  
  24.         <filter-name>struts2</filter-name>  
  25.         <url-pattern>/*</url-pattern>  
  26.     </filter-mapping>  
  27.   
  28. </web-app>  

struts-cleanup的作用
  就是说,一般情况下,如果你要用SiteMesh或者其他过滤器,一般是放在FilterDispatcher或者是现在的StrutsPrepareAndExecuteFilter之前。在调用完所有过滤器的doFilter方法后,核心过滤器FilterDispatcher或者StrutsPrepareAndExecuteFilter会清空ActionContext,如果其他过滤器要一直使用value stack等struts的特性时,如果不用ActionContextCleanUp的话,便得不到想要的值。



     ActionContextCleanUp的作用就是上面用粗体标注出来的那一句。它会在doFilter方法里设置一个计数器counter的初始值为1,有了这个值,后续的核心过滤器就不会清空ActionContext,而是由之前的过滤器也就是ActionContextCleanUp来清空ActionContext。

处理中文问题
   

利用struts2做文件上传,中文处理需要处理两个地方:

(1)struts.xml设置<constant name="struts.i18n.encoding" value="GBK"/>,或者struts.properties文件设置struts.i18n.encoding=GBK

(2)上传文件的页面编码设置成GBK,如:<%@ page language="java" pageEncoding="GBK"%>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值