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コンテンツは表示されません。ドキュメントソースを表示する必要があります。どちらの状況も望ましい結果ではありません。
Webページでは、ボタンに次のコードを使用します。
<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>
次のコード行に注意してください。
response.setHeader( "Content-Disposition", "attachment;filename=" + filename );
<a4j:commandButton ... />
を使用することが問題です。通常の<h:commandButton .../>
は期待どおりに機能します。 <h:commandBUtton .../>
を使用すると、<a4j:outputPanel .../>
でエラーメッセージが更新されなくなります。
関連 シームメッセージ 。
次のMIMEタイプは、「名前を付けて保存」ダイアログをトリガーしません。
"application/octet-stream"
"text/xml"
"text/plain"
どのような変更がa4j:commandButton
により[名前を付けて保存]ダイアログボックスをトリガーし、ユーザーにXMLファイルを(domain.xml
として)保存するように促しますか?
ありがとうございました。
コードには次の問題があります。
<a4j:commandButton .../>
_)は添付ファイルでは機能しません。a4j
_タグも使用できません。<a4j:commandButton .../>
_を_<h:commandButton .../>
_に変更します。bw.write( getDomainDocument() );
をbw.write( document );
に変更します。String document = getDomainDocument();
を_try/catch
_の最初の行に追加します。<a4j:outputPanel.../>
_(表示されていません)を_<h:messages showDetail="false"/>
_に変更します。基本的に、commandButton
に関連するすべてのAjax機能を削除します。エラーメッセージを表示し、RichFaces UIスタイルを活用することは引き続き可能です。
どちらもインラインを使用しません。また、添付ファイル;ただ使う
response.setContentType("text/xml");
response.setHeader( "Content-Disposition", "filename=" + filename );
または
response.setHeader( "Content-Disposition", "filename=\"" + filename + "\"" );
または
response.setHeader( "Content-Disposition", "filename=\"" +
filename.substring(0, filename.lastIndexOf('.')) + "\"");
コンテンツタイプ(メディアタイプ)をapplication/x-download
およびContent-Disposition:attachment;filename=" + fileName;
response.setContentType("application/x-download");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
Content-Disposition
ヘッダー
Content-Disposition: attachment; filename=<file name.ext>
これは、MIMEタイプとは関係ありませんが、Content-Dispositionヘッダーは次のようになります。
Content-Disposition: attachment; filename=genome.jpeg;
実際にクライアントに正しく渡されていることを確認してください(サーバー、プロキシなどによってフィルタリングされていない)。また、出力ストリームを取得する前に、ヘッダーの書き込み順序を変更して設定することもできます。