2008-10-06 8 views

Antwort

58

Hier ist, wie wir es tun:

In struts.xml, haben ein dynamisches Ergebnis wie:

<result name="redirect" type="redirect">${url}</result> 

In der Aktion:

private String url; 

public String getUrl() 
{ 
return url; 
} 

public String execute() 
{ 
[other stuff to setup your date] 
url = "/section/document" + date; 
return "redirect"; 
} 

Sie können tatsächlich das gleiche verwenden Technologie, um dynamische Werte für jede Variable in Ihrer struts.xml mithilfe von OGNL festzulegen. Wir haben alle möglichen dynamischen Ergebnisse erstellt, einschließlich solcher wie RESTful-Links. Cooles Zeug.

+1

Vielen Dank, die gut funktioniert! Gibt es eine Möglichkeit, die Änderung an der XML vorzunehmen, damit sie nicht auf jede einzelne Aktion angewendet werden muss? Ich würde das am liebsten mögen, um auf alle meine Handlungen anwendbar zu sein. – Chris

+2

Sie könnten ein globales Ergebnis versuchen. Ich habe nicht mit dynamischen Variablen experimentiert, aber solange die Aktion das Ergebnis zurückgibt, sehe ich keinen Grund, warum es nicht funktionieren würde. –

+0

Globale Ergebnisse für diese Arbeit gut. –

2

Ich endete Streichen 'ServletRedirectResult Struts' und überschreiben es ist doExecute() Methode, um meine Logik vor dem Aufruf super.doExecute() zu tun. Es sieht so aus:

Ich bin mir nicht sicher, ob dies der beste Weg ist, es zu tun, aber es funktioniert.

14

Man kann auch annotations und das Übereinkommen Plug-in verwenden sich wiederholende Konfiguration in struts.xml zu vermeiden:

@Result(location="${url}", type="redirect") 

Die $ {url} bedeutet "den Wert der Methode getUrl verwenden"

+0

Danke! Genau das, was ich brauchte. – Nate

2

wenn jemand direkt in ActionClass umleiten will:

public class RedirecActionExample extends ActionSupport { 
HttpServletResponse response=(HttpServletResponse) ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE); 

    url="http://localhost:8080/SpRoom-1.0-SNAPSHOT/"+date; 
    response.sendRedirect(url); 
    return super.execute(); 
} 

Edit: ein fehlendes Zitat hinzugefügt.

+0

Was sind die Vor- oder Nachteile des Umadressierens innerhalb der Action-Klasse selbst, anstatt dafür struts.xml zu verwenden? Ich sehe schon einen Unterschied: durch die Verwendung von Streben.Xml, Redirect ist eigentlich zwei völlig separate Anfragen zurück an die Rückseite, während Ihre Lösung ist nur eine Anfrage? – user1884155

1

Sie können zu einer anderen Aktion umleiten Anmerkung mit -

@Result(
    name = "resultName", 
    type = "redirectAction", 
    params = { "actionName", "XYZAction" } 
) 
0

Eine Umleitung kann direkt von einem Interceptor ohne Rücksicht auf welche Aktion beteiligt ist.

In struts.xml

<global-results> 
     <result name="redir" type="redirect">${#request.redirUrl}</result> 
    </global-results> 

In Interceptor

@Override 
public String intercept(ActionInvocation ai) throws Exception 
{ 
    final ActionContext context = ai.getInvocationContext();   
    HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST); 
    request.setAttribute("redirUrl", "http://the.new.target.org"); 
    return "redir"; 
}