对于我来说这个问题非常简单。点击一个锚标签,我使用a4j:jsFunction
执行一个javascript,并且此函数的操作应该从服务器流式传输一个XML文件。问题是,在richfaces响应中发送的流不会提供saveAs对话框,而是在浏览器上呈现xml。在阅读了很多文章后,我明白Ajax响应不能给出SaveAs对话框。内容配置与附件不适用于AJAX响应
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>
和响应从豆设置。
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();
在这方面的任何帮助将是非常有帮助的。
谢谢。我也在想同样的方式,但是在等待我是否可以在这方面进一步学习:-) – chaosguru
@ chaosguru:Ajax请求由JavaScript代码处理。 JavaScript **不能**处理二进制响应并强制一个*另存为*对话框。您必须通过正常的按钮或链接发送完全可用的同步请求。当前页面在浏览器中将保持不变。这里不需要JS/Ajax。 – BalusC
@BalusC:非常感谢,您的描述真的很有帮助。我会做相应的改变。 – chaosguru