0

私はJSFとPrimeFacesを使用しました。誰かがMenuItemをクリックしたときに起動するActionListenerがあります。

@Override
public void processAction(ActionEvent event) throws AbortProcessingException
{
    Resource resouce = getResources().get(0);
    try
    {
        ResourceDelegate delegate = new ResourceDelegate(resouce, configDao);
        JSFUtils.writeToOutputStream(Mime.getMimeTypeForFileType(FileUtilities.getExtension(resouce.getName())), delegate.getData());
    }
    catch(Exception e)
    {
        logger.log(Level.SEVERE, "Cant show resource",e);
    }

}

そのメニュー項目で、次のコードを使用して画像のデータをリクエストストリームに書き込みます。

/**
 * Writes binary data to the response for the browser to display
 * @param contentType
 * @param data
 * @throws IOException 
 */
public static void writeToOutputStream(String contentType, byte[] data) throws IOException
{
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletResponse hsr = getHttpServletResponse();
    hsr.setContentType(contentType);
    OutputStream stream = hsr.getOutputStream();
    stream.write(data);
    //Tell JSF to skip the remaining phases of the lifecycle
    context.responseComplete();
}

ActionListenerが完了すると、画像が表示されると思いますが、そうではありません。何も起こりません。画像を正しく表示するために他に何かする必要がありますか?

4

1 に答える 1

4

これは、リクエストがajaxによって起動された場合に発生する可能性があります。これは、ほとんどすべてのPrimeFacesアクションコンポーネントのデフォルトの場合です。JSF / PrimeFacesの場合、ajaxリクエストは、HTMLDOMのどの部分をどのように更新するかに関する情報を含む特別なXML応答を返すことになっています。

ただし、ここではajax応答として「ファイルのダウンロード」を送信しています。これは、PrimeFacesのajaxエンジンではそのように解釈できません。また、JavaScriptにはセキュリティ上の理由から、[名前を付けて保存]ダイアログを強制する機能がありません。それは実際には同期要求によって要求されるべきです。

PrimeFacesの場合<p:menuitem>、属性を追加ajax="false"してajaxの性質をオフにし、代わりに同期リクエストを起動させる必要があります。

<p:menuitem ... ajax="false" />

(同じ属性は、PrimeFacesの他のすべてのアクションコンポーネントでも使用できます<p:commandButton>

「何も起こらない」というのは実際には真実ではありません。Webブラウザの組み込みWeb開発者ツールセットの「ネットワーク」セクションで具体的なHTTP応答を見たことがあるでしょう(Chrome / IE9 / FirebugでF12を押してください)。おそらく、JavaScriptコンソールで解釈できないajax応答に関するJavaScriptエラーが発生するはずです。

参照:

于 2012-11-17T17:16:54.090 に答える