我目前正在从jsf 2.0核心书+ glassfish + cdi了解jsf 2.0。

我对JSF的验证功能有疑问。

假设我有一个非常简单的登录应用程序,它的布局非常简单,例如:

userid:(userid的输入字段-使用required =“ true”)
密码:(输入密码的密码-使用required =“ true”)
loginButton + registerButton(使用Instant =“ true”)+ checkUserIdAvailabilityButton

现在,假设按下了loginButton,并将用户ID和密码保留为空,这两个字段上都将发生验证错误,并且按我的预期工作。

并且当按下registerButton时,它不在乎用户是否填充了用户ID或密码,因为它使用的是Instant =“ true”,因此绕过了验证,并且命令在Apply Request Value阶段执行,并且仍然可以我打算

这就是我的问题..当按下checkUserIdAvailabilityButton时,我只希望用户名能够被填充,并且我不需要关心密码字段是否被填充,但是密码字段会抛出错误,指出这是必需的领域。

反正有解决这种问题的方法吗?我知道这可能是一个非常简单的应用程序,但是在我的工作环境中,我认为他们设计了许多这样的屏幕,例如“保存”按钮以及带有不同必填字段的“刷新”按钮,但是这些按钮在同一页面中。

谢谢 !

最佳答案

immediate="true"设置可用性按钮和用户名字段,然后将注册按钮放在单独的<h:form>中。

例如。

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

10-08 08:01
查看更多