Struts 2: вернуться на вызывающую страницу

Я использую Распорки 2.

Я хотел бы вернуться из действия на страницу, которая его вызвала.

Скажем, я нахожусь на странице x.jsp, я вызываю действие Visual, чтобы изменить настройки CSS в сеансе; Я хочу вернуться к x.jsp, а не к фиксированной странице (например, home.jsp)

Вот соответствующий фрагмент struts.xml:

<action
   name = "Visual"
   class = "it.___.web.actions.VisualizationAction">
   <result name = "home">/pages/home.jsp</result>
</action>

Конечно, мой VisualizationAction.execute() возвращает дома.

Есть ли какая-нибудь «волшебная» константа (например, INPUT_PAGE), которую я могу вернуть, чтобы сделать трюк?

Должен ли я использовать более сложный метод (например, извлечение страницы запроса и перенаправление на нее)?

T.I.A.

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

Ответы 5

return INPUT;

сделает свое дело. Константа INPUT определяется в самом интерфейсе Action. Это указывает на то, что действие требует дополнительных усилий.

Вызывая page, если вы имели в виду страницу, которая переместила вас на страницу ввода действия, тогда ваша страница ввода должна будет сохранить HTTP-заголовок «Referer» в области запроса для действия.

Спасибо за любезный (и быстрый) ответ, <i> nikhilbelsare </i>. <br/> Я попробовал <code> return INPUT; </code>, но получил <code> ** Результат не определен для действия it .___. web.actions.VisualizationAction и ввод результата ** </code> <br/> сообщение об ошибке (в значительной степени ожидаемое, потому что я не определил «ввод» нигде в моем <code> struts.xml </code>). <br/> Что я действительно хотел сделать, так это Struts 2, чтобы автоматически идентифицировать ссылающуюся страницу и перенаправлять меня на нее, поскольку действие вызывается с множества разных страниц, и у меня нет средств прогнозирования INPUT. <br/> Я думаю, я застрял в разборе заголовка ...

Manrico Corazzi 05.09.2008 17:06

В качестве альтернативы вы можете включить скрытое поле на каждой из ваших страниц, которое сообщает Action, на какую страницу перенаправлять. Таким образом вы получите более точный контроль над вещами.

nikhilbelsare 06.09.2008 08:36
Ответ принят как подходящий

Вы можете использовать динамический результат в struts.xml. Например:

<action
   name = "Visual"
   class = "it.___.web.actions.VisualizationAction">
   <result name = "next">${next}</result>
</action>

Затем в своем действии вы создаете поле с именем next. Итак, чтобы вызвать действие, вы передадите имя страницы, на которую хотите перейти. Затем действие возвращает «следующий», и struts будет знать, на какую страницу перейти.

В этом посте есть более приятное объяснение: Переполнение стека

Я предпочитаю такой способ навигации пользователей по определенным действиям.

http://domain.com/myAction.action

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

http://domain.com/myAction.action?changeDesign=silver_theme

Итак, вы пишете некий перехватчик struts 2, логика которого заключается в проверке наличия такого параметра 'changeDesign', и этот перехватчик будет выполнять необходимую работу по изменению дизайна и будет управлять рабочим процессом. С помощью перехватчика вы отделяете свои действия от общей логики.

Мое решение будет включать один интерфейс и один перехватчик. Вы реализуете следующий интерфейс для всех действий которому, которые вы, вероятно, захотите перенаправить:

public interface TargetAware {
  public String getTarget();
  public void setTarget(String target);
}

Перехватчик просто гарантирует, что цель установлена, если требуется:

public class SetTargetInterceptor extends MethodFilterInterceptor implements Interceptor {
   public String doIntercept(ActionInvocation invocation) {
      Object action = invocation.getAction();
      HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
      if (action instanceof TargetAware) {
         TargetAware targetAwareAction = (TargetAware) action;
         if (targetAwareAction.getTarget() == null)
            targetAwareAction.setTarget(getCurrentUri(request));
      }     
      return invocation.invoke();
   }

   // I'm sure we can find a better implementation of this...
   private static String getCurrentUri(HttpServletRequest request) {
      String uri = request.getRequestURI();
      String queryString = request.getQueryString();
      if (queryString != null && !queryString.equals(""))
         uri += "?" + queryString;
      return uri;
   }

   public void init() { /* do nothing */ }
   public void destroy() { /* do nothing */ }
}

С этого момента, когда эти два бита установлены и ваши действия реализуют интерфейс TargetAware (если вы ожидаете, что вам придется перенаправлять на них), тогда у вас будет доступ к параметру target в ваших JSP всякий раз, когда он вам понадобится. Передайте этот параметр на свой VisualizationAction (который также может реализовать интерфейс TargetAware!), А на SUCCESS выполните перенаправление, как объяснил Винсент Рамдхани:

<action name = "Visual" class = "it.___.web.actions.VisualizationAction">
   <result type = "redirect">
      <param name = "location">${target}</param>
      <param name = "parse">true</param>
   </result>
</action>

Я не пробовал каждую деталь этой стратегии. В частности, будьте осторожны с обозначениями, окружающими тип результата redirect (в зависимости от вашей конкретной версии Struts2: 2.0.x и 2.1.x могут отличаться в этом ...).

хорошо, в вашем классе это .___. web.actions.VisualizationAction, вы должны вернуть строковое значение, содержащее INPUT, тогда в struts.xml вы должны установить что-то вроде этого:

<action name = "Visual" class = "it.___.web.actions.VisualizationAction">
   <result name = "input">yourJspPage.jsp</result>
</action>

это приведет вас на нужную страницу. Это должно сработать, я работал над struts2 2 месяца

Это не то, о чем просит пользователь. Он хочет динамически изменять yourJspPage.jsp на основе вызывающей страницы

user1884155 06.11.2014 13:37

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