Компонент формы сеанса Struts не сохраняет состояние

Я создаю интерфейс, похожий на мастера, состоящий из 3 страниц jsp и 3 действий Struts, используя Struts 1.3. Поток выглядит следующим образом: страница 1> действие 1 -> страница 2> действие 2 -> страница 3> действие 3.

Я использую bean-компонент формы сеанса (форма действия с областью действия сеанса) для обмена данными между запросами. Проблема, с которой я сталкиваюсь, заключается в том, что данные, которые я отправил на странице 2, доступны в действии 2, но не в действии 3. Я сомневаюсь, что это может быть связано с тем, что у меня нет формы на странице 3 для хранения этих данных, или потому что я звоню action3 через метод публикации jQuery вместо обычной отправки формы, но я действительно не уверен.

Я копал весь интернет в течение почти дня и до сих пор не повезло. Может ли кто-нибудь предложить некоторую помощь. Большое спасибо.


person Sandeep    schedule 06.12.2010    source источник
comment
Вы храните свои сеансы в форме request.getSession().setAttribute(KEY, VALUE)?   -  person Buhake Sindi    schedule 06.12.2010
comment
Я смущен. Если ваша область формы является сеансом, она должна сохранить данные. Делая пост jQuery, вы имеете в виду ajax? В этом случае вам придется передать информацию в параметре запроса или вы можете использовать JSTL {sessionScope.‹variable_name› в вашем jsp.   -  person CoolBeans    schedule 06.12.2010
comment
Да, я отправляю данные через Ajax, в struts-config.xml действие связано с моей формой. Но тем не менее стойки должны сохранять данные формы? Я думаю, что Struts хранит мою форму в сеансе (я могу получить ее с помощью session.getAttribute), поэтому все данные, установленные на ней, должны быть доступны до тех пор, пока я явно не сброслю форму, я прав? Или это недостаток фреймворка?   -  person Sandeep    schedule 07.12.2010


Ответы (4)


Я предполагаю, что вы, возможно, назначили одну и ту же форму для действия в StrutsConfig.xml и, следовательно, оно не дает ClassCastException. Кстати, если вы хотите получить доступ к тому же компоненту формы, который был заполнен в действии 2, выполните следующие действия.

  1. Посмотрите в файле strutsConfig actionMapping для обоих действий (2 и 3). оставьте имя формы другим для отдельного действия (например, форма2 для действия2 и форма3 для действия3).
  2. В Action3 вместо приведения формы используйте этот form2 = (FormBean2) session.getAttribute("form2");

Причина вышеизложенного в том, что, поскольку оба действия используют одну и ту же форму, стойки могут перезаписать ее. Надеюсь, вышеизложенное решит вашу проблему.

person Naved    schedule 07.12.2010
comment
Спасибо, я решил свою проблему. Я бы хотел, чтобы Struts предложил более аккуратный способ сделать такую ​​простую вещь :-) - person Sandeep; 07.12.2010

Метод reset() в форме вызывается с каждым запросом, и поэтому вы теряете состояние. Вы можете управлять этим программно.

public class MyForm extends ActionForm {
    boolean reset = true;
    private String[] checkboxes = {};

    @Override
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        if (reset) {
            this.checkboxes = new String[];
            // etc
        }

        reset = true;
    }

    public void doNotReset() {
        reset = false;
    }
}

Попросите action2 вызвать doNotReset() в форме.

person Paul Croarkin    schedule 21.12.2010

Спасибо за ваш вклад. Вот как я решил свою проблему. Мне не очень нравится это решение, но, возможно, это самое аккуратное, что я могу найти.

На странице 3 я добавил скрытые поля для того свойства, которое я хочу сделать доступным в действии 3. Struts сохранит значения в этих скрытых полях, и когда форма будет отправлена ​​снова, данные будут повторно заполнены в форме действия.

Мне кажется, что Struts работает так: когда он загружает страницу 3, он пытается заполнить форму на странице 3 значениями myForm. Когда форма отправлена, происходит обратный процесс, он заполняет myForm значениями из пользовательской формы. Проблема в том, что перед заполнением myForm значениями, отправленными пользователем, он сбрасывает свойства myForm. И поскольку после сброса он не находит значения для этих полей, он оставляет его пустым.

Я не думаю, что Struts имеет смысл работать таким образом, но... пусть будет так.

person Sandeep    schedule 07.12.2010

Как вы получаете доступ к bean-компоненту формы page2 как в action2, так и в action3.
Я полагаю, вы обращаетесь неправильным путем. Получаете ли вы исключение в отношении invalidCast или что-то в этом роде.

person Naved    schedule 07.12.2010
comment
В классе действия я обращаюсь к своей форме следующим образом: MyForm myForm = (MyForm) form; Никаких исключений не возникало, и в действии 2 я смог получить правильные данные. то есть myForm.getName(). Но с тем же кодом в action3 все свойства пусты, как будто был создан новый экземпляр моей формы. - person Sandeep; 07.12.2010