3

BalusCの回答によると、使用しました

FacesContext.getCurrentInstance().getExternalContext().redirect(url);

私の@PostConstruct方法では、JSFがビューをレンダリングしてユーザーをリダイレクトするのを止めます。ただし、コードを実行しようとするとjava.lang.IllegalStateException、上記の行で例外が発生します。

WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:524)
    at StudentManagedBean.CourseSummary.init(CourseSummary.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

更新:@PostConstructメソッドに次の行を追加しました。

System.out.println("INIT " + FacesContext.getCurrentInstance().getExternalContext().isResponseCommitted());

そして私が見たのはINIT true. @PostConstructメソッドが呼び出される前に応答がコミットされることになっているのだろうか?

アドバイスをいただければ大変助かります。

4

2 に答える 2

3

私の更新で述べたように、次の行が印刷されましたINIT true

System.out.println("INIT " + FacesContext.getCurrentInstance().getExternalContext().isResponseCommitted());

上記の状況が発生した理由がようやくわかりました。私のページでManagedBean Xは、リダイレクト機能を含む が によって参照される前に、ページ構造の上に配置されているによってUIComponent A別のものが参照されていました。その結果、 によって応答が部分的にコミットされたため、 は要求を送信できません。ManagedBean YUIComponent BUIComponent AManagedBean YManagedBean Xredirect

于 2013-03-30T06:29:52.530 に答える
2

応答が完了してファイナライズされたとしても、JSFはライフサイクルイベントを実行するという通常のルーチンを回避するほど賢くないため、リダイレクトはここでは機能しません。

代わりに、RequestDispatcherから転送を試すことができます。転送は、次の点でリダイレクトとは異なります。

  • サーブレットによって内部的に実行されます
  • ブラウザは無関心です
  • 元のURLはそのまま残ります

これがどのように行われるかを示すいくつかのコードがあります...

RequestDispatcher dispatcher =
    ((ServletRequest) context.getExternalContext().getRequest())
    .getRequestDispatcher("/j_spring_security_logout");

try {
  dispatcher.forward((ServletRequest) context.getExternalContext().getRequest(),
  (ServletResponse) context.getExternalContext().getResponse());
} catch (ServletException e) {
  log.error("ServletException", e);
} catch (IOException e) {
  log.error("IOException", e);
}

これを行うことにより、FacesServletの実行を途中で終了し、それを別のサーブレットに完全に転送することになります。この他のサーブレットから、目的の場所にリダイレクトできる可能性があると思います。

于 2012-07-25T11:21:05.780 に答える