JSF跳过Required-Validation而不是immediate = true

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)

  • 旁注:这里显然不需要`true和`;) (2认同)

Seb*_*anH 5

这是一个很好的问题,也是一个非常有帮助的答案。这种方法可以省去很多麻烦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)
  • JSF 1.1 中没有属性 prependId
  • 因此在 param[...] 中你必须只指定按钮 id
  • 您使用的语法="{true and ...}"可能是错误的(否#)?
  • 正如您从自己的编辑历史中看到的,“空或非空”逻辑不是很直观:) 这就是为什么!empty ...当我偶然发现它时我立即喜欢上它的原因。


Jur*_*raj 5

如果要在单击按钮时跳过验证,请轻松地将参数添加到要跳过的按钮.例:

<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)