Стойки 2:вернуться на вызывающую страницу

StackOverflow https://stackoverflow.com/questions/45424

  •  09-06-2019
  •  | 
  •  

Вопрос

я использую Стойки 2.

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

Скажи, что я на странице x.jsp, я вызываю визуальное действие, чтобы изменить настройки 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), которую я могу вернуть, чтобы добиться цели?

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

ТИА

Это было полезно?

Решение

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

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

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

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

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

return INPUT;

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

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

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

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 могут отличаться...).

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

http://domain.com/myAction.action

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top