【问题标题】:How can I get `UIInput` from a `ui:repeat` in the SiteBean?如何从 SiteBean 中的 `ui:repeat` 获取 `UIInput`?
【发布时间】:2012-02-17 16:45:03
【问题描述】:

我正在尝试验证 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>

豆码:

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  

}

【问题讨论】:

  • 据我了解,&lt;ui:repeat&gt; 中的组件不会复制到 JSF 树中。换句话说,您的“txtDatum”只有一个UIInput 对象,它用于渲染所有迭代。

标签: java jakarta-ee jsf-2


【解决方案1】:

&lt;ui:repeat&gt; 不是视图构建时间标记,而是视图渲染时间标记。视图树中只有一个&lt;h:inputText&gt; 组件,由frmMY:myRepeat:txtDatum 标识。然而,它被渲染了多次,与&lt;ui:repeat&gt; 迭代的次数一样多。如果您使用的是&lt;c:forEach&gt;,这是一个视图构建时间标记,那么视图中确实存在多个&lt;h:inputText&gt; 组件,每个组件只呈现一次。

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

【讨论】:

  • 我试试 。我的输入有验证器。但我每个人只能验证一个输入。是否可以在我的 内验证多个字段?没有多个表单和大量提交按钮?我的网站顶部和底部只有两个提交按钮。
  • 做我需要的。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2012-05-22
  • 2011-10-14
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多