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

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

  

到目前为止,这两个按钮都正常工作 但是,我想将两个动作组合成一个按钮。 当我用一个触发两个动作的按钮测试它时,没有任何反应(没有文件保存为对话框或表格渲染)。 这是因为一个动作是ajax还是因为另一个动作是用facesContext.responseComplete();完成的facesContext.responseComplete();

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

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

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

解决方法是在单个按钮单击时触发两个 HTTP请求,其中第二个请求返回Content-Disposition: attachment以便其他请求的响应保持不变。 您可以通过向命令按钮添加onclick来实现此目的。

  

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

我传递了类似的情况,在我的情况下,我使用ajax richfaces标签lib和环境命令按钮与ajax表单标签解决。