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




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