1

次のコードを検討してください。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:o="http://omnifaces.org/ui">

    <f:metadata>
        <o:viewParam name="selected" value="#{testBacking.selected}" >
        </o:viewParam>
    </f:metadata>

    <h:head>
        <title>
            title
        </title>

    </h:head>

    <h:body>
        <o:form includeViewParams="true">
            <h:commandButton action="#{testBacking.go()}" value="go">
                <f:ajax execute="@all" render="@all"/>
            </h:commandButton>
        </o:form>
    </h:body>

</html>

アクションメソッド:

public void go() {
    System.out.println("go() is called");

    Collection<UIViewParameter> viewParams = ViewMetadata.getViewParameters(FacesContext.getCurrentInstance().getViewRoot());

    for (UIViewParameter viewParam : viewParams) {
        System.out.println(viewParam.getName() +" = "+ viewParam.getValue());
    }
}

actionメソッドは正しいviewParam名を返しますが、値は常にnullです。これが意図された動作である場合<o:form includeViewParams="true">、実際の使用にどのように役立ちますか?

私はMojarra2.1.12とOmnifaces1.1を使用しています。

4

1 に答える 1

4

あなたのBeanは明らかにリクエストスコープです。は、ビュースコープ<o:viewParam>のBeanと組み合わせて使用​​することを目的としています。これは、モデルが最初のリクエスト中に既に実行され、プロパティとして存在している場合でも、同じビューへのポストバックごとにモデルが何度も変換/検証/更新されるのを防ぐためです。ビュースコープのBeanの。これにより、モデルがDB呼び出しに基づいてジョブを実行する高価なコンバーターにバインドされている場合の全体的なパフォーマンスが向上します。ショーケースの例もこれを明確に示しています。

これを実現するために、<o:viewParam>基本的に、ポストバック中にこのモデルの変換/検証/更新ジョブをスキップします。ただし、リクエストスコープのBeanはリクエストごとに新しく作成されるため、ポストバックごとに、また<o:viewParam>まったく設定されていない設計のために、初期モデル値が失われます。

これを解決するには、Beanをビュースコープに配置するか、<f:viewParam>代わりに標準を使用します。

に関しては<o:form includeViewParams="true">、これは同期ポストバックでのみ役立ちます。を削除すると、<f:ajax>それがどのように役立つかがわかります。URLがないincludeViewParams="true"と、viewパラメータがないものになります。つまり、URLがない?selected=somevalueと、ブックマークできなくなります。これはとの厳密な関係はなく<o:viewParam>、と組み合わせても同様に機能し<f:viewParam>ます。

于 2012-09-28T13:00:05.087 に答える