Struts2 - Динамические поля формы и поиск данных в базе данных - PullRequest
0 голосов
/ 03 января 2012

Я занимаюсь разработкой веб-приложения для регистрации с использованием Struts2 и нуждаюсь в руководстве.

Справочная информация:

В форме регистрации имеется набор из пяти полей формы: 1 текстовое поле и4 выпадающих списка выбора.Пять полей описывают основную позицию человека в образовательной среде: текстовое поле позволяет пользователю вставить название своей работы, а выпадающие меню позволяют пользователю выбрать, к какой школе, учебному заведению, отделу и отделу он принадлежит.Выпадающие меню инициализируются с опциями, которые хранятся в базе данных (внутри действия регистрации списки массивов инициализируются этими значениями до отображения формы).Например:

<s:select emptyOption="true" key="school1.schoolId" list="schoolList" listKey="schoolId" listValue="schoolName" required="true" />

Проблема:

Мне нужно предоставить пользователю возможность добавить X количество вторичных позиций.В регистрационной форме пользователь может нажать кнопку «добавить другую принадлежность», и отобразится новый набор из 5 полей формы.Эти поля также необходимо будет проверить и сохранить, когда пользователь нажмет кнопку отправки формы.

Каков наилучший подход к решению этой проблемы?

До сих пор я только объявилсписки массивов для каждого поля формы, например так:

private List<String> jobTitles = new ArrayList<String>();
private List<School> schools = new ArrayList<School>();
private List<Institution> institutions = new ArrayList<Institution>();
private List<Department> departments = new ArrayList<Department>();
private List<Division> divisions = new ArrayList<Division>();

Но я не знаю, как поступить.Как отобразить начальные 5 полей для основной позиции?Если я использую Javascript для динамического добавления новых полей формы, как мне инициализировать динамические выпадающие меню с параметрами, хранящимися в базе данных?Как мне сохранить эти значения при перезагрузке страницы?

Любая помощь приветствуется - спасибо!

1 Ответ

1 голос
/ 03 января 2012

Основная проблема, которую вам нужно решить, - это получить индексированный список параметров запроса в вашем классе действий. Это довольно просто, и я думаю, что вы на правильном пути, начав с создания List s входных параметров. Я нашел немного документации по теме здесь . В основном вы можете иметь поля формы с именами, такими как jobTitles[0], jobTitles[1], которые будут использоваться для заполнения списка jobTitles.

Тем не менее, я думаю, что понятие «принадлежность» заслуживает отдельного класса:

class UserAffiliation {
   private String title;
   private String schoolId;
   private String institutionId;
   private String departmentId;
   private String divisionId;

   // Make sure that there is a no-args constructor (default or explicit) for Struts to create instances. 
   // Add getters and setters
}

В вашем классе действий:

   private List<UserAffiliation> affiliations;
   ...
   // getter and setter for affiliations

Было бы достаточно для захвата ввода пользователя.

Ваш JSP может выглядеть примерно так:

<form action=".." method="post">
  <div class="affiliation">
     <s:textfield name="affiliations[0].title"/>
     <s:select name="affiliations[0].schoolId" list="schools" listKey="schoolId" listValue="schoolName"/>
     ...
  </div>

  <s:if test="affiliations != null && affiliations.size > 1">
    <s:iterator value="affiliations" begin="1" status="status">
        <s:textfield name="affiliations[%{#status.index + 1}].title"/>
        <s:select name="affiliations[%{#status.index + 1}].schoolId" list="schools" listKey="schoolId" listValue="schoolName"/>
            ...
    </s:iterator>
  </s:if>
  ....
</form>

<div id="affilationTemplate" style="display:none;">
   <div class="affiliation">
      <s:textfield name="affiliations[__IDX__].title"/>
      <s:select name="affiliations[__IDX__].schoolId" list="schools" listKey="schoolId" listValue="schoolName"/>
   </div>
   ...
</div>

Обратите внимание на div affilationTemplate. Вы можете использовать JS, чтобы получить HTML-код этого шаблона, заменить __IDX__ на соответствующий индекс и добавить к содержимому формы, когда пользователь нажимает кнопку «добавить еще одну принадлежность». Это гарантирует, что вновь добавленные поля выбора предварительно заполнены соответствующими значениями.

В блоке итератора отображаются значения, которые пользователь уже отправил (за исключением «первичной принадлежности», которая уже отображается над ним).

ПРИМЕЧАНИЕ: Вы, конечно, должны попытаться избавиться от повторяющихся элементов формы, если это возможно. Я бы попробовал извлечь их из списка включенных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...