2014-09-30 13 views
5

Ich habe viel gesucht und keine Lösung gefunden.Eingabewert wird nach Validierungsfehler nicht gelöscht

Ich verwende JSF 2.1 und 4.2.3 und Richfaces will die Login-Daten des Benutzers

Ich habe zwei Eingabefelder validieren. Ein Benutzername und ein Passwort, die beide mit @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; 
} 

} 

Wenn einer von denen (die sagen Passwort) ist n ot gefüllt, schlägt die Validierung fehl und eine Nachricht wird angezeigt (wie es sollte).

Jetzt lösche ich den Benutzernamen und gebe ein Passwort ein. Die Validierung schlägt fehl, weil der Benutzername leer ist. Es bereinigt das Passwortfeld und zeigt eine Nachricht für den Benutzernamen an.

Und jetzt passiert der Fehler: der ehemalige Benutzername eingegeben wieder! Wie kann ich dieses Verhalten verhindern?

Ich weiß, dass nach Prozessvalidierung, die Update Modellwerte und invoke Anwendung übersprungenen sind und die macht Antwort ausgeführt wird. As described here. Die Render-Antwort nimmt die in der ui-Komponente gespeicherten Werte (um apply-Anforderungen) und verwendet sie, um den ungültigen Wert erneut zu rendern, anstatt zu löschen.

Ich habe versucht this solution sowie this idea. Beide Wege finden meine Komponente nicht.

Jede Hilfe oder Ideen werden sehr geschätzt.

Grüße, Kevin

+0

Für mich klingt es wie der Browser die Seite –

+2

Valar Morghulis zwischenspeichert! Ich habe den Cache wie erwähnt [hier] deaktiviert (http://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development). Unsere Entwicklungsumgebung lässt Browser die Seite trotzdem nicht zwischenspeichern. Das ist also nicht der Grund. Danke trotzdem! – Wavemaster

Antwort

3

Wenn Sie nur die Benutzername des Eingabefeld löschen, soll der Wert als empty string vorgelegt, die ein legitimer Ersatz für den Benutzername sein würden und paßt auch das Muster definiert.

kann ich nur annehmen, dass Sie

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

in Ihrem web.xml konfiguriert haben. Wenn Sie also versuchen, ein leeres Feld zu übergeben, wird es als null interpretiert, was nicht mit Ihrer @NotNull Annotation für das Attribut username übereinstimmt. Also wird die Einstellung des Wertes abgebrochen und es behält seinen vorherigen Zustand bei, weil es SessionScoped ist - das ist der Benutzername, der einmal eingegeben wurde.

Zumindest ist dies der einzige Szenario ein (String-) Wert wird nicht aktualisiert, wenn eine leere Zeichenfolge übergeben wird, kann ich mir vorstellen.

Wenn dieser Wert auf true gesetzt ist, können Sie das Verhalten reproduzieren, das Sie beschreiben.

Sie könnten fragen, warum dies nicht für Ihre Textbox gilt, wo Sie das Passwort eingeben, wenn Sie es löschen? Da Sie secret="true" verwenden, zeigt das Textfeld keine Informationen über die eingegebene Zeichenfolge (d. H. Die Länge) an, auch wenn das Backing-Bean-Attribut nicht auf Null gesetzt ist (nach dem Entfernen des Kennworts) und immer noch das falsche Kennwort enthält.

Beachten Sie jedoch, dass das Entfernen dieses Attributs möglicherweise die Funktionalität beeinträchtigt, auf die sich andere Entwickler verlassen, um null anstelle von empty string zu erhalten. Sie sollten also in Betracht ziehen, die @NotNull Annotation zu entfernen und manuell nach null zu suchen.

+1

Vielen Dank für Ihre Antwort. Es treibt mich definitiv in die richtige Richtung. Es scheint so, als müsste ich den beibehalten, aber jetzt weiß ich, warum er sich so verhält. Gibt es eine Möglichkeit, die Bean-Validierung beizubehalten, während der Benutzername-Wert auf "" "gesetzt wird? Weil es aufgrund der Validierung des Passwortes meinen Code nicht eingeben wird. – Wavemaster

Verwandte Themen