1

对我来说,问题很简单。Onclick 锚标记,我使用执行 javascripta4j:jsFunction并且此函数的操作应该从服务器流式传输 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();

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

4

2 回答 2

3

是的,您不能使用 ajax 触发 saveAs 对话框。您可以做的是返回一个 URL。然后打开该 URL(使用 javascript)。然后服务器应该发送文件(带有适当的标题)。当然,您可以跳过所有这些,只需提供指向相关 URL 的链接(除非它是动态生成的)

于 2011-10-07T11:51:30.563 回答
0

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

我添加了一个隐藏 并从 中h:commandButton移动了属性,在完成 javascript 执行后,我显式调用 click 事件以 使用 javascript。这将同步请求 XML。总之欺骗点击事件。action="#{archiveOrderBean.loadSelectedOrder}"a4j:jsFunctionh:commandButton

这是我必须进行更改的一种方式,因为 XML 是在运行时创建的。另一种方式正如@Bozho 所解释的那样。

谢谢@BalusC 的帮助:-)

于 2011-10-11T10:06:49.243 回答