it-swarm.com.de

Wie führt man dynamische URL-Weiterleitungen in Struts 2 durch?

Ich versuche, meine Struts2-App an eine generierte URL weiterzuleiten. In diesem Fall möchte ich, dass die URL das aktuelle Datum oder ein Datum verwendet, an dem ich in einer Datenbank nachgeschlagen habe. Aus /section/document wird /section/document/2008-10-06

Was ist der beste Weg dies zu tun?

26
Sietse

So machen wir es:

In Struts.xml haben Sie 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";
}

Mit dieser Technologie können Sie tatsächlich dynamische Werte für jede Variable in Ihrer struts.xml mithilfe von OGNL festlegen. Wir haben alle möglichen dynamischen Ergebnisse erstellt, darunter auch RESTful-Links. Cooles Zeug.

61
Johnny Wey

Sie können auch annotations und das Convention-Plug-In verwenden, um eine wiederholte Konfiguration in struts.xml zu vermeiden:

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

$ {Url} bedeutet "Wert der Methode getUrl verwenden"

14
Ivan Morales

Wenn jemand direkt in ActionClass umleiten möchte:

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(); 
}

Bearbeiten: Ein fehlendes Angebot wurde hinzugefügt.

3
hari

Ich endete damit, Struts 'ServletRedirectResult zu subklassifizieren und überschrieb seine doExecute()-Methode, um meine Logik auszuführen, bevor super.doExecute() aufgerufen wird. es sieht aus wie das:

public class AppendRedirectionResult extends ServletRedirectResult {
   private DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

  @Override
  protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception {
    String date = df.format(new Date());
    String loc = "/section/document/"+date;
    super.doExecute(loc, invocation);
  }
}

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

2
Sietse

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

@Result(
    name = "resultName",
    type = "redirectAction",
    params = { "actionName", "XYZAction" }
)
1
tiwari.vikash

Man kann direkt von einem Interceptor umleiten, ohne Rücksicht auf die Aktion zu nehmen.

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";
}
0
Aaron