これは興味深いアイデアです。それが実際にどのように機能するかを知りたいです。
ナビゲーション ルールの取得
ナビゲーションはNavigationHandlerによって処理されます。NavigationHandler を取得するのは難しくありませんが、API は使用するルールを公開しません。
私が見ているように、次のことができます。
- 初期化時にfaces-config.xmlを解析し、ルールをアプリケーションコンテキストに保存します(簡単)
- faces-config.xml のルールを無視する独自の NavigationHandler を実装するか、独自のルール ファイルでそれらを補足し、そのルールセットを何らかの形で公開します (実行可能ですが、少し手間がかかります) 。
- 独自のFacesContextをモックして、既存のナビゲーション ハンドラに渡します ( 2 つの FacesContext オブジェクトを同じスレッドに共存させるのは非常に難しく、非常に非効率的です) 。
さて、あなたにも別の問題があります。ビューを検索するためのマッピングをどこに保持しますか? それらを豆にハードコーディングしますか?
ナビゲーション ルールの使用
余談ですが、バックエンドからパラメーターを含む URL を作成する方法は 2 つあります。どちらも、ある種の Bean を定義する必要があります。
<managed-bean>
<managed-bean-name>navBean</managed-bean-name>
<managed-bean-class>foo.NavBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
ソース:
package foo;
import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
public class NavBean implements Serializable {
private String getView() {
String viewId = "/showMessage.faces"; // or look this up somewhere
return viewId;
}
/**
* Regular link to page
*/
public String getUrlLink() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String viewId = getView();
String navUrl = context.getExternalContext().encodeActionURL(
extContext.getRequestContextPath() + viewId);
return navUrl;
}
/**
* Just some value
*/
public String getValue() {
return "" + System.currentTimeMillis();
}
/**
* Invoked by action
*/
public String invokeRedirect() {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
String viewId = getView();
try {
String charEncoding = extContext.getRequestCharacterEncoding();
String name = URLEncoder.encode("foo", charEncoding);
String value = URLEncoder.encode(getValue(), charEncoding);
viewId = extContext.getRequestContextPath() + viewId + '?' + name
+ "=" + value;
String urlLink = context.getExternalContext().encodeActionURL(
viewId);
extContext.redirect(urlLink);
} catch (IOException e) {
extContext.log(getClass().getName() + ".invokeRedirect", e);
}
return null;
}
}
得る
GET リクエストの場合、UIParameters を使用して値を設定し、レンダラーにパラメーター リストを作成させることができます。
<h:outputLink value="#{navBean.urlLink}">
<f:param name="foo" value="#{navBean.value}" />
<h:outputText value="get" />
</h:outputLink>
役職
POST アクション中に URL をビューに設定する場合は、(ボタンまたは commandLink によって呼び出される) アクションでリダイレクトを使用して行うことができます。
<h:commandLink id="myCommandLink" action="#{navBean.invokeRedirect}">
<h:outputText value="post" />
</h:commandLink>
ノート
文字列をエンコードするためにExternalContext.encodeActionURLが使用されることに注意してください。これは、コンテキスト (ポートレットなど) 間で移植可能なコードを作成するための優れた方法です。画像またはダウンロード ファイルへのリンクをエンコードする場合は、encodeResourceURLを使用します。