文件下载支持

发布者    |       Seam

Web应用程序通常需要提供链接供用户下载文件,例如费用报告。Seam 2.1.2.CR1通过s:resource和s:download标签的组合,使得向用户提供服务文件的任务变得简单且遵循RESTful原则。但在使用这些标签之前,我们需要进行一些简单的配置。

s:resource标签使用Seam的DocumentStore来提供服务(或推送)文档。您需要将此servlet配置到web.xml中

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>

单独在一页中,s:resource将通过定义获取文件数据和元数据的位置来充当文件下载提供者。您使用它替代HTML(不在HTML内部),因为目的是提供文档而不是网页。因此,页面模板可能看起来像这样。

resources.xhtml

<s:resource xmlns="http://www.w3.org/1999/xhtml"
	xmlns:s="http://jboss.com/products/seam/taglib"
	data="#{fileResourceProvider.data}"
	contentType="#{fileResourceProvider.contentType}"
	fileName="#{fileResourceProvider.fileName}" />
  • data是实际文件数据。它可能是一个java.util.File,一个InputStream或一个byte[]。
  • contentType(例如,image/jpeg
  • filename(例如,someFile.jpg),它很可能会在用户的文件下载提示中显示

其他属性在Seam参考文档中描述。

如果我们想让resources.xml为我们提供所有文档(或至少由fileResourceProvider组件处理的那些),我们需要传递一个或多个参数给它,以便它可以加载给定请求的文档信息和数据。我们通过使用请求参数(例如,http://localhost/app/resources.seam?fileId=1)来实现这一点。至少有两种方法将包含文件ID的参数传递到fileResourceProvider组件。您可以使用@RequestParameter注解;

@RequestParameter
private Long fileId;

或者通过pages.xml注入它

<page view-id=”/resources.xhtml”>
   <param name="fileId" value="#{fileResourceProvider.fileId}"/>
</page>

采取第一种方法,FileResourceProvider.java将定义如下

@Name("fileResourceProvider")
@Scope(ScopeType.EVENT)
public class FileResourceProvider
{

   @RequestParameter
   private Long fileId;
   private String fileName;
   private String contentType;
   private byte[] data;

   @Create
   public void create()
   {
      FileItem item = em.find(FileItem.class, fileId); // Get document representation
      this.fileName = item.getFileName();
      this.data = item.getData();
      this.contentType = item.getContentType();
   }
   //.. getters setters
}

这就是以RESTful方式提供文档所需的所有内容。为了使创建下载链接更加简单,您可以使用s:download标签。以下是它的用法

<s:download src=”/resources.xhtml”>
    <f:param name=”fileId” value=”#{someBean.downloadableFileId}”/>
</s:download>

“s:download”标签是Seam中“s:link”标签的一种变体。它将生成一个类似以下链接的可书签链接:http://localhost/resources.seam?fileId=1。您可以使用Seam URL重写功能将链接转换为:http://localhost/resources/1。更多示例请参考Seam发行包中的“examples/ui”目录以获取进一步指导!


返回顶部