小编典典

附件的HTTP响应标头内容处理

ajax

背景

将XML文档写入浏览器的响应流,并使浏览器显示“另存为”对话框。

问题

请考虑以下download()方法:

  HttpServletResponse response = getResponse();

  BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(
      response.getOutputStream() ) );

  String filename = "domain.xml";
  String mimeType = new MimetypesFileTypeMap().getContentType( filename );

  // Prints "application/octet-stream"
  System.out.println( "mimeType: " + mimeType );

  // response.setContentType( "text/xml;charset=UTF-8" );
  response.setContentType( mimeType );
  response.setHeader( "Content-Disposition", "attachment;filename="
      + filename );

  bw.write( getDomainDocument() );
  bw.flush();
  bw.close();

在Firefox中,XML内容显示在浏览器窗口中。在IE 7中,不会显示XML内容-您必须查看文档源。两种情况都不是理想的结果。

该网页对该按钮使用以下代码:

    <a4j:commandButton action="#{domainContent.download}" value="Create Domain" reRender="error" />

生成的XML 并非以 开头<?xml version="1.0"?>,而是XML内容类似于:

<schema xmlns="http://www.jaspersoft.com/2007/SL/XMLSchema" version="1.0">
  <items>
    <item description="EDT Class Code" descriptionId="" label="EDT Class Code" labelId="" resourceId="as_pay_payrolldeduction.edtclass"/>
  </items>
  <resources>
    <jdbcTable datasourceId="JNDI" id="as_pay_payrolldeduction" tableName="as_pay.payrolldeduction">
      <fieldList>
        <field id="payamount" type="java.math.BigDecimal"/>
      </fieldList>
    </jdbcTable>
  </resources>
</schema>

更新#1

请注意以下代码行:

response.setHeader( "Content-Disposition", "attachment;filename=" + filename );

更新#2

使用<a4j:commandButton ... />是问题。一个正常的<h:commandButton .../>表现如预期。使用<h:commandBUtton .../>可以防止<a4j:outputPanel .../>刷新任何错误消息。

相关的接缝消息

哑剧类型

以下MIME类型不会触发“另存为”对话框:

  • "application/octet-stream"
  • "text/xml"
  • "text/plain"

哪些更改将导致a4j:commandButton触发“另存为”对话框,以便提示用户保存XML文件(如domain.xml)?

谢谢。


阅读 329

收藏
2020-07-26

共1个答案

小编典典

问题

该代码存在以下问题:

  • Ajax调用(<a4j:commandButton .../>)不适用于附件。
  • 创建输出内容必须首先发生。
  • 显示错误消息也不能使用基于Ajax的a4j标签。

  1. 更改<a4j:commandButton .../><h:commandButton .../>
  2. 更新源代码:
    1. 更改bw.write( getDomainDocument() );bw.write( document );
    2. 添加String document = getDomainDocument();到的第一行try/catch
  3. <a4j:outputPanel.../>(未显示)更改为<h:messages showDetail="false"/>

本质上,删除与相关的所有Ajax工具commandButton。仍然可以显示错误消息并利用RichFaces UI样式。

参考资料

2020-07-26