2

JSF アクション メソッドから非 JSF ページにリクエストを転送したい。JSFアクションで以下のコードを使用しています:

public String submitUserResponse() {
    // ...

    parseResponse("foo.jsp", request, response);

    // ...

    return "nextpage";
}  

private String parseResponse(String uri, HttpServletRequest request, HttpServletResponse response) {
    if (uri != null) { 
        RequestDispatcher dispatcher = request.getRequestDispatcher(uri);
        dispatcher.forward(request, response);
        return null;
    }

    // ...

    return "xxxx";
}

ユーザーが JSF ページから送信ボタンをクリックすると、submitUserResponse()アクション メソッドが呼び出され、このメソッドはnextpage文字列を返します。ここで、リクエストは通常​​のフローで次の JSF ページに転送されます。しかし、私の要件では、リクエストを次の非 JSF ページに転送する必要があります。行っていますが、サーバーで例外の下に表示されています。

java.lang.IllegalStateException: 応答がコミットされた後に転送できません

parseResponse(...)を使用してリクエストを転送した後、 との間のコード行return "nextpage";がまだ実行されていることを確認しdispatched.forward(uri)ました。で同じことが起こりましたresponse.sendRedirect(url)。これはどのように発生し、どうすれば解決できますか?

4

2 に答える 2

12

ここで私の疑問は次のとおりです。response.sendRedirect("") でも同じことが起こっています。

returnメソッドブロックから飛び出すために呼び出さなかったからです。、または実際にはinclude()、自動的にそれを行う魔法はありません。これらは、他のメソッドと同様に単なる Java メソッドです (もちろん例外があります)。それらは順番に呼び出され、コードはメソッドブロックまたはステートメントの終わりまで続きます。自分で書いて自分で制御するコード フローがすべてです。forward()sendRedirect()System#exit()return

とは言っても、通常の JSF の慣例では、ExternalContext#dispatch()orExternalContext#redirect()を使用する必要があります (最初のケースが適用されます)。サーブレット API などの JSF コードの不要な「内部」の乱雑さからコードを解放するだけでなく、最初の問題FacesContext#responseComplete()を修正するために行うこともできた呼び出しの必要がなくなります。IllegalStateException

一言で言えば:あなたのコードを

public void submitUserResponse(){
    String uri = "foo.jsp";
    FacesContext.getCurrentInstance().getExternalContext().dispatch(uri);
}  

それで全部です。JSF フードの下からサーブレットの要求/応答を不必要に掘り下げる必要はありません。メソッドが宣言されていることに注意してくださいvoid。これは完全に受け入れられますが、IDE のようなよく知っている人はそれについて文句を言うでしょうが、もしそうなら、それを無視するか、置き換えてString追加してreturn null;ください。

以下も参照してください。

于 2009-12-17T14:33:15.533 に答える
2

これは私のために働いた:

FacesContext.getCurrentInstance().getExternalContext().dispatch("/ServletUrl");

(フォワード スラッシュ '/' に特に注意してください)

于 2010-12-26T12:48:24.047 に答える