struts2下载文件原理以及简单下载代码

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)。


你可能感兴趣的:(struts2下载文件原理以及简单下载代码)