struts2 — понимание стека значений
-
05-07-2019 - |
Вопрос
У меня вопрос относительно стека значений struts2.Допустим, у меня есть класс Action под названием RegisterAction
который имеет метод выполнения следующим образом:
public String execute() {
ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(new String("test string"));
return SUCCESS;
}
Мой struts.xml выглядит так:
<struts>
<package name="default" extends="struts-default">
<action name="*Register" method="{1}" class="vaannila.RegisterAction">
<result name="populate">/register.jsp</result>
<result name="input">/register.jsp</result>
<result name="success">/success.jsp</result>
</action>
<action name="*Test" method="{1}" class="vaannila.TestAction">
<result name="test">/test.jsp</result>
<result name="success">/success2.jsp</result>
</action>
</package>
</struts>
Таким образом, управление будет передано в файл Success.jsp после выполнения метода выполнения в этом классе.
Мои вопросы:
1) как мне получить значение, которое я положил в стек в success.jsp
?
2) Скажем, в success.jsp
у меня есть <s:submit method="testMethod" />
который перенаправляет на класс действий под названием TestAction
.Другими словами, на странице регистрации пользователь нажимает кнопку «Отправить», а в методе выполнения RegisterAction
мы помещаем «тестовую строку» в стек.Затем мы идем в success.jsp
.А success.jsp
имеет кнопку отправки, которая направляет нас на TestAction#testMethod
.В TestAction#testMethod
, это значение, которое я положил в стек в RegisterAction#execute
все еще там?Как я могу это получить?Я прошел через отладчик eclipse, но не вижу смысла.
Спасибо.
Решение
Хорошо, я понял это.
1) Способ, которым я нашел получение объектов в стеке значений, чтобы мы могли получить к ним доступ из jsp, выглядит следующим образом:
Map<String, Object> context = new HashMap<String, Object>();
context.put("key", "some object");
context.put("key2", "another object");
ActionContext.getContext().getValueStack().push(context);
Другими словами, мы можем поместить HashMap в стек значений, содержащий нужные нам объекты.Затем в jsp мы можем получить доступ к фактическим значениям следующим образом:
<s:property value="key" />
<s:property value="key2" />
Он просмотрит стек значений и найдет эти значения в HashMap, который мы отправили.
2) Пример класса действия связан только с одним запросом.Поэтому, когда мы переходим к другому действию, а затем оказываемся на другом jsp, то, что мы поместили в стек значений из первого действия, там не будет, поскольку у другого действия есть собственный стек значений.ссылка: http://www.manning-sandbox.com/thread.jspa?messageID=93045
Ребята, вы можете поправить меня, если что-то из этого не так или есть более разумные способы сделать это :).
Спасибо.
Другие советы
Struts 2 добавляет ваше действие в начало стека значений при выполнении.Итак, обычный способ поместить данные в стек значений — это добавить методы получения/установки значений в ваш класс Action.Вы по-прежнему используете тег s:property для доступа к значениям.
Учебное пособие по CRUD: http://struts.apache.org/2.1.6/docs/crud-demo-i.html
просто определите свойство типа
String string1 = "test string";
в вашем действии.
в jsp вы можете получить прямой доступ.
например
<s:property value="string1"/>
распечатаю
"тестовая строка"
Обычно, как говорит Нейт, вы будете использовать поле в своем действии, поскольку действие всегда находится в ValueStack.Однако это не работает, если вы пишете код перехватчика, поскольку перехватчик исчезнет к моменту вызова шаблона (JSP/freemarker и т. д.).Там вам нужно поместить в ValueStack какой-то объект, похожий на Java-компонент, так же, как вы это делали выше.
Привет, просто для информации
Это недостаток использования getValueStack().getContext()
иногда данные были недоступны в .ftl (данные не отображались в строке 2, но поступали в строку 1), я действительно не знаю причину этого.Но используя .getValueStack().set("resDTO",resDTO);
проблема была решена (данные заполнялись для обеих функций).
${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2