strut2文件下载三部曲:一个流、两个头信息

说明:

①一个流,在Action中需要一个getInputStream()的方法来获取下载的内容,其中inputStream是默认的,他会指示StreamResult获得inputStream属性的getter方法。

②两个头,一个为ContentType:默认rext/plain文件形式。主要作用是根据下载的文件类型进行文件设置,需要的任何MIME可以在tomcat里面的配置文件中找到

另一个头是ContentDisposition:默认inline,直接在网页上打开,我们一般把他设置为attachment,弹出窗口查看下载信息和选择下载路径

以下用导出excel数据表格为例:

一、首先在查询出所需要的数据时,进数据放到session域中

servletActionContext.getRequest().getSession().setAttribute("list",list);

二、在页面设置一个按钮

<a href="${pageContext.request.contextPath}/user_exportXls">导出</a>

三、配置struts.xml文件

<action  name="user_*" method="{1}" class="Action的全类名">

<result name="exportXlsSUCCESS" type="stream">

<param name="contentType">application/vnd.ms-excel</param>   <!--excel文件类型-->
       <param name="contentDisposition">attachment;filename=用户数据.xls</param> <!--下载弹窗和下载文件名-->

</result>

</action>

四、Action类 实现getInputStream方法

public String  exportXls()

{

return "exportXlsSUCCESS";

}

public InputStream getInputStram() throws IOException

{

// 将 userData缓存缓存在Session中的数据 ,生成Excel

List<User> userData = (User) ServletActionContext.getRequest().getSession().getAttribute("User");

// 根据内存的数据生成Excel   // 工作薄

HSSFWorkbook hssfWorkbook = new HSSFWorkbook();

// 生成一张表sheet   (表名为:用户数据)

HSSFSheet sheet = hssfWorkbook.createSheet("用户数据");

// 先写标题行

HSSFRow headRow = sheet.createRow(0);

// 第一行 (标题行,也叫表头)

headRow.createCell(0).setCellValue("编号");

headRow.createCell(1).setCellValue("用户名");

headRow.createCell(2).setCellValue("性别");

headRow.createCell(3).setCellValue("爱好");

headRow.createCell(4).setCellValue("电话号码");

headRow.createCell(5).setCellValue("住址信息");

..................................等

// 向excel写数据

for (User user: userData)

{

// 每个分区一行

HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);   //  获取已经存在的最后一行的行数,在这行下再创建新的行

dataRow.createCell(0).setCellValue(user.getId());

dataRow.createCell(1).setCellValue(user.getUsername());

dataRow.createCell(2).setCellValue(user.getGender());

dataRow.createCell(3).setCellValue(user.getHobby());

dataRow.createCell(4).setCellValue(user.getTelephone());

dataRow.createCell(5).setCellValue(user.getAddr());

.....等

}

// 将数据缓存到字节数组 (知识点)

ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();

hssfWorkbook.write(arrayOutputStream);

arrayOutputStream.close();

byte[] data = arrayOutputStream.toByteArray();

// 再通过字节数组输入流读取数据

return new ByteArrayInputStream(data);

}

五、知识点,如何将缓存中的数据转换为输入流?

//实例化一个字节数组输出流

ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();

// 将工作簿的数据写入到字节数组输出流中

hssfWorkbook.write(arrayOutputStream);

//将字节数组输出流关闭

arrayOutputStream.close();

//将字节数组输出流转换为字节流

byte[] data = arrayOutputStream.toByteArray();

// 再通过字节数组输入流读取数据

InputStream inputStream = new ByteArrayInputStream(data);

struts2文件下载的编写步骤(文件导出)和输入流转换的方法的更多相关文章

  1. Oracle数据库文件导出为CSV格式的方法

    1 安装PLSQL Developer,并连接Oracle数据库. 2 执行sql语句,将要导出的表格显示出来. select * from table名; 3 如下点击导出查询结果,选择数据格式,即 ...

  2. IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法

    在使用下面这个写法时候UTF-8文件编码 在读取时候出现乱码问题. File myFile=new File("文件路径"); BufferedReader in = new Bu ...

  3. FileUtils 文件下载 文件导出

    public class FileUtils { /// <summary> /// 文件下载 /// </summary> /// <param name=" ...

  4. loadrunner实现excel文件导出操作

    项目中需要对“商品信息”进行查询及导出,但是loadrunner并不能录制到“保存”这一操作. 项目介绍:flex+Http协议: 不能录制的原因: 在我们点击了“导出”按钮后,服务端已经生成一份我们 ...

  5. struts2结合poi-3.7实现数据导出为excel

    我们在处理数据的时候,有可能要将数据导出到excel文件中,那么java中是怎么实现的呢?apache开发的poi就可以帮我们实现啦,它也是开源的代码,导入相应的jar包,就可以轻松实现,下面让我们来 ...

  6. Jmeter_实现Excel文件导出到本地

    一般而言,对于页面的“导出”操作,主要经历如下两个操作:①根据数据库的内容,将文件导出到应用服务器上:②将服务器上的文件下载到本地电脑: Jmeter同LoadRunner类似,只能记录服务端与客户端 ...

  7. C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图

    C#+OpenGL+FreeType显示3D文字(1) - 从TTF文件导出字形贴图 +BIT祝威+悄悄在此留下版了个权的信息说: 最近需要用OpenGL绘制文字,这是个很费时费力的事.一般的思路就是 ...

  8. Struts2文件下载浅析

    Struts2极大的简化了文件上传和下载,本文将主要介绍一下Struts2文件下载的实现1.功能主要是,在下载页面点击下载后,则下载相应的文件 2.代码部分jsp页面downloadPage:< ...

  9. Struts2(二)——配置文件struts2.xml的编写

    接上一篇博客,这篇博客讲述一下2——9小标题的内容,这些问题都可以在struts2配置文件中设置(当然有的也可以在Struts.properties属性文件,web.xml中进行设置),而且常规开发中 ...

随机推荐

  1. Openerp 7.0 附件存储位置

    我们知道对OpenERP中的每个内部对象(比如:业务伙伴,采购订单,销售订单,发货单,等等)我们都可以添加任意的附件,如图片,文档,视频等.那么这些附件在OpenERP内部是如何管理的呢? 默认情况下 ...

  2. [C#]记录程序耗时的方法【转发】

    System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); // H ...

  3. RHEL和Centos常用版本

    学而优则仕,思则进步也Q Redhat: http://pan.baidu.com/s/1qXKRqqS Centos: http://pan.baidu.com/s/1o8RrjXw

  4. mysql利用yum安装指定数据存放路径

    测试环境: Centos6.5.MySQL5.6.28 yum安装具有速度快,便捷关键是不用编译,编译时间太久了! 01.下载mysql https://mirrors.tuna.tsinghua.e ...

  5. 导出CCS3.3数据及使用matlab处理的方法

    CCS3.3是一款DSP的集成开发环境(IDE).在做DSP开发时,为验证算法.经常须要使用matlab进行算法验证,验证算法就须要数据.因此,一种交互的方法是: 使用DSP开发板连接CCS 用CCS ...

  6. Android API之android.provider.ContactsContract.Contacts

    android.provider.ContactsContract.Contacts 对应contacts数据表.RawContacts的一个聚合(aggregate)代表同一个人.每个人在数据表co ...

  7. 【TP框架】包括TP3.1和3.2,自带缓存使用机制

    原文章出处: http://blog.163.com/liwei1987821@126/blog/static/172664928201422133218356/ 写在开始:缓存变量和session变 ...

  8. springmvc+spring框架

    jar包 com.springsource.javax.validation-1.0.0.GA.jar com.springsource.org.aopalliance-1.0.0.jar com.s ...

  9. cxf之java.lang.NoSuchMethodError: org.springframework.aop.support.AopUtils.isCglibProxyClass(Ljava/lang/C

    想用cxf发布一个web服务,但是容器启动报这个错,求高人解答啊 [问题点数:20分,无满意结帖,结帖人shijing266] 楼主好懒,主要还是jar版本的问题,spring4.2.0以上需要使用c ...

  10. GitHub搭建博客过程

    1.参考 我的 Github 个人博客是怎样炼成的 http://www.jianshu.com/p/4fd3cb0a11da 到了第三节"三.使用 Jekyll 搭建个人博客"时 ...