Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 动作链接和下载链接合一_Jsf 2_Download - Fatal编程技术网

Jsf 2 动作链接和下载链接合一

Jsf 2 动作链接和下载链接合一,jsf-2,download,Jsf 2,Download,我需要在JSF2应用程序的页面上显示一个下载文件的链接。现在的问题是,该文件包含的数据取决于创建时数据库中的新外观。但我想做的是创建它,并为用户提供一个链接,以便在一次操作中下载它 这将非常简单,可以通过两个操作来完成:使用一个按钮来生成文件,并在生成文件后使用一个链接来下载文件 所以问题是,这可以通过点击commandLink来实现吗 根据巴卢斯克在下面的评论进行编辑。以下是我正在尝试做的事情,以及到目前为止已经做过的事情的细节。我在xhtml中有以下内容: <h:panelGroup

我需要在JSF2应用程序的页面上显示一个下载文件的链接。现在的问题是,该文件包含的数据取决于创建时数据库中的新外观。但我想做的是创建它,并为用户提供一个链接,以便在一次操作中下载它

这将非常简单,可以通过两个操作来完成:使用一个按钮来生成文件,并在生成文件后使用一个链接来下载文件

所以问题是,这可以通过点击commandLink来实现吗

根据巴卢斯克在下面的评论进行编辑。以下是我正在尝试做的事情,以及到目前为止已经做过的事情的细节。我在xhtml中有以下内容:

<h:panelGroup rendered="#{!bean.showLinkToExcelFile()}">
     <h:form>
         <td><h:commandButton value="Generate list of your Bids for download" action="#{bean.createBidsList()}"/></td>      
    </h:form>
</h:panelGroup>
<h:panelGroup rendered="#{bean.showLinkToExcelFile()}">
    <td><a href="#{bean.findBidsListFileName()}">Download Your Bids</a></td>
</h:panelGroup> 

这很有效。该按钮创建excel文件,将其保存到某个位置,并更新数据库中的文件名。然后链接提供文件。但对用户来说,这是一个两步的过程。我想要的只是一步。因此,一个链接,例如:

<a href="#{bean.findBidsListFileName()}">Download Your Bids</a>


或者,最有可能的是,jsf命令链接将在后端创建excel文件,将其保存到/resources/location,并在用户机器上无缝地打开一个“save”对话框

我将使用普通下载链接并将URL映射到动态生成文档的servlet。

我将使用普通下载链接并将URL映射到动态生成文档的servlet。

您只需让JSF立即将报告写入HTTP响应的
输出流
,而不是本地磁盘文件系统的
OutputStream

下面是一个基本示例,假设您正在使用创建Excel报告:

public void createAndDownloadBidsReport() throws IOException {
    // Prepare Excel report to be downloaded.
    HSSFWorkbook bidsReport = createBidsReportSomehow();
    String filename = "bids.xls";

    // Prepare response to show a Save As dialogue with Excel report.
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    externalContext.setResponseContentType("application/vnd.ms-excel");
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

    // Write Excel report to response body.
    bidsReport.write(externalContext.getResponseOutputStream());

    // Inform JSF that response is completed and it thus doesn't have to navigate.
    facesContext.responseComplete();
}
这样,您就可以只使用一个命令链接(或按钮)



请注意,这不会将其保存到磁盘文件系统。如果您确实需要一个副本,那么您需要添加另一个
bidsReport.write()
行,该行将写入所需的磁盘文件系统位置。

您可以让JSF立即将报告写入HTTP响应的
OutputStream
,而不是本地磁盘文件系统的
OutputStream

下面是一个基本示例,假设您正在使用创建Excel报告:

public void createAndDownloadBidsReport() throws IOException {
    // Prepare Excel report to be downloaded.
    HSSFWorkbook bidsReport = createBidsReportSomehow();
    String filename = "bids.xls";

    // Prepare response to show a Save As dialogue with Excel report.
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    externalContext.setResponseContentType("application/vnd.ms-excel");
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

    // Write Excel report to response body.
    bidsReport.write(externalContext.getResponseOutputStream());

    // Inform JSF that response is completed and it thus doesn't have to navigate.
    facesContext.responseComplete();
}
这样,您就可以只使用一个命令链接(或按钮)



请注意,这不会将其保存到磁盘文件系统。如果您确实需要一个副本,那么您需要添加另一个
bidsReport.write()
行,该行将写入所需的磁盘文件系统位置。

答案是:是。你还有问题吗?在执行相应的要求时,请显示并详细说明您到底在哪里结巴。谢谢,BalusC。我编辑了这个问题,答案是:是的。你还有问题吗?在执行相应的要求时,请显示并详细说明您到底在哪里结巴。谢谢,BalusC。我编辑了这个问题。巴卢斯克,我编辑了一个问题,有点错误。如果它最终与当前问题无关,我将删除它。谢谢。你有
facesContext.responseComplete()吗行来通知JSF它不必导航?(读:它不应该写HTML)没关系,我从电脑前走了出来,找到了答案。我忘了调用facesContext.responseComplete();哦,刚刚看到你的评论。谢谢:)它可以工作,但在下载文件后,它会抛出异常:JBWEB000236:Servlet.service()用于Servlet FacesServlet抛出异常:java.lang.IllegalStateException:JBWEB000028:getOutputStream()已被调用用于此响应。基于此,我对问题进行了编辑,但有一些错误。如果它最终与当前问题无关,我将删除它。谢谢。你有
facesContext.responseComplete()吗行来通知JSF它不必导航?(读:它不应该写HTML)没关系,我从电脑前走了出来,找到了答案。我忘了调用facesContext.responseComplete();哦,刚刚看到你的评论。谢谢:)它可以工作,但在下载文件后,它会抛出异常:JBWEB000236:Servlet.service()用于Servlet FacesServlet抛出异常:java.lang.IllegalStateException:JBWEB000028:getOutputStream()已为此响应调用