我需要使用seam为现有的Web应用添加“导出”功能。目的是将搜索结果导出到csv文件。我没有生成csv的问题,但我不知道如何将csv发送回用户。 我不想将csv存储在服务器上,因为这将是腰部存储空间。我怎么能在jboss seam中实现这个目标?
答案 0 :(得分:5)
使用Seam提供的Document Store Servlet。
几乎从参考文档中复制和粘贴,在web.xml
中声明servlet,如下所示:
<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
)。如果您传播对话上下文,则可能不需要传递任何参数。对于大型数据集,最好不传播会话并传递参数以选择请求范围组件中的数据。
答案 1 :(得分:0)
有两种方法:
1)检查Seam文档以获取有关使用Seam-Excel以编程方式生成文件的信息,然后使用CSV的mime类型集将其写出来 - 这些都在文档中详细说明。
但是,我无法在最新版本的Seam中使用它,因为它需要一个响应对象,它曾经在Seam上下文中可用但现在只返回null。
2)将您想要的CSV文件编码为Excel xhtml模板(请参阅Seam文档和示例项目),然后使用标记将其渲染为正常。
我经常这样做,效果很好,禁止你不能提供文件名。
HTH。