在JSF2.0中验证ajax更新的最佳方法?

在JSF2.0中验证ajax更新的最佳方法?,ajax,validation,jsf,jsf-2,openfaces,Ajax,Validation,Jsf,Jsf 2,Openfaces,我们的团队正在编写自使用Stripes多年以来的第一个JSF2.0应用程序,我对使用f:ajax标记和验证输入的最佳方法有一些疑问 我看到很多问题的答案都是一个包含多个输入的表单,然后是一个提交按钮),但我们希望在更改后立即更新单个输入字段,并将其保存到数据库中(没有提交按钮。我们使用Prototype的Ajax.Request在条带中很好地实现了这一点,但如果可能的话,这是我想避免的额外步骤 本质上,我们有一个页面,页面上有一组由bean直接支持的输入,例如: <h:inputText

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

我看到很多问题的答案都是一个包含多个输入的表单,然后是一个提交按钮),但我们希望在更改后立即更新单个输入字段,并将其保存到数据库中(没有提交按钮。我们使用Prototype的Ajax.Request在条带中很好地实现了这一点,但如果可能的话,这是我想避免的额外步骤

本质上,我们有一个页面,页面上有一组由bean直接支持的输入,例如:

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

您可能知道,在调用侦听器时,bean上的name值已经更改。这会很方便,但我有一些问题:

  • 侦听器显然不知道bean的哪个值被更改了
  • 该值已更改,我无法对其执行任何服务器端验证
  • 我不知道name的旧值是什么,即使我可以对它执行某种验证,我也不知道该将该值设置回什么
现在看来,我们必须实现某种javascript中间人,以接收更改的属性和新值,将其发送给控制器,并让其执行验证、更新数据库、发送回要渲染的内容等。但正如我所说,这是我们使用条纹所做的,我真的希望使用一些更本土的东西

我确实看到,如果我们想在页面上使用某种提交按钮,我们可以使用valueChangeListener属性,但我也希望避免大量提交

我加入了OpenFaces标记,因为我们已经在数据表中使用了它,所以如果其中有什么好东西,我们愿意使用它。但就我所知,他们的o:ajax标记并没有JSF的f:ajax强大多少


谢谢!

要实现验证输入字段的具体功能要求,您的方向是错误的。为此,您应该使用普通的JSF验证器,而不是在错误的时刻运行的ajax侦听器方法(调用动作阶段,而不是过程验证阶段)ajax侦听器方法仅用于基于当前模型值执行一些业务逻辑

JSF在
required
属性和几个
标记后面有几个内置验证器。您甚至可以通过实现接口来创建自定义验证器

例如,检查需求:

<h:inputText ... required="true">
    <f:ajax />
</h:inputText>
仅用于在HTML DOM
更改
事件期间提交当前输入字段(或者在复选框/单选按钮的情况下,
单击
事件)。通过ajax提交当前输入字段不一定需要
方法。如果要挂接值更改事件,只需使用
valueChangeListener

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

请注意,只有在特定组件上通过验证时才会调用此函数。

因此,在这种情况下,如果字段未验证,ajax将不会启动?是否有一些模式可供通用ajaxUpdate侦听器方法知道bean上的哪个字段已被修改?也感谢您的回答,我在这里看到了您的脸en试图找到一个现有的答案,我希望你会回答!它会在更改时被激发。但是如果该字段未验证,则不会执行
更新\u模型\u值
调用\u操作
阶段。因此,所有操作(侦听器)不会被调用。至于侦听字段修改,只需使用
valueChangeListener
。请注意,验证失败时也不会调用此功能。
仅用于在值更改期间提交输入字段,您不必为此使用
,除非您希望预填充其他模型值(例如,后代下拉列表)。好的,谢谢!f:ajax和valueChangeListener的组合正是我所需要的!一旦我使用了valueChangeListener方法,我就可以轻松地抓取oldValue、newValue和getComponent().getId()来查看哪些字段发生了更改!真是棒极了!
<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(...));
        }
    }

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