当前位置: 首页 > 知识库问答 >
问题:

带有验证的InputText在ui内无法正常工作:重复JSF 2.2.6

乌鸿宝
2023-03-14

我有以下xhtml、验证器和managedBean:

<h:form id="form">
<ui:repeat var="item" value="#{myBean.usersEmail}" varStatus="status">
    <p:inputText id="userEmail" value="#{item.email}">
        <f:validator validatorId="MyValidator"/>
    </p:inputText>

    <p:commandButton value="++++" update=":form" action="#{myBean.addEmail()}"  />

</ui:repeat>

</h:form>

@FacesValidator("MyValidator")
public class ValidationClass extends Validator {

    @Override
    public void validate(FacesContext ctx, UIComponent component, Object value) throws ValidatorException {
    String email = value.toString();
    EmailValidator validator = EmailValidator.getInstance();



    if(StringUtils.isNotBlank(email) && !validator.isValid(email)) {


        FacesMessage message = new FacesMessage();
        message.setSeverity(FacesMessage.SEVERITY_ERROR);
        message.setSummary("Email is not valid.");
        message.setDetail("Email is not valid.");
        ctx.addMessage("userEmail", message);

        throw new ValidatorException(message);
    }
}
}

@ManagedBean
public class MyBean{

    @Getter
    @Setter
    List<UserEmail> usersEmail = new ArrayList<UserEmail>();

    public void addEmail(){
        usersEmail.add(new UserEmail());
    }
}

public class UserEmail{

    @Getter
    @Setter
    String email = "";

}

电子邮件添加工作罚款,直到第一次验证失败。当发生这种情况时,所有inputText组件显示相同的值。例如,首先我添加“user1@gmail.com”,这可以。然后我加上“user2@gmail.com”,这个也行。然后我把“user1@gmail.com”改成“”,这会抛出一个验证异常,它会显示在屏幕上,一切仍然可以。但是后来我用“user3@gmail.com”纠正“”并提交,这一次所有的输入文本开始显示“user2@gmail.com”,即使我添加了一个新的输入文本,它也显示“user2@gmail.com”。

当验证失败时,ui:重复中的所有组件似乎都被绑定到最后一项的值。有什么想法吗?

共有1个答案

苏建安
2023-03-14

我改变了我的实现,使用了来自JSTL的c: foreach标记,现在它工作得很好,甚至在Mojarra 2.2.6上也是如此,这就是我所做的:

 <c:forEach var="item" items="#{myBean.usersEmail}" varStatus="status">


 <p:inputText id="id${status.index}"   value="${item.email}" validator="MyValidator" />

 <p:message for="id${status.index}" />

 <p:commandButton value="+" update=":form" action="#{myBean.addEmail()}"  />

 </c:forEach>
 类似资料:
  • 我正在制作一个键盘映射器(它基本上允许我们检查同时按下的多个键),但我遇到了一个问题。 例如:,例如,是的,这是非常随机的…… 那么解决办法是什么呢? 注意: < li >我已经尝试了< code>addEventListener和其他方法 < li >我已经尝试过其他人制作的键盘映射器,但是他们都有相同的问题(至少我遇到过的问题) < li >我愿意接受其他方法(除此之外) < li >我是新手

  • 问题内容: 我正在尝试使用node-imagemagick库调整图像的大小,但无法正常工作。 我用来调整大小的代码是 引发错误 问题答案: 在Windows上,您还需要安装imagemagick exe。nodejs imagemagick库只是imagemagick exe的包装器。因此,只有安装了imagemagick exe并转换并标识可执行文件在路径中后,它才能起作用。

  • Mojarra 2.1.6/玻璃鱼3.1.2 我有类似的东西 其中,项目是具有Long属性的对象 只要我将LongProperty设置为非空/非空,它就可以正常工作。 当我这样做时,空输入被忽略,旧值被恢复。 日期的结果类似。 如果我从ui:repeat中删除对var/status的引用,这没有什么区别。即使显式引用#{bean.items[0].longProperty}也会以同样的方式失败。

  • 指的是邮报的标题。,我正在尝试从内部更新ArrayList的值,但这不起作用 请参阅以下模型以进一步了解: 我有一个POJO类如下: 在我的管理器中,我创建了用户POJO列表: 现在在我的Facelet中,我使用将数据加载到中的to表中,以便用户可以编辑和更改值。Facelet代码: 当我编辑时,上述方法工作正常,但它不适用于。 我可以假设它适用于,因为有setter和getter方法。 那么我如

  • 问题内容: 我在linux ubuntu 17.10上运行代码 此代码返回“无限” 但是每当我从终端运行命令时,我都会得到1024。 为什么这些数字不同? 问题答案: 如果从命令行运行相同的命令,则会得到相同的结果: 这是因为仅查看紧随其后的参数。的不是此参数的一部分,并且被代替而不是分配作为位置参数()。 要运行,需要成为该参数的一部分: 换句话说,您应该使用:

  • 问题内容: 我正在使用Angular进行表单验证。 这是我用的-plunker- edit 我从Angularjs文档中获取了此代码- 绑定到窗体和控件状态使用了type,但是当我运行它并输入它时说它是有效的。我该如何解决 ? PS:我是AngularJs的初学者 编辑: 同样以下输入也显示有效 aaa @ aaa aaa---aaa@gmail.com aaa`aaa @ aaa 预期的有效电子