在bean中手动验证后显示JSF验证错误消息

时间:2013-11-07 17:02:09

标签: validation jsf

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

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和f的必需属性:validateLength验证将在Process&amp; amp;验证阶段,如果验证失败,生命周期将进入渲染响应阶段并首先显示错误消息。一旦传递了这个,就应该执行bean验证 - 理想情况下,在我的例子中,bean中的验证不会被任何机会执行。但是,我得到了 “客户名称 - 验证错误:值是必需的。”如果两个字段都留空了。

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

有人能帮我理解这个流程吗?

2 个答案:

答案 0 :(得分: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方法中删除所有验证逻辑。事实上,你的整个行动方法毫无用处。您只需在命令按钮中使用action="ManualValidationResult"即可。验证失败时,永远不会调用action,因此在验证失败时也不会执行导航。

答案 1 :(得分:0)

f:只有在某些值与字段相关联时,validatelength才有效。如果输入字段为null,则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...
}