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

Я пытаюсь перенаправить приложение Struts2 на сгенерированный URL. В этом случае я хочу, чтобы URL-адрес использовал текущую дату или дату, которую я искал в базе данных. Итак, /section/document становится /section/document/2008-10-06.

Как лучше всего это сделать?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
28
0
74 388
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

В итоге я создал подкласс 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. Классная вещь.

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

Chris 24.11.2009 07:51

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

Johnny Wey 04.12.2009 21:12

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

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

$ {Url} означает "использовать значение метода getUrl".

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

Nate 14.03.2012 05:19

Если кто-то хочет перенаправить напрямую в 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 перенаправление фактически представляет собой два полностью отдельных запроса друг за другом, тогда как ваше решение - только один запрос?

user1884155 05.11.2014 17:55

Вы можете перенаправить на другое действие, используя аннотацию -

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

Другие вопросы по теме