¿Cómo hacer redirecciones dinámicas de URL en Struts 2?
Pregunta
Estoy intentando que mi aplicación Struts2 redirija a una URL generada. En este caso, quiero que la URL use la fecha actual o una fecha que busqué en una base de datos. Entonces / section / document
se convierte en /section/document/2008-10-06
¿Cuál es la mejor manera de hacer esto?
Solución
Así es como lo hacemos:
En Struts.xml, obtenga un resultado dinámico como:
<result name="redirect" type="redirect">${url}</result>
En la acción:
private String url;
public String getUrl()
{
return url;
}
public String execute()
{
[other stuff to setup your date]
url = "/section/document" + date;
return "redirect";
}
Puede usar esta misma tecnología para establecer valores dinámicos para cualquier variable en su struts.xml usando OGNL. Hemos creado todo tipo de resultados dinámicos, incluyendo cosas como enlaces RESTful. Cosas geniales.
Otros consejos
También se pueden usar las anotaciones
y el complemento Convención para evitar configuraciones repetitivas en struts.xml:
@Result(location="${url}", type="redirect")
El $ {url} significa " usar el valor del método getUrl "
Si alguien quiere redirigir directamente en 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();
}
Editar: se agregó una cita faltante.
Terminé haciendo una subclase de Struts ' ServletRedirectResult
y reemplazando su método doExecute ()
para hacer mi lógica antes de llamar a super.doExecute ()
. se parece a esto:
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);
}
}
No estoy seguro de si esta es la mejor manera de hacerlo, pero funciona.
Puede redirigir a otra acción mediante la anotación -
@Result(
name = "resultName",
type = "redirectAction",
params = { "actionName", "XYZAction" }
)
Uno puede redirigir directamente desde un interceptor sin importar qué acción esté involucrada.
En struts.xml
<global-results>
<result name="redir" type="redirect">${#request.redirUrl}</result>
</global-results>
En 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";
}