对我来说问题非常简单。单击锚标记,我使用a4j:jsFunction
执行javascript,此函数的操作应该从服务器流式传输XML文件。问题是,在richfaces响应上发送的流不会给出saveAs对话框,而是在浏览器上呈现xml。在阅读了很多文章后,我了解到Ajax响应无法给出一个saveAs对话框。
xhtml片段:
<h:form>
<a4j:jsFunction name="updateCart" reRender="idFavouritePanel">
<a4j:actionparam name="jsonObject" assignTo="#{archiveOrderBean.jsonObject}"/>
</a4j:jsFunction>
<a4j:jsFunction name="download" reRender="partTableId" action="#{archiveOrderBean.loadSelectedOrder}">
<a4j:actionparam name="strId" assignTo="#{archiveOrderBean.strId}" />
</a4j:jsFunction>
</h:form>
和bean的响应集。
response.setContentType("application/xml");
response.setContentLength(byteArr.length);
response.addHeader("Content-Disposition", "attachment; filename=" + attr.getUrl());
// writer.write(byteArr.toString());
// writer.flush();
response.getOutputStream().write(byteArr);
response.getOutputStream().flush();
// post(trueStr,encPath,encUrl,trueStr,response);
FacesContext.getCurrentInstance().responseComplete();
这方面的任何帮助都会非常有用。
答案 0 :(得分:3)
是的,您无法使用ajax触发saveAs对话框。你可以做的是返回一个URL。然后打开该URL(使用javascript)。然后服务器应该发送文件(带有适当的标题)。当然,您可以跳过所有这些,只是提供相关URL的链接(除非它是动态生成的)
答案 1 :(得分:0)
我可以用粗略的方法来解决这个问题,不是很推荐,但是别无选择。
我添加了隐藏的h:commandButton
并从action="#{archiveOrderBean.loadSelectedOrder}"
移动了属性a4j:jsFunction
,在javascript执行完成后,我使用javascript明确调用h:commandButton
的click事件。这将是XML的同步请求。简而言之就是点击事件。
这是我在运行时创建XML以来必须进行更改的一种方法。另一种方式是由@Bozho解释的。
感谢@BalusC的帮助: - )