2008-09-05 12 views
2

Я использую Struts 2.Struts 2: возврат на вызывающую страницу

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

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

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

T.I.A.

ответ

3

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

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

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

Существует более хорошее объяснение на этом посте: Stack Overflow

1
return INPUT; 

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

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

+0

Спасибо за ваш ответ (0), nikhilbelsare.
Я пробовал return INPUT;, но получил сообщение об ошибке **No result defined for action it.___.web.actions.VisualizationAction and result input**
(в значительной степени ожидалось, потому что я не определял «вход» где-нибудь в моем struts.xml).
То, что я действительно хотел сделать, это Struts 2, чтобы автоматически идентифицировать ссылочную страницу и перенаправлять меня на нее, поскольку действие вызывается со многих разных страниц, и у меня нет средств предсказать INPUT.
Я думаю, что я застрял в разборе заголовка ... – 2008-09-05 13:06:50

+0

В качестве альтернативы вы можете включить скрытое поле на каждой из ваших страниц, которое сообщает Action, на какую страницу перенаправить. Таким образом, вы можете получить более тонкий контроль над вещами. – nikhilbelsare 2008-09-06 04:36:15

0

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

http://domain.com/myAction.action

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

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

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

1

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

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, перенаправлять, как описано Винсентом Ramdhanie:

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

0

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

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

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