Como fazer redirecionamentos de URL dinâmicos no Struts 2?
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?
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";
}