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>
<constant name="struts.devMode" value="true"/>
<package name="lee" extends="struts-default">
<action name="downPro" class="com.zjlolife.downAction.DownLoadAction">
<param name="inputPath">\images\疯狂联盟.jpg</param>
<result name="success" type="stream">
<param name="contentType">image/jpg</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">attachment;filename="wjc_logo.jpg"</param>
<param name="bufferSize">4096</param>
</result>
</action>
<action name="*">
<result>/WEB-INF/content/download.jsp</result>
</action>
</package>
</struts>
DownloadAction.java
package com.zjlolife.downAction;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
public class DownLoadAction {
private String inputPath;
public String getInputPath() {
return inputPath;
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
public InputStream getTargetFile() {
System.out.println("执行targetFile"); //execute()执行完后,再执行该方法。
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String execute() {
System.out.println("执行execute"); //先执行
return "success";
}
}
分析一下下载文件的大致流程:
struts2中的filter会先拦截用户的请求,得到用户需要的action,然后通过配置文件,找到对应的action默认的拦截器,并生成该对应配置的拦截器类的对象,以及还会产生实现了ActionInvocation类的对象,并通过ActionInvocation来控制action,即调用ActionInvocation.invoke()方法,然后递归调用拦截器,在拦截的过程没遇到任何问题,就会执行action中的execute()方法。然后filter发现该action对应的返回类型type是stream,而默认的是dispacher。filter会产生一个StreamResult类的对象,对stream类型进行处理,进一步通过result中的相关参数inputName,contentDisposition,contentType等等,以及通过调用action中的getTargetFile()方法来返回下载文件需要的流,没办法这就是这种类型StreamResult的机制。
每个resultType对应不同的处理类,以及需要不同的参数。dispacher类型的类,就需要参数location(默认不写就是location)。