在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();
    // ...
}

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

相关文章

JS原生Ajax操作(XMLHttpRequest) GET请求 POST请求 兼容性问题 利用iframe模拟ajax 实现表单提交的返回...
AJAX 每日更新前端基础,如果觉得不错,点个star吧 &#128515; https://github.com/WindrunnerMax/E...
踩坑Axios提交form表单几种格式 前后端分离的开发前后端, 前端使用的vue,后端的安全模块使用的SpringSe...
很早就听闻ajax的名声,但是却一直不知道怎么用,今天自己捣鼓了一下,竟然会用了,哈哈哈哈。 为了防止...
需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: &quot;./server/slider.js...
Ajax函数封装ajax.js // Get / Post // 参数 get post // 是否异步 // 如何处理响应数据 // URL // var...