我目前正在从核心jsf 2.0 book + glassfish + cdi学习jsf 2.0。
我对JSF的验证功能有疑问。
假设我有一个非常简单的登录应用程序,它有一个非常简单的布局,如:
userid :(用户ID的输入字段 - 使用required =“true”)
密码:(密码输入密码 - 使用required =“true”)
loginButton + registerButton(使用immediate =“true”)+ checkUserIdAvailabilityButton
现在,假设按下了loginButton,并且用户ID和密码都是空的,两个字段都会出现验证错误,这就像我想要的那样。
当按下registerButton时,它不关心用户是否填写用户ID或密码,因为它使用immediate =“true”,因此绕过验证并且命令在应用请求值阶段执行,那是仍然按照我的意图工作。
这就是我的问题..当按下checkUserIdAvailabilityButton时,我只希望填充用户ID,我不需要关心密码字段是否填写,但密码字段会抛出错误说这是一个必填字段。
无论如何都要解决这类问题?我知道这可能是一个非常简单的应用程序,但在我的工作场所,我认为他们设计了很多像这样的屏幕,比如保存按钮以及带有不同必填字段的刷新按钮,但按钮位于同一页面。
谢谢!
答案 0 :(得分:4)
使用immediate="true"
和设置可用性按钮和用户名字段,将注册按钮放在单独的 <h:form>
中。
E.g。
<h:form>
<h:inputText value="#{bean.username}" required="true" immediate="true" />
<h:inputSecret value="#{bean.password}" required="true" />
<h:commandButton value="Login" action="#{bean.login}" />
<h:commandButton value="Check name availability" action="#{bean.checkNameAvailability}" immediate="true" />
</h:form>
<h:form>
<h:commandButton value="Register" action="#{bean.register}" />
</h:form>
另一种方法是在所需属性中确定按下了哪个按钮(然后它作为请求参数出现)。
<h:form id="form">
<h:inputText value="#{bean.username}" required="#{not empty param['form:login'] or not empty param['form:check']}" />
<h:inputSecret value="#{bean.password}" required="#{not empty param['form:login']}" />
<h:commandButton id="login" value="Login" action="#{bean.login}" />
<h:commandButton id="check" value="Check name availability" action="#{bean.checkNameAvailability}" />
<h:commandButton value="Register" action="#{bean.register}" />
</h:form>