带附件的内容处置不适用于AJAX响应

时间:2011-10-07 07:34:57

标签: ajax jsf servlets richfaces jsf-1.2

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

这方面的任何帮助都会非常有用。

2 个答案:

答案 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的帮助: - )