Как выполнять динамические переадресации URL в Struts 2?
Я пытаюсь перенаправить приложение Struts2 на сгенерированный URL-адрес. В этом случае я хочу, чтобы URL-адрес использовал текущую дату или дату, которую я искал в базе данных. Итак, /section/document
становится /section/document/2008-10-06
Какой лучший способ сделать это?
Ответы
Ответ 1
Вот как мы это делаем:
В 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. Прохладный материал.
Ответ 2
Можно также использовать annotations
и подключаемый модуль Конвенции, чтобы избежать повторной настройки в struts.xml:
@Result(location="${url}", type="redirect")
${url} означает "использовать значение метода getUrl"
Ответ 3
Я закончил подклассирование Struts 'ServletRedirectResult
и переопределив метод 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);
}
}
Я не уверен, что это лучший способ сделать это, но он работает.
Ответ 4
Если кто-то хочет перенаправить непосредственно в 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();
}
Изменить: добавлена отсутствующая цитата.
Ответ 5
Вы можете перенаправить на другое действие с помощью аннотации -
@Result(
name = "resultName",
type = "redirectAction",
params = { "actionName", "XYZAction" }
)
Ответ 6
Можно перенаправить непосредственно из перехватчика, независимо от того, какое действие оно задействовано.
В struts.xml
<global-results>
<result name="redir" type="redirect">${#request.redirUrl}</result>
</global-results>
В 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";
}