查找嵌套在JSF树中的a4j:repeat标记中的第n个组件

时间:2011-03-09 12:36:55

标签: java jsf richfaces facescontext

我在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");

完成了工作。

1 个答案:

答案 0 :(得分:3)

a4j:repeat不是为每次迭代创建专用组件的标记处理程序。相反,它会导致在JSF生命周期的每个阶段重复访问其子组件。也就是说,每行没有专用组件。

有关标记处理程序和组件之间区别的更多信息,请参阅: http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets

通常可以避免在Java端按名称查找组件。如果您告诉我们您为什么要这样做,我们可能会建议替代方案。

编辑:JSF中的验证通常由操作方法中的Validator或(对于复杂情况)通过直接处理辅助bean中的数据,手动将FacesMessage放入FacesContext来完成。我不明白你为什么需要这个组件进行验证?