Сеанс формы Struts не сохраняет состояние - PullRequest
4 голосов
/ 06 декабря 2010

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

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

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

Ответы [ 4 ]

5 голосов
/ 07 декабря 2010

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

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

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

4 голосов
/ 21 декабря 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 () в форме.

1 голос
/ 07 декабря 2010

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

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

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

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

0 голосов
/ 07 декабря 2010

Как вы получаете доступ к компоненту формы страницы2 в действии2, а также в действии3.
Я полагаю, вы обращаетесь не по тому пути.Получаете ли вы исключение относительно invalidCast или что-то.

...