dog*_*ose 42 validation lifecycle jsf immediate-attribute
我有多种形式,我有必填字段和可选字段.
要提交这样的表单,我需要对要执行的required属性进行验证,这样可以正常工作.要取消这样的形式我使用属性immediate="true"上p:commandbutton,这使得在其作用发生应用请求值 -PHASE如下处理:点击一个特定的按钮时如何跳过验证?
但是,对于大型表单,我想为用户提供一个Save-Button,以便他可以稍后继续.
为了保存当前状态,我还想忽略required-attribute的验证.但是,使用immediate="true"不起作用,因为那时我的save方法简单保存,因为JSF生命周期永远不会命中"UpdateModelValues"-Phase.(根据http://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.html)
那么,如何绕过所需的检查但不跳过生命周期的一半?
dog*_*ose 66
每个Button在Param-List中创建一个条目,只要它是表单的成员.所以我简单地检查了该条目是否存在于"required"参数:
<h:form id="form" prependId="true">
...
<p:inputText id="someId"
required="#{param['form:save']==null}" ... />
...
<p:commandButton id="save" value="Save" />
<p:commandButton id="submit" value="Submit" />
<p:commandButton id="cancel" value="Cancel" immediate="true" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
当我点击"提交"的param['form:save']是NULL,然后转身对表达true这样的验证被执行.
当我单击"保存"时,param['form:save']is NOT NULL(但为空!),该结果解析为,false因此忽略验证.(或者让我们说JSF认为它不是必需的字段,因为表达式被评估为false)
这是一个很好的问题,也是一个非常有帮助的答案。这种方法可以省去很多麻烦immediate="true"。
我想添加此信息(但还不允许发表评论)。您的代码示例似乎需要JSF 2.0或更高版本(请纠正我)。如果您像我一样该死地使用 JSF 1.1/1.2,那么请考虑这些更改/添加:
<h:form id="form">
...
<p:inputText id="someId" required="#{!empty param['save']}" ... />
...
<p:commandButton id="save" value="Save" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
="{true and ...}"可能是错误的(否#)?!empty ...当我偶然发现它时我立即喜欢上它的原因。如果要在单击按钮时跳过验证,请轻松地将参数添加到要跳过的按钮.例:
<p:commandButton value="button1" action="#{bean.action()}" >
<f:param name="skipValidator" value="true"/>
</p:commandButton>
Run Code Online (Sandbox Code Playgroud)
然后在验证器中,您可以读取此参数,如果为true,则跳过它:
@FacesValidator("com.validators.MyValidator")
public class MyValidator implements Validator{
public void validate(FacesContext ct, UIComponent co, Object obj) throws ValidatorException {
if(!continueValidation()){
return;
}
// validation process
}
protected boolean continueValidation() {
String skipValidator= FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("skipValidator");
if (skipValidator != null && skipValidator.equalsIgnoreCase("true")) {
return false;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45755 次 |
| 最近记录: |