Как сделать динамическое перенаправление URL-адресов в Struts 2?

#java #url #redirect #struts2

Вопрос:

Я пытаюсь перенаправить свое приложение 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. Классная штука.

Комментарии:

1. Большое спасибо, это прекрасно работает! Есть ли какой-то способ внести изменения в xml, чтобы их не нужно было применять к каждому моему действию? В идеале я бы хотел, чтобы это было применимо ко всем моим действиям.

2. Вы можете попробовать глобальный результат. Я не экспериментировал с этим для динамических переменных, но, пока действие возвращает результат, я не вижу причин, по которым это не сработало бы.

Ответ №2:

Можно также использовать annotations и плагин конвенции, чтобы избежать повторяющейся конфигурации в struts.xml:

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

${url} означает «используйте значение метода getURL».

Комментарии:

1. Спасибо! Как раз то, что мне было нужно.

Ответ №3:

Если кто-то хочет перенаправить непосредственно в 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(); 
}
 

Правка: Добавлена пропущенная цитата.

Комментарии:

1. Каковы преимущества или недостатки перенаправления внутри самого класса действий, а не с помощью struts.xml за это? Я уже вижу одно отличие: с помощью struts.xml, перенаправление на самом деле представляет собой два совершенно отдельных запроса спина к спине, в то время как ваше решение-это только один запрос?

Ответ №4:

В итоге я подкласс 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);
  }
}
 

Я не уверен, что это лучший способ сделать это, но он работает.

Ответ №5:

Вы можете перенаправить на другое действие с помощью аннотации —

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

Ответ №6:

Можно перенаправлять непосредственно с перехватчика, независимо от того, какое действие задействовано.

В 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";
}
 

Комментарии:

1. Работает на меня, и мне также нужно иметь это в перехватчике, спасибо!