Struts 2 subaction

У меня есть форма Struts2. В этой форме пользователю предлагается заполнить несколько полей. 2 из этих полей заполняются путем выбора объекта из другого действия.

Фактически: основная форма => кнопка выбора => новое действие с новой формой для заполнения => возврат к основной форме и заполнение соответствующего поля.

Моя проблема в том, что после того, как пользователь закончил субакцию, я хочу вернуться к основной форме, но не потерять все, что он заполнил раньше...

Я не знаю, как справиться с этим, я должен передать в подчинение каждое поле из основной формы?

3 ответа

Решение

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

1) Отправьте все параметры, которые вы хотите сохранить каждый раз. Самый простой способ сделать это - использовать скрытые поля. Управляемая моделью также может иметь здесь смысл или помещать несколько действий в один класс, так как это подчеркивает, что эти действия имеют общий набор свойств.

2) Сохраните значение в сеансе, как рекомендовал Василий, однако Struts2 имеет перехватчик области... Если вам нужно делать это часто, его стоит посмотреть (см. Последний пример на странице): http://struts.apache.org/2.3.1.2/docs/scope-interceptor.html Однако сделать это правильно немного сложно, потому что, если это офисное приложение и пользователи похожи на меня, у нас будет открыто дюжина окон в любой момент времени. В этой ситуации вы захотите рассмотреть возможность добавления токена (см. Тэг токена struts2) к каждому "потоку", что предотвратит появление одного из дюжины окон при обновлении, чтобы получить последние данные из того, что я ожидал бы скорее чем загрязниться из какого-то глобального магазина, который используют все действия. Есть несколько других способов обработки потоков / разговоров... например, кто-то написал плагин, который, я полагаю, реализует то, что только что объяснили: http://code.google.com/p/struts2-conversation/

Всегда стоит быстро взглянуть на плагины struts2, чтобы убедиться, что вы не изобретаете велосипед заново, хотя я должен сказать, что не могу поручиться за этот плагин.

3) Не заставляйте их покидать страницу вообще. Это очень удобно... Если вам нужно выбрать дополнительные параметры, при нажатии на кнопку "раскладка" разверните форму, заполнив необходимые поля, а затем, когда они нажмут "обновить" в этом подразделе, она закроется и обновит остальные. полей. Вам потребуется комбинация JS на стороне клиента с ответом XML или JSON. Для ваших собственных страниц JSON - это более простой способ, чтобы получить ответы JSON, смотрите Struts2-json-plugin.

Я бы пошел с № 3 в большинстве случаев. Возможно #1, если бы я знал, что действие будет использоваться только из вызывающего действия, и / или мне нужна очень безопасная форма закладки (передавайте все параметры, если это возможно, с помощью GET). № 2 в более сложных сценариях, где для совместной работы требовалось несколько действий, и я не мог использовать ajax по какой-то странной причине. Примечание № 3 и № 2 не очень удобны для закладок, и в целом они не очень дружелюбны по отношению к состоянию без использования хранилища на стороне клиента.

Для работы платформы struts2 необходимо следующее:

  1. 2 стойки образуют классы с полями
  2. Класс действий
  3. Страница JSP
  4. Конфигурационный файл Struts

Затем пройдите описанный ниже процесс:

  • Когда первая форма загружена, сохраните ее компонент во второй форме через поле
  • После возврата из первой формы загрузите ее поля во второй форме через вышеуказанное поле.

Сохраните вашу основную форму в сеансе.

public class Test extends ActionSupport implements Preparable {

  private MainForm form;

  public void prepare(){
    form =     (MainForm)ServletActionContext.getRequest().getSession().getAttribute("mainForm");
    if(form == null) {
      form = new MainForm();
    }
  }

  public String execute(){
    //Do something useful
    //Do something useful
    //Do something useful
    return SUCCESS;
  }

  public MainForm getForm() {
    return form;
  }

  public void setForm(MainForm form) {
    this.form = form;
  }

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

Другие вопросы по тегам