java - 如何从 SiteBean 中的 `UIInput` 获取 `ui:repeat`?

标签 java jakarta-ee jsf-2

我正在尝试验证 ui:repeat 中的多个组件。

如何从 SiteBean 中的 ui:repeat 获取 UIInput

JSF 代码是:

    <f:event listener="#{siteBean.listenerMyListener}" type="preValidate" />
    <ez:inputText id="txtMY" required="true" value="Hallo" />

    <ui:repeat
        id ="myRepeat"
        var="item"
        value="#{siteBean.myList}"
        varStatus="status">

        <ez:panel style="margin-bottom: 7px; #{status.even ? 'background-color: #E6EFC2;' : 'background-color: #e5f1fa;'}">

            <h:messages for="hiddenValidation" />
            <h:inputHidden id="hiddenValidation" value="" />

            <h:outputText value="Rechnung vom:" />
            <ez:inputText id="txtDatum" value="#{item.datum}"
                          style="width: 100px; text-align: right;">
                <f:convertDateTime pattern="dd.MM.yyyy" />
            </ez:inputText>

            <br /><br />

            <h:outputText value="Netto:" />
            <ez:inputText id="txtNetto" required="true" value="#{item.netto}" style="width: 100px; text-align: right;">
                <f:convertNumber pattern="###0.00" />
                <f:validateBean />
            </ez:inputText>

            <br /><br />

            <h:outputText value="Brutto:" />
            <ez:inputText id="txtBrutto" required="true" value="#{item.brutto}" style="width: 100px; text-align: right;">
                <f:convertNumber pattern="###0.00" />
            </ez:inputText>

        </ez:panel>

    </ui:repeat>

bean 代码:

public void listenerMyListener(ComponentSystemEvent event) {

    FacesContext context = FacesContext.getCurrentInstance();

    UIComponent components = event.getComponent();


    UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();


    UIInput search_txtMY = (UIInput) viewRoot.findComponent("frmMY:txtMY");
    String value_txtMY = search_txtMY.getLocalValue().toString(); // Hallo


    UIInput search_txtDatum = (UIInput) viewRoot.findComponent("frmMY:myRepeat:0:txtDatum"); // NULL
    String value_txtDatum = search_txtDatum.getLocalValue().toString(); // java.lang.NullPointerException  

}

最佳答案

<ui:repeat>不是 View 构建时间标签,而是 View 渲染时间标签。只有一个 <h:inputText> View 树中的组件,由 frmMY:myRepeat:txtDatum 标识.然而,它被渲染了多次,与 <ui:repeat> 一样多迭代。如果您使用的是 <c:forEach> ,这是一个 View 构建时间标签,那么确实有多个<h:inputText> View 中的组件,每个组件仅呈现一次。

您需要以不同的方式解决问题。 <c:forEach>可能不是正确的解决方案,因为它可能会产生令人讨厌的“副作用”,具体取决于整个 View 和模型的设计方式。由于功能要求不明确并且需要在系统事件监听器中收集输入值没有任何意义(我想不出这种方法在现实世界中有任何合理的应用),我无法提出任何解决方法它不同而正确。我你只需要一个Validator .

关于java - 如何从 SiteBean 中的 `UIInput` 获取 `ui:repeat`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8986803/

相关文章:

java - JTable 获取特定列的值

java - 线程完成时 Log4j 追加到日志文件

java - 基于 JSF JDBC 领域表单的身份验证搜索(按用户名和电子邮件地址)

jakarta-ee - TomEE 是如何实现依赖注入(inject)的?

jsf-2 - 使用 HazelCast 和 session 作用域 bean 的序列化问题

jsf - 检查 JSF EL 显示的严重性消息

validation - 如何在自定义多字段验证器中将其他组件标记为无效

java - 如何在 Findbugs 中使用 Checker Framework 注释?

java.net.SocketException : No buffer space available (maximum connections reached? ): 连接 MongoDB JAVA API 驱动程序

java - 在 Tapestry 中选择名称而不是 ID