Come eseguire i reindirizzamenti URL dinamici in Struts 2?
Domanda
Sto cercando di reindirizzare la mia app Struts2 a un URL generato. In questo caso, voglio che l'URL utilizzi la data corrente o una data che ho cercato in un database. Quindi / section / document
diventa /section/document/2008-10-06-06//code>
Qual è il modo migliore per farlo?
Soluzione
Ecco come lo facciamo:
In Struts.xml, ottieni un risultato dinamico come:
<result name="redirect" type="redirect">${url}</result>
Nell'azione:
private String url;
public String getUrl()
{
return url;
}
public String execute()
{
[other stuff to setup your date]
url = "/section/document" + date;
return "redirect";
}
Puoi effettivamente utilizzare questa stessa tecnologia per impostare valori dinamici per qualsiasi variabile nel tuo struts.xml usando OGNL. Abbiamo creato tutti i tipi di risultati dinamici, inclusi elementi come i collegamenti RESTful. Roba interessante.
Altri suggerimenti
Uno può anche usare annotazioni
e il plug-in Convention per evitare configurazioni ripetitive in struts.xml:
@Result(location="${url}", type="redirect")
$ {url} significa " usa il valore del metodo getUrl "
Se qualcuno vuole reindirizzare direttamente in 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();
}
Modifica: aggiunta una citazione mancante.
Ho finito la sottoclasse del ServletRedirectResult
di Struts e ho ignorato il suo metodo doExecute ()
per eseguire la mia logica prima di chiamare super.doExecute ()
. sembra così:
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);
}
}
Non sono sicuro che questo sia il modo migliore per farlo, ma funziona.
Puoi reindirizzare a un'altra azione usando l'annotazione -
@Result(
name = "resultName",
type = "redirectAction",
params = { "actionName", "XYZAction" }
)
Si può reindirizzare direttamente da un intercettore senza riguardo a quale azione è coinvolta.
In struts.xml
<global-results>
<result name="redir" type="redirect">${#request.redirUrl}</result>
</global-results>
In 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";
}