Pergunta

Eu estou tentando ter meu aplicativo redirecionamento Struts2 a uma URL gerada. Neste caso, eu quero a URL para usar a data atual ou uma data Olhei para cima em um banco de dados. Então /section/document se torna /section/document/2008-10-06

Qual é a melhor maneira de fazer isso?

Foi útil?

Solução

Aqui está como fazemos isso:

Em struts.xml, ter um resultado dinâmico, como:

<result name="redirect" type="redirect">${url}</result>

Na ação:

private String url;

public String getUrl()
{
 return url;
}

public String execute()
{
 [other stuff to setup your date]
 url = "/section/document" + date;
 return "redirect";
}

Você pode realmente usar essa mesma tecnologia para valores dinâmicos definidos para qualquer variável no seu struts.xml usando OGNL. Criamos todos os tipos de resultados dinâmicos, incluindo coisas como ligações RESTful. Material legal.

Outras dicas

Pode-se também usar annotations ea Convenção plug-in para evitar a configuração repetitiva em struts.xml:

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

Os $ {url} significa "usar o valor do método getUrl"

Se alguém quiser redirecionar diretamente no 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(); 
}

Edit:. Adicionado uma citação faltando

acabei subclasse ServletRedirectResult Struts' e substituindo-lo do método doExecute() para fazer a minha lógica antes de chamar super.doExecute(). parece que isso:

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

Eu não tenho certeza se esta é a melhor maneira de fazê-lo, mas ele funciona.

Você pode redirecionar para outra ação usando anotação -

@Result(
    name = "resultName",
    type = "redirectAction",
    params = { "actionName", "XYZAction" }
)

Um pode redirecionar diretamente de um interceptor sem levar em conta que a ação está envolvido.

Em struts.xml

    <global-results>
        <result name="redir" type="redirect">${#request.redirUrl}</result>
    </global-results>

Em 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top