在JSF2.0中验证ajax更新的最佳方法?
我们的团队正在编写自使用Stripes多年以来的第一个JSF2.0应用程序,我对使用f:ajax标记和验证输入的最佳方法有一些疑问 我看到很多问题的答案都是一个包含多个输入的表单,然后是一个提交按钮),但我们希望在更改后立即更新单个输入字段,并将其保存到数据库中(没有提交按钮。我们使用Prototype的Ajax.Request在条带中很好地实现了这一点,但如果可能的话,这是我想避免的额外步骤 本质上,我们有一个页面,页面上有一组由bean直接支持的输入,例如:在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
<h:inputText id="name" value="#{personController.name}" >
<f:ajax listener="#{personController.ajax}" />
</h:inputText>
您可能知道,在调用侦听器时,bean上的name值已经更改。这会很方便,但我有一些问题:
- 侦听器显然不知道bean的哪个值被更改了
- 该值已更改,我无法对其执行任何服务器端验证
- 我不知道name的旧值是什么,即使我可以对它执行某种验证,我也不知道该将该值设置回什么
谢谢!要实现验证输入字段的具体功能要求,您的方向是错误的。为此,您应该使用普通的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();
// ...
}