2011-10-07 36 views
1

对于我来说这个问题非常简单。点击一个锚标签,我使用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(); 

在这方面的任何帮助将是非常有帮助的。

回答

0

我可以用粗糙的方法来解决这个问题,但不能推荐,但别无选择。

我添加了一个隐藏的h:commandButtona4j:jsFunction移动属性action="#{archiveOrderBean.loadSelectedOrder}",完成后的JavaScript执行我使用JavaScript显式调用点击事件h:commandButton。这将同步对XML的请求。总之决定点击事件。

这是从运行时创建XML以来我不得不做的更改的一种方法。另一种方式是由@Bozho解释。

谢谢@BalusC的帮助:-)

3

是的,你不能用ajax触发saveAs对话框。你可以做的是返回一个URL。然后打开该URL(使用JavaScript)。然后服务器应该发送文件(使用适当的头文件)。当然,你可以跳过所有这些,只是给链接到问题的URL(除非它是动态生成的)

+0

谢谢。我也在想同样的方式,但是在等待我是否可以在这方面进一步学习:-) – chaosguru

+1

@ chaosguru:Ajax请求由JavaScript代码处理。 JavaScript **不能**处理二进制响应并强制一个*另存为*对话框。您必须通过正常的按钮或链接发送完全可用的同步请求。当前页面在浏览器中将保持不变。这里不需要JS/Ajax。 – BalusC

+0

@BalusC:非常感谢,您的描述真的很有帮助。我会做相应的改变。 – chaosguru

相关问题