您的位置:首页 > 编程语言 > Java开发

关于struts2 中result type="stream"

2011-12-27 18:38 357 查看
struts2中 result="stream",可以实现文件的下载功能。

这里有两篇比较清楚和基础的文章:http://kin111.blog.51cto.com/738881/167475

http://developer.51cto.com/art/200906/130122.htm
我这里的应用是POI在内存中生成excel文件供客户端下载。struts.xml中的配置如下

<!-- 进销存信息查询统计 -->
   <action name="jxcQuery_*" class="com.chengzhong.action.JxcChaXunAction" method="{1}">
    <result name="success">jxcchaxun.jsp</result>
    <!--进销存信息导出为excel -->
    <result name="toexcelOK" type="stream">
       <param name="contentType">application/vnd.ms-excel</param>                 
       <param name="contentDisposition">attachment;filename="${fileName}"</param> 
                <param name="inputName">excelIS</param>
    </result>
    <result name="error">../404.htm</result>
   </action>



1.type="stream" 把一般内容输出到流

2.参数contentType的地方指定为application/vnd.ms-excel

3.设置为 attachment 将会告诉浏览器下载该文件,filename 指定下载文件保有存时的文件名,若未指定将会是以浏览的页面名作为文件名,如以 download.action 作为文件名。这里使用的是动态文件名,${fileName}。它将通过 Action 的 getFileName() 获得文件名。也就是说Action里面要有一个getFileName ()的方法。

比如下面这个:

public String getFileName() {        
                  String fileName = "进销存信息统计表.xls"
         try {        
             //中文文件名需要转码为 ISO8859-1,否则乱码        
             return new String(fileName.getBytes(), "ISO8859-1");        
         } catch (UnsupportedEncodingException e) {        
             return "jxc.xls";        
         }        
     }

或者Action 里面有一个fileName的属性,提供它的set 和get 方法。在程序合适的位置给fileName赋值。这两者本质上应该是一样的。

我刚开始没有用注释处的方法转码,用中文做文件名的时候,它就象前面说的用浏览的页面名作为文件名了。

4.<param name="inputName">excelIS</param>

参数inputName指定输入流的名称。和前面的文件名一样,Action里或者提供一个getExcelIS()的方法,或者提供excelIS属性。

5.对流的操作:

ByteArrayOutputStream baos = new ByteArrayOutputStream();

try {



/************************************************************/

DataImportAndExportTool.InfoToExcel(Info, sheetName).write(baos);

byte[] ba = baos.toByteArray();

baos.close();

excelIS = new ByteArrayInputStream(ba);

/*******************************************************************/

//DataImportAndExportTool.InfoToExcel(Info, sheetName).write(fOut); //这样excel表保存在了服务器上



} catch (Exception e) {



e.printStackTrace();

}



return "toexcelOK";、

DataImportAndExportTool.InfoToExcel(Info, sheetName)是我生成excel的方法,info是一个list,sheetName 是工作薄名,这句执行后生成了一个workbook。

ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。

ByteArrayOutputStream用途很多。其中缓冲是一个。对象的深浅复制也会用到

注意:以下是一些参数说明

contentType

内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片

inputName

下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法

contentDisposition

文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:

attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="struts2.txt"

bufferSize

下载缓冲区的大小

。在这里面,contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐