¿Cómo hacer redirecciones URL dinámicas en Struts 2?

Estoy intentando que mi aplicación Struts2 se 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 pasa a ser /section/document/2008-10-06

¿Cuál es la mejor manera de hacer esto?

Así es como lo hacemos:

En Struts.xml, tenga un resultado dynamic como:

 ${url} 

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

De hecho, puede usar esta misma tecnología para establecer valores dynamics para cualquier variable en su struts.xml usando OGNL. Creamos todo tipo de resultados dynamics, incluidos elementos como enlaces RESTful. Cosas interesantes.

También se pueden usar annotations y el complemento de la Convención para evitar la configuración repetitiva en struts.xml:

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

El $ {url} significa “usar el valor del método getUrl”

Si alguien quiere redireccionar 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 comilla faltante.

Terminé subclasificando ServletRedirectResult Struts y sobreescribiendo 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 usando 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

   ${#request.redirUrl}  

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