Подтвердить что ты не робот

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, но я не вижу значения.

Спасибо.

4b9b3361

Ответ 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