我正在学习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'”,如果在帐户中没有字段输入某些值。
有人能帮我理解这个流程吗?
答案 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...
}