Frage

Ich versuche, meine Struts2 App auf eine generierte URL umleiten zu haben. In diesem Fall mag ich die URL das aktuelle Datum verwenden, oder ein Datum sah ich in einer Datenbank. So /section/document wird /section/document/2008-10-06

Was ist der beste Weg, dies zu tun?

War es hilfreich?

Lösung

Hier ist, wie wir es tun:

In struts.xml, hat 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 diese gleiche Technologie verwenden, um dynamische Werte für jede Variable in Ihrem struts.xml mit OGNL eingestellt. Wir haben alle Arten von dynamischen Ergebnisse erstellt wie RESTful Links einschließlich Sachen. Cool stuff.

Andere Tipps

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 getUrl Methode"

Wenn jemand will direkt in ActionClass umleiten:

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:. Es wurde eine fehlende Zitat

Ich landete Subklassen Struts' ServletRedirectResult und zwingende es doExecute() Methode ist meine Logik zu tun, bevor super.doExecute() Aufruf. es sieht wie folgt aus:

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 mir nicht sicher, ob dies der beste Weg ist, es zu tun, aber es funktioniert.

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

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

Man kann umleiten 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";
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top