2009-07-01 2 views
10

Wenn ich eine Aktion habe, bei der das Ergebnis eine RedirectAction zu einer anderen Aktion in einer anderen Klasse ist, ist es möglich, Validierungsfehler in der resultierenden Aktion anzuzeigen? Z.B. Wenn im folgenden Beispiel ein Benutzer actionA ausführt (dem keine Sichten zugeordnet sind) und es Fehler gibt, gibt es eine Möglichkeit, diese Fehler im actionB-Ergebnis (foo.jsp) anzuzeigen? Oder mache ich das völlig falsch?Kann ich struts2 ActionErrors zwischen verschiedenen Aktionsklassen propagieren?

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <result name="input" type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 
     <result>/foo.jsp</result> 
    </action> 
</package> 
+0

Versuchen Messages Interceptor mit - http://struts.apache.org/release/2.3.x/docs/message-store-interceptor.html –

Antwort

4

Es mag einen Weg geben, dies zu tun, aber ich denke nicht, dass es eine sehr gute Möglichkeit ist, Struts zu verwenden. Wenn actionA die Validierung nicht besteht, möchten Sie höchstwahrscheinlich entweder ein nicht umgeleitetes Eingabeergebnis, das die Fehler anzeigt, oder vielleicht eine globale Fehlerseite, die es anzeigen kann.

Ich nehme an, Sie könnten die Aktion Fehler irgendwo wie die Sitzung zwischen der Umleitung speichern, aber Sie würden nicht wirklich das Framework verwenden, wie es entworfen wurde.

0

Diese Funktionalität wird von Struts2 nicht standardmäßig unterstützt. Die Lösung existiert jedoch (es wird von einem einfachen Struts-Interceptor ausgeführt, der Nachrichten in der Sitzung speichert).

solution with source code

7

Grundsätzlich müssen Sie Laden namens vordefinierte Abfangjäger verwenden, die operation nimmt: zu speichern und abzurufen:

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <!-- Here you are storing the Error messages --> 
     <interceptor-ref name="store"> 
      <param name="operationMode">STORE</param> 
     </interceptor-ref> 

     <!-- include your default stack in case you need to load other interceptors --> 
     <interceptor-ref name="defaultStack" /> 

     <result name="input" type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 

     <interceptor-ref name="store"> 
      <param name="operationMode">RETRIEVE</param> 
     </interceptor-ref> 

     <!-- include your default stack in case you need to load other interceptors --> 
     <interceptor-ref name="defaultStack" /> 

     <result>/foo.jsp</result> 
    </action> 
</package> 
10

Struts2 standardmäßig hat einen Speicher Abfangjäger. Er speichert die actionMessages, actionErrors und fieldErrors in der Sitzung im STORE-Modus und Sie können dieselben in der nächsten Weiterleitung abrufen, indem Sie den gleichen Interceptor verwenden, indem Sie ihn im RETRIEVE-Modus verwenden. Weitere Details finden Sie here

2

Verwenden ActionContext.getContext().getSession().put(key, value) in der ersten Aktion gefunden werden und es ActionContext.getContext().getSession().get(key) im redirectedAction und addActionErrors auf die Hauptaktion mit abrufen

+0

Ich denke, MessageStoreInterceptor ein viel besserer Weg wäre. –

+0

MessageStoreInterceptor - http://struts.apache.org/release/2.3.x/docs/message-store-interceptor.html –

0

Sie Ergebnistyp verwenden können „Kette“.

<action name="delete" class="com.example.Delete"> 
    <result name="error" type="chain"> 
     <param name="actionName">show</param> 
    </result>   
</action> 
<action name="show" class="com.example.Show"> 
    <result name="success" type="dispatcher">/jsp/show.jsp</result>      
</action> 

in show.jsp können Sie Aktion Fehler oder Aktionsmeldungen angezeigt werden, die Sie in Löschaktion gesetzt

+0

Die Verwendung von "Kette" wird abgeraten. –

6

finde ich eine bessere Lösung Aktion Fehler und Meldungen vom Typ actionRedirect Ergebnis zu übergeben. Es funktioniert für mich.

<action name="action1" class="action.Action1" > 
    <result>/abc.jsp</result> 
    <result name="input" type="redirectAction"> 
    <param name="actionName">action2</param> 
    <param name="param1">${param1}</param> 
    <param name="param2">${param2}</param> 
    <param name="actionErrors">${actionErrors}</param> 
    </result> 
    </action> 
    <action name="action2" class="action.Action2" > 
    <result>/def.jsp</result> 
    <result name="input">/def.jsp</result> 
    </action/> 

Das ist es ..... Glücklich Codierung

+0

' $ {actionErrors}' das macht all die Magie. – Jibran

+0

Erreicht dies sowohl die Aktion Fehler und Nachrichten oder benötigen Sie ' $ {actionMessages}', um eine Nachricht zu übergeben? – ponder275

+1

' $ {actionMessages}' gibt die Nachrichten weiter. Vielen Dank! – ponder275

3

Ergebnistyp Kette kopiert Nachrichten/Fehler resultierende Aktion, wenn Sie in struts.xml oder struts.properties Datei gehen Sie wie folgt -

struts.xwork.chaining.copyErrors - set to true to copy Action Errors 
struts.xwork.chaining.copyFieldErrors - set to true to copy Field Errors 
struts.xwork.chaining.copyMessages - set to true to copy Action Messages 

Beispiel (struts.xml) -

<constant name="struts.xwork.chaining.copyErrors" value="true"/> 
0

Diese Arbeit in mir

fügen Sie diese Zeile in Struts hinzu.xml:

<constant name="struts.xwork.chaining.copyErrors" value="true"/> 
<constant name="struts.xwork.chaining.copyMessages" value="true"/> 

Verwendung Ergebnistyp "Kette" und fügen Ergebnis mit dem Namen "Input":

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <result name="input" type="chain"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="chain"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 
     <result>/foo.jsp</result> 
     <result name="input">/foo.jsp</result> 
    </action> 
</package> 
1

Der Laden Interceptor (MessageStoreInterceptor) verwendet werden können actionErrors, actionMessages und fieldErrors zu speichern und abzurufen.

Sie können, indem man die operationMode Parameter Aktion

http://localhost/sample.action?operationMode=STORE

Sie den Betrieb der Speicher-Interceptor on the fly ändern können Shop-Abfangjäger in STORE Modus in Ihrem Standard-Stack, der alle Meldungsaktion ermöglicht, in der Sitzung gespeichert werden.

<interceptor-ref name="store"> 
      <param name="operationMode">STORE</param> 
    </interceptor-ref> 

Um die Nachrichten erhalten Sie store Abfangjäger in RETRIEVE Modus auf die spezifische Aktion, die diese Nachrichten muss hinzufügen müssen.

Dies ist ein Beispiel globale Fehlerseite, die umgeleitet wird, kann diese Aktion actionErrors, fieldErrors und actionMessages lesen, wenn wir die store Interceptor, um es hinzuzufügen und stellen Sie die operationMode-RETRIEVE:

@Action(value = "error-page" , 
       interceptorRefs = 
        {@InterceptorRef(value = "store", params = {"operationMode", "RETRIEVE"})} 
      ) 
public String execute() throws Exception {  
    LOG.error("An error accrued during action ActionErrors '{}' , FieldErrors '{}' " , getActionErrors() , getFieldErrors()); 
    //Rest of the code 
} 

Die MessageStoreInterceptor entfernen vorherige Fehler vor dem Hinzufügen neuer.

Sie können den Speicher in AUTOMATIC in Ihrem Standardstapel festlegen. Auf diese Weise werden alle Nachrichten immer gespeichert und automatisch erneut versucht, wenn das Aktionsergebnis vom Typ ServletRedirectResult ist (z. B. wenn die Aktion 'redirectAction', 'redirect'). Daher müssen Sie keinen expliziten store Interceptor im RETRIEVE Modus definieren.

Es ist zwar kein guter Ansatz, aber Sie können mit diesen Schlüsseln auf die Geschäftsnachrichten in der Sitzung zugreifen.

session.get(MessageStoreInterceptor.fieldErrorsSessionKey) 
session.get(MessageStoreInterceptor.actionErrorsSessionKey) 
session.get(MessageStoreInterceptor.actionMessagesSessionKey) 
Verwandte Themen