3

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

做了这项工作。

4

1 回答 1

3

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

有关标记处理程序和组件之间区别的更多信息,请参阅: https ://rogerkeays.com/jsf-c-foreach-vs-ui-repeat

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

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

于 2011-03-09T13:45:49.763 回答