



В итоге я создал подкласс ServletRedirectResult Struts и переопределил его метод doExecute() для выполнения моей логики перед вызовом super.doExecute(). это выглядит так:
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);
}
}
Я не уверен, что это лучший способ сделать это, но он работает.
Вот как мы это делаем:
В Struts.xml имейте динамический результат, например:
<result name = "redirect" type = "redirect">${url}</result>
В действии:
private String url;
public String getUrl()
{
return url;
}
public String execute()
{
[other stuff to setup your date]
url = "/section/document" + date;
return "redirect";
}
Фактически вы можете использовать ту же технологию для установки динамических значений для любой переменной в вашем struts.xml с помощью OGNL. Мы создали всевозможные динамические результаты, включая такие вещи, как ссылки RESTful. Классная вещь.
Вы можете попробовать глобальный результат. Я не экспериментировал с этим для динамических переменных, но, пока действие возвращает результат, я не вижу причин, по которым это не сработает.
Также можно использовать annotations и подключаемый модуль Convention, чтобы избежать повторяющейся конфигурации в struts.xml:
@Result(location = "${url}", type = "redirect")
$ {Url} означает "использовать значение метода getUrl".
Спасибо! Как раз то, что мне было нужно.
Если кто-то хочет перенаправить напрямую в 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();
}
Обновлено: добавлена недостающая цитата.
Каковы преимущества или недостатки перенаправления внутри самого класса действия вместо использования для этого struts.xml? Я уже вижу одно различие: при использовании struts.xml перенаправление фактически представляет собой два полностью отдельных запроса друг за другом, тогда как ваше решение - только один запрос?
Вы можете перенаправить на другое действие, используя аннотацию -
@Result(
name = "resultName",
type = "redirectAction",
params = { "actionName", "XYZAction" }
)
Можно перенаправить напрямую с перехватчика, независимо от того, какое действие задействовано.
В struts.xml
<global-results>
<result name = "redir" type = "redirect">${#request.redirUrl}</result>
</global-results>
В перехватчике
@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";
}
Большое спасибо, это прекрасно работает! Есть ли способ внести изменения в xml, чтобы их не нужно было применять к каждому действию, которое у меня есть? В идеале я бы хотел, чтобы это применимо ко всем моим действиям.