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?

Était-ce utile?

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";
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top