2008-10-06 3 views
26

J'essaie de rediriger mon application Struts2 vers une URL générée. Dans ce cas, je souhaite que l'URL utilise la date actuelle ou une date que j'ai recherchée dans une base de données. Donc, /section/document devient /section/document/2008-10-06Comment faire des redirections URL dynamiques dans Struts 2?

Quelle est la meilleure façon de faire cela?

Répondre

58

est ici comment nous le faisons:

En struts.xml, 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 ce même technologie pour définir des valeurs dynamiques pour n'importe quelle variable dans votre struts.xml en utilisant OGNL. Nous avons créé toutes sortes de résultats dynamiques, y compris des trucs comme des liens RESTful. Truc cool.

+1

Merci beaucoup, qui fonctionne bien! Y at-il un moyen de faire le changement au xml de sorte qu'il n'a pas besoin d'être appliqué à chaque action que j'ai? Idéalement, j'aimerais que cela s'applique à toutes mes actions. – Chris

+2

Vous pourriez essayer un résultat global. Je n'ai pas expérimenté avec ceci pour les variables dynamiques, mais, tant que l'action renvoie le résultat, je ne vois aucune raison que cela ne fonctionnerait pas. –

+0

Les résultats globaux pour ce travail bien. –

2

J'ai fini par sous-classer Struts 'ServletRedirectResult et en remplaçant sa méthode doExecute() pour faire ma logique avant d'appeler super.doExecute(). il ressemble à ceci:

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 sais pas si c'est la meilleure façon de le faire, mais cela fonctionne.

14

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

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

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

+0

Merci! Juste ce dont j'avais besoin. – Nate

2

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'une citation manquante.

+0

Quels sont les avantages ou les inconvénients de rediriger à l'intérieur de la classe d'action elle-même, plutôt que d'utiliser struts.xml pour cela? Je peux déjà voir une différence: en utilisant des entretoises.xml, rediriger est en fait deux requêtes complètement séparées dos à dos, alors que votre solution est seulement une requête? – user1884155

1

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

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

On peut rediriger directement à partir d'un intercepteur sans égard à laquelle l'action est impliqué.

Dans struts.xml

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

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"; 
} 
Questions connexes