Background
Write an XML document to a browser’s response stream and cause the browser to display a “Save As” dialog.
Problem
Consider the following download() method:
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();
In Firefox, the XML content is displayed in the browser window. In IE 7, the XML content is not displayed — you have to view the document source. Neither situation is the desired result.
The web page uses the following code for the button:
<a4j:commandButton action="#{domainContent.download}" value="Create Domain" reRender="error" />
The XML that is generated does not start with <?xml version="1.0"?>, rather the XML content resembles:
<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>
Update #1
Note the following line of code:
response.setHeader( "Content-Disposition", "attachment;filename=" + filename );
Update #2
Using <a4j:commandButton ... /> is the problem; a regular <h:commandButton .../> performs as expected. Using the <h:commandBUtton .../> prevents the <a4j:outputPanel .../> from refreshing any error messages.
Related Seam Message.
Mime Type
The following mime types do not trigger the “Save As” dialog:
"application/octet-stream""text/xml""text/plain"
Question
What changes will cause the a4j:commandButton to trigger a “Save As” dialog box so that the user is prompted to save the XML file (as domain.xml)?
Thank you.
Problems
The code has the following issues:
<a4j:commandButton .../>) does not work with attachments.a4jtags.Solution
<a4j:commandButton .../>to<h:commandButton .../>.bw.write( getDomainDocument() );tobw.write( document );.String document = getDomainDocument();to the first line of thetry/catch.<a4j:outputPanel.../>(not shown) to<h:messages showDetail="false"/>.Essentially, remove all the Ajax facilities related to the
commandButton. It is still possible to display error messages and leverage the RichFaces UI style.References