Comment faire des redirections d'URL dynamiques dans Struts 2?
Question
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. Ainsi, / section / document
devient / section / document / 2008-10-06
Quelle est la meilleure façon de faire cela?
La solution
Voici comment nous procédons:
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. Des trucs sympas.
Autres conseils
On peut également utiliser annotations
et le plug-in Convention pour éviter la configuration répétitive dans struts.xml:
@Result(location="${url}", type="redirect")
Les $ {url} signifient "utiliser la valeur de la méthode getUrl"
. Si quelqu'un souhaite 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();
}
Modifier: ajout d'un devis manquant.
J'ai fini par sous-classer le ServletRedirectResult
de Struts et redéfini sa méthode doExecute ()
afin de faire ma logique avant d'appeler super.doExecute ()
. cela 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 suis pas sûr que ce soit la meilleure façon de le faire, mais cela fonctionne.
Vous pouvez rediriger vers une autre action à l'aide d'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 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";
}