Вопрос

У меня вопрос относительно стека значений 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.jspsuccess.jsp имеет кнопку отправки, которая направляет нас на TestAction#testMethodTestAction#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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top