Struts 2: вернуться на страницу вызова - PullRequest
2 голосов
/ 05 сентября 2008

Я использую Распорки 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.

Ответы [ 5 ]

3 голосов
/ 15 октября 2008

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

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

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

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

1 голос
/ 15 января 2009

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

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

1 голос
/ 05 сентября 2008
return INPUT;

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

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

0 голосов
/ 15 января 2009

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

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

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

0 голосов
/ 23 октября 2008

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

http://domain.com/myAction.action

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

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

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

...