不同按钮的动态需要验证?

时间:2010-11-16 10:40:06

标签: java jsf jsf-2

我目前正在从核心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,我不需要关心密码字段是否填写,但密码字段会抛出错误说这是一个必填字段。

无论如何都要解决这类问题?我知道这可能是一个非常简单的应用程序,但在我的工作场所,我认为他们设计了很多像这样的屏幕,比如保存按钮以及带有不同必填字段的刷新按钮,但按钮位于同一页面。

谢谢!

1 个答案:

答案 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>