1

我正在学习 JSF,在理解 JSF 验证方面需要一些帮助。我正在尝试借助“ http://courses.coreservlets.com/ ”在同一页面中进行手动、隐式和显式验证。我用下面的验证写了 2 个输入字段。

Customer Name: <h:inputText value="#{bean.customerName}" required="true" />         
       Account No: <h:inputText value ="#{bean.accountNo}" > 
        <f:validateLength minimum="10"></f:validateLength>
       </h:inputText>          
       <h:commandButton value="Submit" action="#{bean.actionValidate}"></h:commandButton>          
       <h:messages globalOnly="true"></h:messages>

public String actionValidate(){     
    FacesMessage fcMessage = new FacesMessage();
    if(getAccountNo().isEmpty() || getAccountNo() == null) {
        fcMessage.setSummary("account no empty");
        fcContext.addMessage(null, fcMessage);
    }       
    if (fcContext.getMessageList().size()>0)
        return null;
    else
        return "ManualValidationResult";
}

我的理解是字段 1 的 required 属性和 f:validateLength 验证将在 Process & Validation 阶段执行,如果验证失败,生命周期将进入 Render 响应阶段并首先显示错误消息。一旦通过,就应该执行 bean 验证 - 理想情况下,在我的示例中,bean 中的验证不会被执行。但是,我收到“客户名 - 验证错误:需要值”。如果两个字段都留空。

我填写了名称字段,现在我收到“帐户无空”消息,然后如果在帐户无字段中输入了某个值,则“验证错误:长度小于允许的最小值'5'”。

任何人都可以帮我理解流程吗?

4

2 回答 2

2

事实 1:在 INVOKE_APPLICATION 阶段调用操作方法。

事实 2:当标准验证在 PROCESS_VALIDATIONS 阶段失败时,随后的 UPDATE_MODEL_VALUES 和 INVOKE_APPLICATION 阶段将被跳过,JSF 将直接继续执行 RENDER_RESPONSE 阶段。

逻辑后果:当标准验证失败时,永远不会调用操作方法。这是一件好事。永远不应该使用无效输入来执行业务逻辑。

解决方案很简单:不要在操作方法中进行验证。我知道本教程是示例性的,但在现实世界中你应该避免这种情况。代替

<h:inputText value ="#{bean.accountNo}"> 

你应该使用

<h:inputText value ="#{bean.accountNo}" required="true" requiredMessage="account no empty">

并从操作方法中删除所有验证逻辑。事实上,你的整个动作方法是没有用的。您可以action="ManualValidationResult"在命令按钮中使用。当action验证失败时,无论如何都不会调用 ,因此当验证失败时也永远不会执行导航。

于 2013-11-07T17:18:13.923 回答
0

f:validatelength 仅在某个值与该字段相关联时才有效。如果输入字段为空,则 LengthValidator 不会进行任何验证。来自 LengthValidator 的一段代码...

// VALIDATE
 public void More ...validate(FacesContext facesContext,
                      UIComponent uiComponent,
                      Object value)
         throws ValidatorException
 {
     if (facesContext == null) throw new NullPointerException("facesContext");
     if (uiComponent == null) throw new NullPointerException("uiComponent");

     if (value == null)
     {
         return;
     }
// length validation code here...
}
于 2013-11-09T04:41:44.350 回答