2011-05-27 23 views
1

我需要使用seam将“导出”功能添加到现有的web应用程序。目的是将搜索结果导出到csv文件。生成一个csv我没有问题,但我不知道如何将csv发回给用户。 我不想将csv存储在服务器上,因为这会占用存储空间。我怎么能在jboss seam中实现这一点?使用jboss seam生成并下载文件

回答

5

使用Seam提供的Document Store Servlet。

几乎复制和参考文档粘贴,声明该servlet在web.xml这样的:

<servlet> 
    <servlet-name>Document Store Servlet</servlet-name> 
    <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>Document Store Servlet</servlet-name> 
    <url-pattern>/seam/docstore/*</url-pattern> 
</servlet-mapping> 

然后创建一个export.xhtml文件只<s:resource>标签:

<s:resource xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:s="http://jboss.com/products/seam/taglib" 
      data="#{myComponent.csvData}" 
      contentType="application/vnd.ms-excel" 
      fileName="#{myComponent.csvFileName}"/> 

生成链接下载文件在您的网页与<s:download>

<s:download src="/csv/export.xhtml"> 
    <h:outputText value="Download CSV"/> 
    <f:param name="param1" value="somevalue"/> 
    <f:param name="param2" value="someOtherValue"/> 
</s:download> 

最后,实施getCsvData()getCsvFileName()方法在组件:

// could be byte[], File or InputStream 
public InputStream getCsvData() { 
    // generate data to be downloaded 
} 

public String getCsvFileName() { 
    return "myfile.csv"; 
} 

注意<s:download>传播(除非您设置propagation=none)。如果您传播对话上下文,则可能不需要传递任何参数。对于大型数据集,最好不要传播对话并传递参数以在请求作用域组件中选择数据。

+0

你摇滚斯特凡诺! – jakob 2011-09-09 11:09:18

+0

我正在做这个(以及不传递任何参数)的下载链接呈现,但点击它使应用程序想要去一个新的页面(不只是下载文件),然后执行getCsvData方法在一个新的实例类(而不是支持现有页面的那个),所以一切都是空的。任何想法为什么? – tad604 2014-10-01 00:36:43

0

有几种方式:

1)检查信息Seam的文档上使用Seam,Excel以编程方式生成的文件,然后使用MIME类型为CSV设置写出来 - 这是所有详细在文档中。

但是,我无法在最新版本的Seam中使用它,因为它需要一个响应对象,该对象在Seam上下文中可用,但现在只返回null。

2)将您想要的CSV文件编码为Excel xhtml模板(请参阅Seam文档和示例项目),并使用标签将其正常显示。

我经常这样做,它运作良好,禁止限制,你不能提供一个文件名。

HTH。