验证在JSF 2.0 AJAX更新的最佳方式?(Best way to validate ajax

2019-08-01 03:16发布

因为使用条纹多年来我们的团队编写了第一个JSF 2.0应用程序,我有一个使用F的最佳途径一些问题:AJAX标签和验证输入。

很多问题我见过的回答有多个输入的表单,然后将提交按钮),但我们想保持在变化即时更新各个输入字段和持久化到数据库(没有提交按钮。我们有这方面的工作细使用Prototype的Ajax.Request的条纹,但它是一个额外的步骤,我想尽可能避免。

从本质上讲,我们有一堆关于它的投入豆类直接的支持,例如页面:

<h:inputText id="name" value="#{personController.name}" >
    <f:ajax listener="#{personController.ajax}" />
</h:inputText>

正如你可能知道,由听众被调用时,name的值已经改变了对bean。 这将是方便,但我与它的几个问题:

  • 听者不明明知道该bean的值更改
  • 已经更改了该值,我不能执行任何服务器端验证
  • 我不知道名字的旧值是什么,即使我可以在上面进行某种验证,我不知道如何设置值回

现在它看起来像我们将不得不实行某种形式的JavaScript中间人采取什么性质改变和新的价值,发送到控制器,并对其执行验证,更新数据库,发回的东西来渲染,等但就像我说的,这就是我们使用条纹做的,我真的很喜欢用一些更原始。

我也看到,如果我们想要某种提交,我们可以使用类似的valueChangeListener属性页面上的按钮,但我也想避免大规模的提交。

我包括OpenFaces标签,因为我们已经在使用的数据表,所以如果有好的东西在那里,我们是开放给使用它。 但据我可以告诉他们○:AJAX标签,并不比JSF的歼更加强大:阿贾克斯。

谢谢!

Answer 1:

你找错了方向,实现验证输入字段的具体功能要求。 您应该使用这种正常的JSF验证,而不是一些AJAX监听方法,在错误的时刻(在运行INVOKE_ACTION相而不是PROCESS_VALIDATIONS阶段),并在那里你不直接有一个手模型的价值。 Ajax的监听方法仅仅是用于执行基于当前模型值(S)的一些业务逻辑。

JSF有几个内置后面的验证required属性和几个<f:validateXxx>标记。 你甚至可以通过实现创建自定义的验证Validator界面。

如检查requireness:

<h:inputText ... required="true">
    <f:ajax />
</h:inputText>

或检查,如果它使用中的一个的模式相匹配的各种<f:validateXxx>标签 :

<h:inputText ...>
    <f:validateRegex pattern="[a-z]+" />
    <f:ajax />
</h:inputText>

或使用自定义的验证:

<h:inputText ...>
    <f:validator validatorId="myValidator" />
    <f:ajax />
</h:inputText>

@FacesValidator("myValidator")
public class MyValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) {
        if (value is not valid) {
            throw new ValidatorException(new FacesMessage(...));
        }
    }

}

所述<f:ajax>仅仅是在那里的HTML DOM期间提交当前输入场change事件(或click在复选框/单选按钮的情况下,事件)。 你不一定需要<f:ajax listener> ,以便通过AJAX提交当前输入字段方法。 如果要勾上一个值变化时,只需使用valueChangeListener

<h:inputText ... valueChangeListener="#{bean.valueChanged}">
    <f:ajax />
</h:inputText>

public void valueChanged(ValueChangeEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getValue();
    UIComponent component = event.getComponent();
    // ...
}

请注意,当验证已经在特定的组件,通过这样只会被调用。



文章来源: Best way to validate ajax updates in JSF 2.0?