当前位置: 首页 > 面试题库 >

h:commandButton多个操作:下载文件并渲染ajax表

长孙阳焱
2023-03-14
问题内容

我目前有2个命令按钮和一个列表框。根据列表框的选择,生成的结果可以显示在可下载的文件中或呈现为HTML表。该getFile()代码基于BalusC的PDF
Handling教程
,而getTable()set resultTable

<h:form>
<fieldset>
    <h:selectManyListbox id="listbox" value="#{form.items}">
        <f:selectItems value="#{form.allItems}">
    </h:selectManyListbox>
</fieldset>
<h:commandButton value="Get File" action="#{form.getFile}">
<h:commandButton value="Get Table" action="#{form.getTable}">
    <f:ajax render="result_table" execute="listbox" />
</h:commandButton>
<h:panelGrid id="result_table">
    <table>
        <thead></thead>
        <tbody>
            <ui:repeat var="table" value="#{form.resultTable}">
            </ui:repeat>
        </tbody>
    </table>
</h:panelGrid>

到目前为止,两个按钮都可以正常工作。但是,我想将两个动作组合为一个按钮。当我用一个可以触发两个动作的按钮进行测试时,什么也没发生(没有文件另存为对话框或表)。这是因为一个动作是ajax还是另一个动作以ajax结尾facesContext.responseComplete();

<h:commandButton value="Get Both" action="#{form.getBoth}">
    <f:ajax render="result_table" execute="listbox" />
</h:commandButton>

getBoth() {
    getTable();
    getFile();
}

另外,我想要一个复选框,如果选中该复选框,则会弹出另存为对话框并呈现表格。如果未选中,则仅呈现表。


问题答案:

不幸的是,HTTP无法实现。每个请求只能发送回一个响应。您不能将包含PDF文件和ajax响应的响应合并为一个响应。由于这是HTTP限制,因此JSF不能为您做任何事情。另外,根本不可能使用Ajax下载文件,因为由于安全限制,JavaScript不能强制浏览器弹出“
另存为” 对话框,也不能对本地磁盘文件系统进行任何访问。

一种解决方法是单击一次第二个请求返回的位置时,在一次单击按钮上触发 两个 HTTP请求,以使另一个请求Content-Disposition: attachment的响应保持不变。您可以通过onclick在命令按钮上添加一个来实现。

<h:commandButton onclick="window.location='/context/pdfservlet/filename.pdf'">

并创建一个大致类似于此FileServlet示例的PDF
servlet
。如您所见,由此不可能调用JSF操作。您必须将PDF下载方法重构为可完成方法HttpServlet工作的类doGet()。对于JSF托管bean和servlet之间的任何必要通信,您可以使用会话范围或通过请求路径或参数传递所需的信息(只是PDF文件标识符?)。



 类似资料:
  • 问题内容: 我目前有2个命令按钮和一个列表框。根据列表框的选择,生成的结果可以显示在可下载的文件中或呈现为HTML表。该代码基于BalusC的PDF处理教程,而set 。 到目前为止,两个按钮都可以正常工作。但是,我想将两个动作组合为一个按钮。当我使用触发两个动作的按钮进行测试时,什么也没发生(没有文件另存为对话框或表)。这是因为一个动作是ajax还是另一个动作以ajax结尾? 另外,我想要一个复

  • 问题内容: 错误的代码是: 我想做的是,当我单击时,我想刷新这两个图表。但是现在我使用了两个标签,其中第二个不起作用。 那么如何使用Ajax渲染两个图表呢? 问题答案: 您可以使用单个渲染多个组件。只需确保要更新的所有单个组件都有一个。在您的示例中,它将类似于: 这些ID仅需用空格分隔,而不能用逗号分隔(仅适用于)。

  • 问题内容: 是否可以使用goroutine并行下载和保存文件? 以下是我的代码,可从我的保管箱下载文件: 当我在命令前给download_file函数添加前缀时,它不起作用。 问题答案: 那是因为您的主要goroutine正在退出。您需要添加一个WaitGroup以等待所有goroutines退出。例如,

  • 本文向大家介绍golang并发下载多个文件的方法,包括了golang并发下载多个文件的方法的使用技巧和注意事项,需要的朋友参考一下 背景说明 假设有一个分布式文件系统,现需要从该系统中并发下载一部分文件到本地机器。 已知该文件系统的部分节点ip, 以及需要下载的文件fileID列表,并能通过这些信息来拼接下载地址。 其中节点ip列表保存在xx_node.txt, 要下载的fileID保存在xx_f

  • 问题内容: 如何使用php将多个文件下载为zip文件? 问题答案: 您可以使用该类创建一个ZIP文件并将其流式传输到客户端。就像是: 并流式传输: 第二行强制浏览器向用户显示一个下载框,并提示名称filename.zip。第三行是可选的,但某些(主要是较旧的)浏览器在某些情况下会出现问题,而未指定内容大小。

  • 问题内容: 我有一个生成PDF的动作类。该适当地设定。 我 通过Ajax调用来称呼它。我不知道将流传输到浏览器的方法。我尝试了几件事,但没有任何效果。 上面给出了错误: 您的浏览器发送了该服务器无法理解的请求。 问题答案: 您不必为此使用Ajax。只是一个环节是不够的,如果你设置到服务器端代码。这样,如果您最关心的是父页面将保持打开状态(为什么您会为此而不必要地选择Ajax?)。此外,没有办法很好