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?
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.
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"
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.
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.
Vous pouvez rediriger vers une autre action en utilisant une annotation -
@Result(
name = "resultName",
type = "redirectAction",
params = { "actionName", "XYZAction" }
)
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";
}