Struts2 - понимание стека значений
У меня есть вопрос относительно стека значений 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 после выполнения метода execute в этом классе.
Мои вопросы:
1) как мне получить это значение, которое я нажал на стек в success.jsp
?
2) Скажем, в success.jsp
у меня есть <s:submit method="testMethod" />
, который перенаправляется на класс действия, называемый TestAction
. Другими словами, на странице "Регистр" пользователь нажимает кнопку "Отправить", а в методе выполнения RegisterAction
мы нажимаем "тестовую строку" в стеке. Затем переходим к success.jsp
. Кнопка success.jsp
имеет кнопку отправки, которая направляет нас на TestAction#testMethod
. В TestAction#testMethod
есть ли значение, которое я нажал на стек в RegisterAction#execute
еще там? Как я могу его получить? Я прошел через отладчик eclipse, но я не вижу значения.
Спасибо.
Ответы
Ответ 1
Хорошо, я понял это.
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
Вы, ребята, можете свободно исправить меня, если что-то не так или если есть более умные способы сделать это:).
Спасибо.
Ответ 2
Struts 2 добавляет ваше действие в начало стека значений при его выполнении. Таким образом, обычный способ помещать вещи в Stack Value - добавлять геттеры/сеттеры для значений в ваш класс Action. Вы все еще используете тег s: property для доступа к значениям.
Учебник CRUD: http://struts.apache.org/2.1.6/docs/crud-demo-i.html
Ответ 3
просто определите свойство, подобное
String string1 = "test string";
в вашем действии.
в jsp вы можете получить доступ напрямую.
например
<s:property value="string1"/>
распечатает
"тестовая строка"
Ответ 4
Обычно, как говорит Нейт, вы будете использовать поле в своем действии, так как действие всегда находится на ValueStack. Однако это не работает, если вы пишете код перехватчика, так как перехватчик будет удален к моменту создания шаблона (JSP/freemarker и т.д.). Там вам нужно поместить какой-то java-объект bean -like на ValueStack, как и вы выше.
Ответ 5
Привет для информации
Это недостаток использования getValueStack().getContext()
, иногда данные не были доступны в .ftl(данные не показывались в строке2, но он шел в строке1), я действительно не знаю причины этого. Но с использованием .getValueStack().set("resDTO",resDTO);
проблема была решена (данные заполнялись для обеих функций).
${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2