Стойки 2:вернуться на вызывающую страницу
Вопрос
я использую Стойки 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 месяца.