1

以下を実装する方法に関するベストプラクティスのガイダンスを探しています。JSF2、Spring 3、PrimeFaces 3.3、MyBatis を使用しています。

要件:

マネージド Bean のプロパティである VO オブジェクトにリンクされた入力フィールドを含むデータ入力画面があります。ユーザーは、新しいレコードを作成するか、既存のレコードを検索して編集することができます。

[既存のレコードを編集する] オプションを選択すると、ダイアログ ボックスが表示され、ユーザーは、そこから選択する可能性のあるレコードのリストを検索および取得できます。

一度に編集するレコードは 1 つしか選択できません。選択が完了すると、ダイアログ ボックスが閉じ、選択したデータが VO オブジェクトに入力され、ユーザーが編集できるようになります。

問題:

検索フォームが送信され、編集用の潜在的なレコードのリストを取得するときに、VO オブジェクトがまだ初期化されていないため、ProcessValidationPhase が「ターゲットに到達できません」というエラーでプロセスを失敗させます。

このシナリオを実装する最善の方法は何ですか? マネージ Bean で VO オブジェクトを空白の値で初期化する必要がありますか? または、マネージド Bean の初期化中に呼び出される VO オブジェクトに初期化メソッドが必要ですか?

DataEntry.XHTML

主なデータ入力フィールド:

            <p:panelGrid id="dataEntry">
                <p:row>
                    <p:column style="width:200px;">
                        <h:outputLabel value="Field 1:"/></p:column>
                    <p:column>
                        <p:inputText value="#{managedBean.dataEntryVo.field1}"
                                     style="width:50px;"
                                     disabled="true"/>
                    </p:column>
                </p:row>

                <p:row>
                    <p:column>
                        <h:outputLabel value="Field 2:"/>
                    </p:column>
                    <p:column>
                        <p:inputText value="#{managedBean.dataEntryVo.field2}"
                                     style="width:50px;"
                                     disabled="true"/>
                    </p:column>
                </p:row>

            </p:panelGrid>

編集するために選択できるレコードのリストを取得するために使用されるダイアログ ボックスのコマンド ボタン:

            <p:commandButton id="retrieveDataCb"
                            value="Retrieve"
                            actionListener="#{managedBean.retrieveDataEntryList}"
                            update=":dataEntryForm:retrievedList">
            </p:commandButton>

どうもありがとう

4

1 に答える 1

0

検索条件をダミー オブジェクトに初期化すると、確実に機能します。あまりきれいではありませんが、機能します。一方、<p:dataGrid/>または のようなデータ コンテナ コンポーネントを使用してみることができます<p:dataTable/>var達成しようとしている場合のように、null 参照を回避できる属性があります。このvar属性は、空のデータセットを補います。そうは言っても List<DataEntryVo>、バッキング Bean に a を追加してからビューに追加できるようになりました。

<p:dataGrid id="dataEntry" value="#{managedBean.theVoList}"  var="vo">
            <p:panel>
               <p:panelGrid>
                <p:column style="width:200px;">
                    <h:outputLabel value="Field 1:"/>
                </p:column>
                <p:column>
                    <p:inputText value="#{vo.field1}" style="width:50px;" disabled"true"/>
                </p:column>
                  <p:row>
                <p:column>
                    <h:outputLabel value="Field 2:"/>
                </p:column>
                <p:column>
                    <p:inputText value="#{vo.field2}" style="width:50px;" disabled="true"/>
                </p:column>
                </p:row>
                </p:panelGrid>
            </p:panel> 
           </p:dataGrid>

別の方法として、マネージド Bean 内のオブジェクトに入力フィールドを完全にバインドすることを避けることができます。代わりに、入力フィールドをマネージド Bean に直接バインドし<p:inputText binding="#{vo.field1Input}" style="width:50px;" disabled="true"/>、バッキング Bean 内で直接バインドしますUIcomponent field1Input = new HtmlInputText();(または、primefaces のクラスが何であれ、呼び出します)。このソリューションを機能させるための不必要なトラブルを避けるために、Bean を ViewScoped Bean にすることもfield1Input.getValue()field1Input.setValue()勧めします。

于 2012-09-08T01:38:42.297 に答える