我在 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个组件?在客户端,组件呈现如下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");
做了这项工作。