我正在寻找有关如何实施以下内容的最佳实践指南。我使用的是JSF2,Spring 3,PrimeFaces 3.3,MyBatis。
我有一个数据输入屏幕,其输入字段链接到VO对象,这是托管bean上的属性。用户可以创建新记录,也可以搜索要编辑的现有记录。
当选择编辑现有记录选项时,会出现一个对话框,用户可以在其中搜索和检索可供选择的潜在记录列表。
他们一次只能选择一个记录进行编辑。完成选择后,对话框将关闭,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>
非常感谢
答案 0 :(得分:0)
将搜索条件初始化为虚拟对象肯定会有效。不是很整洁,但它的工作原理。另一方面,您可以尝试使用数据容器组件,如<p:dataGrid/>
或<p:dataTable/>
。有一个var
属性可以让你通过空引用来逃避,就像你想要实现的情况一样。 var
属性会补偿空数据集。话虽这么说,你现在可以在你的支持bean中有一个List<DataEntryVo>
,然后在你的视图中:
<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中,您将拥有{{1 (或者类是什么类的primefaces然后根据你的需要调用UIcomponent field1Input = new HtmlInputText();
或field1Input.getValue()
。这也是一个好主意,让你的bean成为一个ViewScoped bean,以避免不必要的麻烦让这个解决方案工作