JSF commandLink、POST、および戻るボタン
-
22-07-2019 - |
質問
最近、JSFの仕事を始めました。それ以前は、Web開発に常にPHPまたはPythonを使用していました。
JS:h:commandLinkタグが使用されている場合、JSFがHTTP POSTを使用してナビゲートすることを知って、少し驚きました。
これは明らかにJSFアプリを構築する正しい方法なので、commandLinkを使用しています。 JSFがナビゲーションにPOSTを使用するのはなぜですか? GETの何が問題になっていますか? onclickイベント用にJSFによって自動的に生成されるJavascriptがGETリクエストの最大長を超える可能性があると想定できます。
h:commandLinkを使用してナビゲートされるページが既にいくつかあります。これは、ブラウザの戻るボタンを使用するまで有効です。 JSFで戻るボタンを処理するにはどうすればよいですか?
JSFがPOSTを中心に構築された理由を理解するのに苦労しています。ブックマーク、バックページング、検索エンジンでページをインデックスに登録する機能を破壊します。
解決
クライアントでリンクを作成するのに役立ちませんが、 outputLink 。
いくつかの更新の問題に役立つナビゲーションルールのリダイレクト要素があります。
<navigation-rule>
<display-name>navBack</display-name>
<from-view-id>/navBack.jsp</from-view-id>
<navigation-case>
<from-outcome>navTo</from-outcome>
<to-view-id>/navTo.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
他のすべてが失敗した場合、次のアクションのように、自分でリダイレクトURLを実行できます。
public String doAction() {
System.out.println("Did some non-idempotent operation");
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
Application app = context.getApplication();
ViewHandler viewHandler = app.getViewHandler();
String url = viewHandler.getActionURL(context, "/navTo.jsp");
url = url + (url.indexOf('?') < 0 ? '?' : '+') + "foo=bar";
url = extContext.encodeResourceURL(url);
try {
extContext.redirect(url);
} catch (IOException e) {
throw new FacesException(e);
}
return null;
}
警告:URLを正しくエンコードしているかどうか思い出せません。
さまざまなサードパーティライブラリが、さまざまな機能を追加します。この領域でJSF 2.0で何かが行われたかどうかはわかりませんが、一見の価値があるかもしれません。
他のヒント
うん。 JSFはPOSTを中心に構築されており、JSFの最大のこだわりの1つです。ブックマーク可能なGETableページについては、JAX-RS / SeamまたはSpringをご覧ください。
BalusCが彼のブログで言ったように、GETページ間のナビゲーションに使用する必要があります。
ナビゲーションには h:outputLink
を使用します。
彼のPostRedirectGetListenerを読むと、フォームの再送信確認メッセージのバック/リフレッシュが解決されます。
部分的なAjax処理を処理するために(関連する場合) beforePhase
に以下を追加することをお勧めします。
if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
return;
}