因为使用条纹多年来我们的团队编写了第一个JSF 2.0应用程序,我有一个使用F的最佳途径一些问题:AJAX标签和验证输入。
很多问题我见过的回答有多个输入的表单,然后将提交按钮),但我们想保持在变化即时更新各个输入字段和持久化到数据库(没有提交按钮。我们有这方面的工作细使用Prototype的Ajax.Request的条纹,但它是一个额外的步骤,我想尽可能避免。
从本质上讲,我们有一堆关于它的投入豆类直接的支持,例如页面:
<h:inputText id="name" value="#{personController.name}" >
<f:ajax listener="#{personController.ajax}" />
</h:inputText>
正如你可能知道,由听众被调用时,name的值已经改变了对bean。 这将是方便,但我与它的几个问题:
- 听者不明明知道该bean的值更改
- 已经更改了该值,我不能执行任何服务器端验证
- 我不知道名字的旧值是什么,即使我可以在上面进行某种验证,我不知道如何设置值回
现在它看起来像我们将不得不实行某种形式的JavaScript中间人采取什么性质改变和新的价值,发送到控制器,并对其执行验证,更新数据库,发回的东西来渲染,等但就像我说的,这就是我们使用条纹做的,我真的很喜欢用一些更原始。
我也看到,如果我们想要某种提交,我们可以使用类似的valueChangeListener属性页面上的按钮,但我也想避免大规模的提交。
我包括OpenFaces标签,因为我们已经在使用的数据表,所以如果有好的东西在那里,我们是开放给使用它。 但据我可以告诉他们○:AJAX标签,并不比JSF的歼更加强大:阿贾克斯。
谢谢!
你找错了方向,实现验证输入字段的具体功能要求。 您应该使用这种正常的JSF验证,而不是一些AJAX监听方法,在错误的时刻(在运行INVOKE_ACTION
相而不是PROCESS_VALIDATIONS
阶段),并在那里你不直接有一个手模型的价值。 Ajax的监听方法仅仅是用于执行基于当前模型值(S)的一些业务逻辑。
JSF有几个内置后面的验证required
属性和几个<f:validateXxx>
标记。 你甚至可以通过实现创建自定义的验证Validator
界面。
如检查requireness:
<h:inputText ... required="true">
<f:ajax />
</h:inputText>
或检查,如果它使用中的一个的模式相匹配的各种<f:validateXxx>
标签 :
<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期间提交当前输入场change
事件(或click
在复选框/单选按钮的情况下,事件)。 你不一定需要<f:ajax listener>
,以便通过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();
// ...
}
请注意,当验证已经在特定的组件,通过这样只会被调用。