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?

¿Fue útil?

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";
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top