在JSF 2.0中验证ajax更新的最佳方法?

自从使用Stripes多年以来,我们的团队正在编写其第一个JSF 2.0应用程序,并且我对使用f:ajax标记和验证输入的最佳方法有一些疑问.

我见过的许多问题都有一个带有多个输入的表单,然后是一个提交按钮),但我们希望保持个别输入字段在更改后立即更新并持久保存到数据库(没有提交按钮.我们有这个工作Stripes使用Prototype的Ajax.Request很好,但如果可能的话,这是我想避免的额外步骤.

基本上我们有一个页面,其上有一堆输入,直接由bean支持,例如:

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

您可能知道,在调用侦听器时,bean的值已经更改.这样很方便,但我遇到了一些问题:

>监听器显然不知道bean的哪个值发生了变化
>该值已经更改,我无法对其执行任何服务器端验证
>我不知道名字的旧值是什么,即使我可以对它进行某种验证,我也不知道该将值设置回什么

现在看起来我们必须实现某种javascript中间人来接受属性更改和新值,将其发送到Controller,并让它执行验证,更新数据库,发送回渲染的内容等但就像我说的那样,这就是我们以前用Stripes做的事情,我真的很喜欢使用原生的东西.

我确实看到如果我们想在页面上使用某种提交按钮,我们可以使用类似valuechangelistener属性的东西,但我也想避免大量提交.

我包含了OpenFaces标签,因为我们已经将它用于数据表,所以如果那里有一些不错的东西我们就可以使用它了.但据我所知,他们的o:ajax标签并不比JSF的f:ajax强大得多.

谢谢!

解决方法

您正在寻找错误的方向来实现验证输入字段的具体功能要求.你应该使用一个普通的JSF验证器,而不是一些在错误时刻运行的ajax监听器方法(INVOKE_ACTION阶段而不是PROCESS_VALIDATIONS阶段)以及你没有直接掌握模型值的地方. ajax侦听器方法仅用于基于当前模型值执行某些业务逻辑.

JSF在必需属性后面有几个内置验证器和几个< f:validateXxx>标签.您甚至可以通过实现Validator接口来创建自定义验证器.

例如.检查要求:

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

或者使用the various <f:validateXxx> tags之一检查它是否与模式匹配:

<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更改事件期间提交当前输入字段(或者在复选框/单选按钮的情况下单击事件).您不一定需要< f:ajax监听器>方法,以便通过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();
    // ...
}

请注意,只有在特定组件上通过验证时才会调用方法.

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...