2

私のJSFアプリケーションには、2つのページとがlist.jsfありdetails.jsf、各ページにはビュースコープを持つ独自のコントローラーがあります。list.jsfアクションを呼び出して<h:commandLink>パラメータを渡すがあります。

<h:commandLink value="details" action="#{listBean.goToDetails}" >
   <f:param  name="id" value="#{listBean.object.pk}"/></h:commandLink>

これはBeanの方法です。

@ManagedBean
@ViewScoped
public class ListBean {
    public String goToDetails() {
        // some code
        return "details?faces-redirect=true";
    }
}

2番目のBeanのパラメーターを次のように読み取ります。

Map<String, String> params = FacesContext.getCurrentInstance()
                .getExternalContext().getRequestParameterMap();
        this.setIdParam(params.get("id"));

このコードを実行すると、パラメーターが2番目のBeanインスタンスに渡されません。ただし、ナビゲーションをforward(なしfaces-redirect=true)に変更すると、パラメーターが渡され、詳細を確認できますdetails.jsfが、URLが現在のページと一致しません。

したがって、私がやりたいのは、POSTパラメーター(f:param)で「jsf暗黙的リダイレクト」(転送ではない)を使用することです。

4

2 に答える 2

6

POST を使用してリダイレクトすることはできません。

HTTP リダイレクトを使用faces-redirect=trueしている場合、何が起こるか: サーバーはリダイレクト用の URL を含むHTTP 302応答をブラウザーに送信し、ブラウザーはその URL で GET 要求を実行します。

代わりにできることは、次のidようにして、GET 経由でパラメーターを送信する URL にリダイレクトすることです。

public void goToDetails(){
    // some code
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext()
    String id = object.getPk().toString();
    ec.redirect(ec.getRequestContextPath() + "/details.jsf?id=" + id);
}

OmniFaces ライブラリFaces#redirect()のように、この種の util メソッドを作成したい場合があります。

更新:コメントに記載されているように、戻り文字列に id を追加することもできます。

public String goToDetails(){
    // some code
    String id = object.getPk().toString();
    return "details?faces-redirect=true&id=" + id;
}
于 2012-12-27T13:07:10.530 に答える
5

背後にあるバッキングBeanlist.jsfが処理を行う必要がない場合(例からは、そのようには見えません)、details.jsfGETリクエストを介して直接リンクする必要があります。

<h:link>このためのタグは次のように使用できます。

<h:link value="details" outcome="details.jsf" >
    <f:param  name="id" value="#{listBean.object.pk}"/>
</h:link>

詳細ビューで、ビューがGETパラメーターを使用することを宣言し、それをそのビューのバッキングBeanに直接バインドできます。

<f:metadata>
    <f:viewParam name="id" value="#{detailsBean.id}" />
</f:metadata>

さらに、そのパラメータを直接検証または変換できるためdetailsBean、文字列ベースのIDの代わりに適切なタイプのオブジェクトを取得できます。detailsBeanGETパラメータが挿入された後、後処理を行う必要がある場合は、次のpreRenderViewイベントを使用できます。

<f:metadata>
    <f:viewParam name="id" value="#{detailsBean.id}" />
    <f:event type="preRenderView" listener="#{detailsBean.preRenderView()}" />
</f:metadata>

実例:

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

于 2012-12-28T09:40:16.593 に答える