1

我正在寻找有关如何实施以下内容的最佳实践指南。我正在使用 JSF2、Spring 3、PrimeFaces 3.3、MyBatis。

要求:

我有一个数据输入屏幕,其中的输入字段链接到 VO 对象,VO 对象是托管 bean 上的一个属性。用户可以创建新记录,也可以搜索现有记录进行编辑。

选择现有的记录选项时,将出现一个对话框,在该对话框中,用户可以在其中搜索和检索可从中选择的潜在记录列表。

他们一次只能选择一条记录进行编辑。一旦他们做出选择,对话框就会关闭,VO 对象会填充所选数据,供用户编辑。

问题:

当提交搜索表单以检索用于编辑的潜在记录列表时,VO 对象尚未初始化,并导致 ProcessValidationPhase 以“目标无法访问”使该过程失败。

实现此方案的最佳方法是什么?VO 对象是否应该在托管 bean 中使用空白值初始化?或者是否应该在托管 bean 的初始化期间调用 VO 对象的初始化方法?

数据条目.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

将搜索标准初始化为虚拟对象肯定会起作用。不是很整洁,但它有效。另一方面,您可以尝试使用数据容器组件,例如 a<p:dataGrid/><p:dataTable/>。有一个var属性可以让您摆脱空引用,例如您尝试实现的情况。该var属性补偿空数据集。话虽如此,您现在可以 List<DataEntryVo>在您的 backing bean 中添加一个,然后在您的视图中添加:

<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 的类,然后调用field1Input.getValue()field1Input.setValue()根据您的需要。将 bean 设为 ViewScoped bean 也是一个好主意,以避免让此解决方案正常工作的不必要麻烦。

于 2012-09-08T01:38:42.297 回答