我在JSF树中查找组件时遇到问题。假设我有以下模板:
<a4j:form id="someForm">
<a4j:outputPanel id="somePanel">
<a4j:repeat id="people" value="#{bean.people}" rowKeyVar="_row" var="_data" stateVar="_state">
<s:decorate id="personPanel" template="edit.xhtml">
<h:outputLabel for="personAge" value="Choose your age:" />
<h:selectOneMenu id="personAge" value="#{_data.age}">
<s:selectItems var="_item" value="#{ageValues}" label="#{_item.description}" />
</h:selectOneMenu>
</s:decorate>
</a4j:repeat>
</a4j:outputPanel>
</a4j:form>
命名空间定义为:
xmlns:a4j="http://richfaces.org/a4j"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:s="http://jboss.com/products/seam/taglib"
如您所见,有一个a4j:repeat
标记,因此页面上可以有 n 呈现的选择输入。如何在服务器端的JSF树中找到 n -th组件?在客户端,组件呈现为:someForm:somePanel:0:personPanel:personAge
。我试图以这种方式找到组件:
UIViewRoot root = FacesContext.getCurrentInstance().getViewRoot();
UIInput ageInput = (UIInput) root.findComponent("someForm:somePanel:0:personPanel:personAge");
但无法找到。我检查了树,看起来那个带有该ID的组件不存在。
那么我怎样才能获得这个组件?有没有办法实现这个目标?
修改
我找到了一些解决方法。实际上,我不需要组件,而是它们的价值观。可以通过名称从请求中检索值。以下代码:
FacesContext facesContext = FacesContext.getCurrentInstance();
String ageValue = facesContext.getExternalContext().getRequestParameterMap().get("someForm:somePanel:0:personPanel:personAge");
完成了工作。
答案 0 :(得分:3)
a4j:repeat不是为每次迭代创建专用组件的标记处理程序。相反,它会导致在JSF生命周期的每个阶段重复访问其子组件。也就是说,每行没有专用组件。
有关标记处理程序和组件之间区别的更多信息,请参阅: http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets
通常可以避免在Java端按名称查找组件。如果您告诉我们您为什么要这样做,我们可能会建议替代方案。
编辑:JSF中的验证通常由操作方法中的Validator或(对于复杂情况)通过直接处理辅助bean中的数据,手动将FacesMessage放入FacesContext来完成。我不明白你为什么需要这个组件进行验证?