2016-03-30 11 views
2

aufgerufen wird Ich habe Probleme mit meinem Setup hat, hat die Anmeldungs ​​die Validierung vergangen, aber execute Funktion nichtStruts2/Spring - ausführen wird nicht einmal nach Validierung vorbei

LoginAction.java genannt werden:

@Override 
public String execute() throws Exception { 

    System.out.println("5"); 
    String username = blogUser.getUsername(); 
    String password = blogUser.getPassword(); 
    blogUser = blogUserService.getUserByLogin(username, password); 
    System.out.println("6"); 
    sessionMap.put(Constants.SESSION_USERNAME, blogUser.getUsername()); 
    System.out.println("7"); 
    sessionMap.put(Constants.SESSION_USERID, blogUser.getUserId()); 
    System.out.println("return:success"); 
    return SUCCESS; 
} 

@Override 
public void validate() { 
    System.out.println("1"); 
    String username = blogUser.getUsername(); 
    String password = blogUser.getPassword(); 
    System.out.println("username:"+username + ", password:"+password); 
    if (username == null & password == null) { 
     System.out.println("22"); 
     addFieldError("blogUser.username",""); 
    } else if (username == null || password == null) { 
     System.out.println("2"); 
     addFieldError("blogUser.username","Invalid Login"); 
    } else if (!blogUserService.checkLogin(username, password)) { 
     System.out.println("3"); 
     addFieldError("blogUser.username","Invalid Login"); 
    } 
    System.out.println("4"); 
} 

public String postLogin() throws Exception { 
    System.out.println("77"); 
    return LOGIN; 
} 

struts.xml:

<action name="login" class="loginActionBean" > 
     <result name="input" type="tiles">/login.tiles</result> 
     <result name="none" type="tiles">/login.tiles</result> 
     <result name="login" type="tiles">/login.tiles</result> 
     <result name="success" type="redirectAction">postPreviewAction</result> 
     <result name="error" type="tiles">/login.tiles</result> 
    </action> 

    <action name="doLogin" class="loginActionBean" method="postLogin"> 
     <result name="login" type="tiles">/login.tiles</result> 
     <result name="input" type="redirectAction">login</result> 
    </action> 

login.jsp:

<%@ page contentType="text/html; charset=UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags"%> 
<div> 
    <h2>Users Login</h2> 
    <s:form action="login" method="post"> 
     <s:textfield label="Username" name="blogUser.username" /> 
     <s:password label="Password" name="blogUser.password" /> 
     <s:submit value="Login" /> 
    </s:form> 
</div> 

ich nur sehen kann "4" wird gedruckt (dh es ist die Validierung bestanden), aber das ist es, es geht nicht auf "5"

EDIT: hinzugefügt tiles.xml snippet

<definition name="/login.tiles" extends="baseLayout"> 
    <put-attribute name="body" value="/login.jsp" /> 
</definition> 
+0

Welche Möglichkeiten Sie für Ihre Aktion Bohnen verwenden? Hat Ihre Kacheldefinition wirklich den Namen '/ login.tiles'? –

+0

Ich habe kein Scope Setup, meistens Standard. Ich werde es in meinem Schnipsel für die Tiles.xml bearbeiten –

+1

Und Standard ist 'Singleton', die für Aktion falsch ist, sollte' Prototyp' sein. –

Antwort

1

Vom Struts2 Spring Plugin documentation:

Normalerweise in struts.xml Sie die Klasse für jede Aktion angeben. Bei Verwendung der Standardvorgabe SpringObjectFactory fordert das Framework Spring zur Erstellung der Abhängigkeiten für Aktionen und Verbindungen auf, die durch das standardmäßige Verhalten für die automatische Verbindung festgelegt sind.

Das bedeutet, dass Sie keine Spring Beans aus Ihren Aktionen erstellen müssen.

Manchmal möchten Sie jedoch, dass die Bean vollständig von Spring verwaltet wird. Dies ist beispielsweise nützlich, wenn Sie komplexere AOP- oder Spring-fähige Technologien wie Acegi auf Ihre Beans anwenden möchten. Dazu müssen Sie lediglich die Bean in Ihrer Spring-Datei applicationContext.xml konfigurieren und dann das Klassenattribut von Ihrer Aktion in der Datei struts.xml ändern, um den in Spring definierten Bean-Namen anstelle des Klassennamens zu verwenden.

Struts2 selbst erstellt für jede Anforderung eine neue Instanz der Aktion, sodass Aktionen keine Singletons sind. Wenn Sie eine Spring-Bean aus der Aktion erstellen dann geben eine richtige scope (zB scope="prototype"), denn:

Standardmäßig wird eine Bohne ein singleton sein, es sei denn, die Bohne ein Elternteil Bohne Definition hat in diesem Fall Erbt den Bereich des übergeordneten Elements.

Die loginActionBean Beispiel Erklärung:

<bean id="loginActionBean" class="some.package.LoginActionBean" scope="prototype" /> 
1

die Aktion doLogin genannt (sollte den richtigen Namen wie showLogin haben) ist die Aktion, die die Login-Seite zeigt. Es sollte nicht validiert werden, da es immer fehlschlägt. Sie müssen diese von der Aktion Config sollte

<result name="input" type="redirectAction">login</result> 

und die Aktionsmethode entfernen Validierung ausgeschlossen werden. Sie können validation Interceptor zu exclude this method konfigurieren, aber eine andere Möglichkeit, es einfach @SkipValidation Annotation auf die Methode setzen.

@SkipValidation 
public String showLogin() throws Exception { 
    System.out.println("77"); 
    return LOGIN; 
} 

Die Aktion mit dem Namen login hat einige redundante Ergebnisse, die

<result name="none" type="tiles">/login.tiles</result> 
<result name="login" type="tiles">/login.tiles</result>   
<result name="error" type="tiles">/login.tiles</result> 

Hinweis entfernt werden könnte:, dass die Validierung von Standard auf jede Aktion Methode aus der Action-Klasse aufgerufen wird, es sei denn, es von der Validierung ausgeschlossen oder hat validation Interceptor nicht konfiguriert.

Die endgültige Konfiguration:

<action name="login" class="loginActionBean" > 
    <result name="input" type="tiles">/login.tiles</result> 
    <result type="redirectAction">postPreviewAction</result> 
</action> 

<action name="showLogin" class="loginActionBean" method="showLogin"> 
    <result name="login" type="tiles">/login.tiles</result> 
</action> 
+0

danke für die Notizen. Ich habe tatsächlich die Dinge getan, die du hier gepostet hast, bevor ich deine Antwort gesehen habe. Das Problem war, dass selbst wenn die doLogin-Methode verbessert werden musste, die Methode execute nicht aufgerufen wurde. Ich war bereits auf der Login-Seite, die die DoLogin-Methode zur Verfügung gestellt, die die Aktion für die Ausführung ruft –

+0

@JiroManio Hat nicht tatsächlich, was Sie sagen. Die execute-Methode wird durch den Aktionsaufruf und * not * auf die andere Weise aufgerufen. –

+0

Ja Aktion Aufruf ruft es auf. aber das ist nach der Validierungsfunktion. Wenn eine addFieldError-Funktion aufgerufen wird, wird sie nicht ausgeführt. Das Problem war, dass, wenn die Aktion die validate-Funktion übergeben hat, was bedeutet, dass kein addFieldError aufgerufen wurde, sie nicht mit der execute-Funktion fortgesetzt wurde, die automatisch sein soll. Es stoppt nur am Ende der Validierungsfunktion. TLDR: Die Aktion ruft STOPS bei der Validierungsfunktion auf und fährt nicht mit der Ausführungsfunktion fort. –