2014-09-30 56 views
5

我搜索了很多并没有找到解决方案。验证失败后,输入值不明确

我使用JSF 2.1和RichFaces的4.2.3,并希望验证用户

的登录数据,我有两个输入字段。 一个用户名和密码一个,都与@NotEmpty

login.xhtml

<html 
xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:rich="http://richfaces.org/rich" 
xmlns:a4j="http://richfaces.org/a4j" 
xmlns:mt="http://java.sun.com/jsf/composite/components"> 
<h:body> 
<ui:composition template="/protected/user/login-template.xhtml"> 
    <ui:define name="panel-navigation"> 
     <ui:include src="/protected/user/login-left-menu.xhtml" /> 
    </ui:define> 
    <ui:define name="contentbody"> 
     <h:form> 
      <div id="content"> 
       <div class="subcolumns"> 
        <div class="c65l"> 
         <div class="subcl"> 
          <p class="sum-error-message" /> 
          <fieldset> 
           <h3> 
            <h:outputText value="#{styleguideMessages.login}" /> 
           </h3> 
           <p> 
            <h:outputText value="#{messages.login_text}" /> 
           </p> 
           <div class="subcolumns"> 
            <mt:inputText 
             id="loginName" 
             value="#{authenticationPM.loginName}" 
             label="#{messages.general_label_loginname}" 
             required="true" /> 
            <div class="c33r validation"></div> 
           </div> 
           <div class="subcolumns"> 
            <mt:inputText 
             id="password" 
             value="#{authenticationPM.password}" 
             label="#{styleguideMessages.db_password}" 
             required="true" 
             secret="true" /> 
            <div class="c33r validation"></div> 
           </div> 
           <div class="subcolumns"> 
            <h:commandLink 
             id="loginButton" 
             action="#{authenticationPM.doLogin}" 
             value="#{styleguideMessages.login}" 
             title="#{styleguideMessages.login}" 
             styleClass="button last" /> 
           </div> 
          </fieldset> 
         </div> 
        </div> 
       </div> 
      </div> 
      <mt:commandButton 
       id="login" 
       action="#{authenticationPM.doLogin}" 
       value="hidden" 
       style="visibility:hidden" /> 
     </h:form> 
     <script 
      src="#{facesContext.externalContext.requestContextPath}/js/lib/loginEnter.js" 
      type="text/javascript" 
      charset="utf-8"></script> 
    </ui:define> 
</ui:composition> 

AuthentificationPM.java

import *; 

@Named 
@SessionScoped 
public class AuthenticationPM extends AbstractPM implements Serializable { 

/** 
* The user name from the login. 
*/ 
private String userName; 

/** 
* password. 
*/ 
private String password; 

/** 
* Returns the login name. 
* 
* @return String 
*/ 
@NotNull 
@Pattern(regexp = "^[^\"/\\[\\]:;|=,+?*<>]*$", message = "{user.loginname.pattern}") 
public String getLoginName() { 
    return userName; 
} 

/** 
* Returns the password. 
* 
* @return String 
*/ 
@NotNull 
public String getPassword() { 
    return password; 
} 

/** 
* Sets the login name. 
* 
* @param loginName 
*   - the login name of the user 
*/ 
public void setLoginName(String loginName) { 
    this.userName = loginName; 
} 

/** 
* Sets the password. 
* 
* @param password 
*   - the password of the user 
*/ 
public void setPassword(String password) { 
    this.password = password; 
} 

} 

如果其中的一个(说密码)是n没有填充,验证失败并显示一条消息(应该如此)。

现在我删除用户名并输入密码。 验证失败,因为用户名为空。 它会清除密码字段并显示用户名的消息。

现在错误发生:前输入的用户名重新出现! 如何防止此行为?

我知道后工艺验证,在更新模型值调用应用程序被跳过,呈现响应执行。 As described here.呈现响应获取存储在UI组件中的值(在应用请求),并使用它们重新渲染而不是删除无效值。我试过this solution以及this idea。两种方式都没有找到我的组件。

任何帮助或想法都非常赞赏。

问候, 凯文

+0

对我来说,这听起来像浏览器缓存页面 – 2014-09-30 17:22:22

+2

Valar Morghulis! 我已经像上面提到的[这里]禁用了缓存(http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development)。 我们的开发环境不允许浏览器缓存页面。 所以这不是原因。 无论如何,谢谢! – Wavemaster 2014-10-01 07:44:18

回答

3

如果你只是删除从inputfield的用户名,该值应提交为empty string,这将是用户名一个合法的更换,也符合定义的模式。

我只能假设,你已经在你的web.xml配置

<context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
</context-param> 

。因此,当您尝试提交空字段时,它会被解释为null,这与您的用户名属性上的@NotNull注释不匹配。因此,该值的设置将被取消,并且它将保持其以前的状态,因为它是SessionScoped - 这是已输入一次的用户名。

至少这是唯一的szenario当提交一个空字符串时,a(String-)值没有更新我可以想象。

将此值设置为true可以重现您描述的行为。


您可能会问,为什么这不适用于您在输入密码时删除它的文本框?由于您使用的是secret="true",即使backing bean属性为而非设置为空(删除密码后)并且仍包含错误密码,文本框将不会显示有关输入字符串的任何信息(即长度)。

但请注意,仅仅删除此属性可能会影响其他开发人员依靠的功能,以获取null而不是empty string。因此,您应该考虑删除@NotNull注释并手动检查null

+1

谢谢你的回答。它绝对推动我朝着正确的方向前进。看起来我必须维护'',但现在我知道_why_它的行为就像它一样。有没有办法在设置用户名值为''“'时维护bean验证?由于验证密码,它不会输入我的密码。 – Wavemaster 2014-11-06 10:47:01