Gre*_*Noe 6 validation ajax jsf jsf-2 openfaces
自从使用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>
Run Code Online (Sandbox Code Playgroud)
您可能知道,在调用侦听器时,bean的值已经更改.这样很方便,但我遇到了一些问题:
现在看起来我们必须实现某种javascript中间人来接受属性更改和新值,将其发送到Controller,并让它执行验证,更新数据库,发送回渲染的内容等但就像我说的那样,这就是我们以前用Stripes做的事情,我真的很喜欢使用原生的东西.
我确实看到如果我们想在页面上使用某种提交按钮,我们可以使用类似valueChangeListener属性的东西,但我也想避免大量提交.
我包含了OpenFaces标签,因为我们已经将它用于数据表,所以如果那里有一些不错的东西我们就可以使用它了.但据我所知,他们的o:ajax标签并不比JSF的f:ajax强大得多.
谢谢!
Bal*_*usC 11
您正在寻找错误的方向来实现验证输入字段的具体功能要求.你应该使用一个普通的JSF验证器,而不是一些在错误的时刻运行的ajax监听器方法(INVOKE_ACTION
阶段而不是PROCESS_VALIDATIONS
阶段)以及你没有直接掌握模型值的地方.ajax侦听器方法仅用于基于当前模型值执行某些业务逻辑.
JSF在required
属性和几个<f:validateXxx>
标签后面有几个内置验证器.您甚至可以通过实现Validator
界面来创建自定义验证器.
例如检查要求:
<h:inputText ... required="true">
<f:ajax />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
或者使用以下各种<f:validateXxx>
标签之一检查它是否与模式匹配:
<h:inputText ...>
<f:validateRegex pattern="[a-z]+" />
<f:ajax />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
或者使用自定义验证器:
<h:inputText ...>
<f:validator validatorId="myValidator" />
<f:ajax />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
同
@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(...));
}
}
}
Run Code Online (Sandbox Code Playgroud)
的<f:ajax>
仅仅是在那里的HTML DOM期间提交当前输入场change
事件(或click
事件在复选框/单选按钮的情况下).您不一定需要一种<f:ajax listener>
方法来通过ajax提交当前输入字段.如果要挂钩值更改事件,只需使用valueChangeListener
.
<h:inputText ... valueChangeListener="#{bean.valueChanged}">
<f:ajax />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
同
public void valueChanged(ValueChangeEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getValue();
UIComponent component = event.getComponent();
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,只有在特定组件上通过验证时才会调用此方法.
归档时间: |
|
查看次数: |
9115 次 |
最近记录: |