struts2 - понимание стека значений - PullRequest
17 голосов
/ 26 ноября 2009

У меня вопрос по стеку значений struts2. Допустим, у меня есть класс Action с именем RegisterAction, который имеет метод execute следующим образом:

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, все еще там? Как я могу получить это? Я прошел через отладчик затмения, но не вижу значения.

Спасибо.

Ответы [ 5 ]

14 голосов
/ 27 ноября 2009

Хорошо, я понял это.

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 голосов
/ 06 июня 2012

просто определите свойство как

String string1 = "test string";

в вашем действии.

в jsp, к которому вы можете получить прямой доступ.

например,

 <s:property value="string1"/>

распечатает

"тестовая строка"

2 голосов
/ 28 ноября 2009

Struts 2 добавляет ваше действие к вершине стека значений при выполнении. Итак, обычный способ поместить вещи в стек значений - это добавить методы получения / установки для значений в ваш класс Action. Вы по-прежнему используете тег s: property для доступа к значениям.

Учебник CRUD: http://struts.apache.org/2.1.6/docs/crud-demo-i.html

0 голосов
/ 16 февраля 2011

Привет только для информации

Это недостаток использования getValueStack().getContext(), иногда данные не были доступны в .ftl (данные не отображались в строке 2, но поступали в строке 1), я действительно не знаю причину этого. Но с использованием .getValueStack().set("resDTO",resDTO); проблема была решена (данные заполнялись для обеих функций).

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
0 голосов
/ 09 марта 2010

Обычно, как говорит Нейт, вы будете использовать поле в своем действии, поскольку действие всегда находится в ValueStack. Однако это не работает, если вы пишете код перехватчика, так как перехватчик исчезнет к тому времени, когда будет вызван шаблон (JSP / freemarker и т. Д.) Там вам нужно поместить какой-то объект, подобный Java-бину, в ValueStack, как вы делали выше.

...