web-dev-qa-db-fra.com

Comment faire des redirections d'URL dynamiques dans Struts 2?

J'essaie de faire rediriger mon application Struts2 vers une URL générée. Dans ce cas, je veux que l'URL utilise la date du jour ou une date à laquelle j'ai cherché dans une base de données. Donc /section/document devient /section/document/2008-10-06

Quelle est la meilleure façon de faire cela?

26
Sietse

Voici comment nous le faisons:

Dans Struts.xml, obtenez un résultat dynamique tel que:

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

Dans l'action:

private String url;

public String getUrl()
{
 return url;
}

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

Vous pouvez réellement utiliser cette même technologie pour définir des valeurs dynamiques pour toute variable de votre struts.xml à l'aide de OGNL. Nous avons créé toutes sortes de résultats dynamiques, notamment des liens RESTful. Truc cool.

61
Johnny Wey

On peut également utiliser annotations et le plug-in Convention pour éviter une configuration répétitive dans struts.xml:

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

$ {Url} signifie "utiliser la valeur de la méthode getUrl"

14
Ivan Morales

Si quelqu'un veut rediriger directement dans ActionClass:

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: Ajout d'un devis manquant.

3
hari

J'ai fini par sous-classer la variable ServletRedirectResult de Struts et redéfini sa méthode doExecute() pour qu'elle exécute ma logique avant d'appeler super.doExecute(). ça ressemble à ça:

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

Je ne suis pas sûr que ce soit la meilleure façon de le faire, mais cela fonctionne.

2
Sietse

Vous pouvez rediriger vers une autre action en utilisant une annotation - 

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

On peut rediriger directement à partir d'un intercepteur sans se soucier de l'action concernée.

Dans struts.xml

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

Dans l'intercepteur

@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