corner imagecorner image
FeaturesPluginsDocs & SupportCommunityPartners

Использование виртуальных форм

Составитель Мэт Бом (Matt Bohm)

В этой статье описано использование виртуальных форм в среде IDE NetBeans 6.0 или 6.1.

Содержание

Содержимое на этой странице относится к среде IDE NetBeans 6.0

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

Программное обеспечение или ресурс Требуемая версия
Среда IDE NetBeans Web & Java EE, версия 6.1 или 6.0
Комплект для разработчика на языке Java (JDK) версия 6 или
версия 5
Элементы JavaServer Faces
Платформа Java EE
1.2 с Java EE 5* или
1.1 с J2EE 1.4
Сервер приложений GlassFish V2
База данных TRAVEL Не требуется

* Для получения преимуществ благодаря функциональности Java EE 5 в среде IDE NetBeans используйте сервер приложений, который является полностью совместимым со спецификацией Java EE 5, например, сервер приложений GlassFish V2 UR2. В случае использования другого сервера см. заметки о выпуске и часто задаваемые вопросы для получения информации об известных проблемах и обходных решениях. Для получения подробной информации о поддерживаемых серверах и платформе Java EE см. заметки о выпуске.

Примечание для пользователей среды IDE NetBeans 6.1:

  • При создании проекта в NetBeans 6.1 доступны новые параметры, для которых можно оставить значения по умолчанию. Например, флажок Use Dedicated Folder for Storing Libraries может быть оставлен неустановленным.
  • В среде IDE NetBeans 6.1 поддерживается привязка по запросу. В тех местах, где элементы требуют написания кода Java, теперь следует вручную добавить атрибут привязки к элементам в визуальном веб-приложении JSF. Для этого щелкните правой кнопкой мыши каждый элемент и выберите "Add Binding Attribute". Для получения дополнительных сведений см. вики-страницу On-demand Binding Attribute.

Установка примера

Примечание: Для среды NetBeans 6.0 или 6.1 существуют примеры приложений, доступные через мастер создания проекта. Просто выберите File > New Project > Samples > Web > Visual JSF > Movie Administration и продолжите с действия 3, приведенного ниже.

  1. Начните с распаковки содержимого архива MovieAdmin.zip, содержащего две папки проекта: MovieAdmin и MoviesClassLibrary.
  2. Запустите среду IDE, закройте все проекты и откройте проект "MoviesClassLibrary".
  3. Откройте проект "MovieAdmin".

    Примечание: На странице "1.jsp" выводится ошибка, поскольку необходимо привести ссылку на библиотеку.
  4. В окне "Projects" щелкните правой кнопкой мыши узел проекта "MovieAdmin" и выберите "Properties".
  5. В диалоговом окне "Project Properties" выберите Libraries в дереве "Categories" и затем нажмите кнопку Add Project.
  6. В диалоговом окне "Add Project" найдите местоположение проекта "MoviesClassLibrary", выберите MoviesClassLibrary и нажмите кнопку "Add Project JAR Files".
  7. Нажмите кнопку "OK".
  8. В окне "Projects" щелкните правой кнопкой мыши узел проекта "MoviesClassLibrary" и выберите "Build" в контекстном меню.
  9. Выйдите из среды IDE, а затем вновь откройте среду IDE, после чего библиотека "MoviesClassLibrary" будет доступна в проекте "MovieAdmin".

Кнопка "Show Virtual Forms"

После установки примера дважды щелкните узел Page1.jsp в окне "Projects" для открытия страницы "Page1.jsp" в Visual Designer. В панели инструментов в нижней части вкладки появится группа кнопок, включающая кнопку "Show Virtual Forms" . Нажмите кнопку для вывода на экран виртуальных форм, используемых на странице.

Кнопка "Show Virtual Forms"

Обзор приложения "Movie Administration"

Демонстрационное приложение "Movie Administration" представляет собой гипотетическое административное приложение, предназначенное для использования в пунктах видеопроката. В ходе бизнеса в хранилищах данных собирается информация о коллекции фильмов, при этом административное приложение позволяет сотрудникам вносить изменения в эти данные. Организация также имеет отдельный внешний веб-сайт, позволяющий клиентам просматривать коллекцию. Указанный источник данных используется внешним веб-сайтом.

Примечание: В реальном приложении в подобной ситуации использовалась бы реляционная база данных или другое внешнее хранилище данных. Однако для подчеркивания роли виртуальных форм в приложении "Movie Administration" данные хранятся в виде объектов сеанса.

На Рис. 2 показана страница Page1.jsp приложения "Movie Administration", открытая в обозревателе. Сотрудник может просмотреть фильмы определенного жанра, выбрав требуемое значение в раскрывающемся списке Current Genre. Внутри таблицы можно изменить значения в полях названия, года выхода, продолжительности в минутах, рейтинга, URL-адрес изображения и описания; изменения сохраняются после нажатия сотрудником кнопки Update или при использовании элементов управления подкачкой страниц (когда они доступны). Сотрудник может удалить фильм из коллекции, нажав кнопку Remove для требуемой строки одной из строк. При нажатии кнопки Preview в одной из строк осуществляется переход к файлу Preview.jsp, позволяющему сотруднику осуществлять предварительный просмотр подробной страницы фильма в таком виде, в котором она будет представлена клиенту, просматривающему внешний веб-сайт. Отдельная группа элементов управления располагается под таблицей и предназначена для добавления фильма в коллекцию.

Страница "Page1.jsp" в веб-обозревателе

Рекомендация: При запуске демонстрационного приложения и при добавлении фильмов в коллекцию вместо относительных путей к файлам изображений в проекте можно вводить URL-адреса на основе файлов. Такой адрес представляет собой краткий путь, позволяющий отказаться от добавления указанных графических файлов в проект.

Помимо того, что сотрудник имеет возможность предварительного просмотра подробных данных фильма, на странице "Preview" также можно исправить жанр просматриваемого фильма.

Требования по выборочной обработке

Страница Page1.jsp является причиной возникновения интересной проблемы. При выборе нового текущего жанра необходимо обработать значение, выбранное в раскрывающемся списке Current Genre, но не другие входные данные, введенные на странице. При обработке других входных данных любые ошибки преобразования или проверки достоверности, возникшие для этих данных, станут причиной отклонения передачи, что помешает изменению жанра, в результате чего не поставленная цель будет достигнута. Аналогично, при нажатии кнопки Update должны обрабатываться входные данные, находящиеся внутри таблицы, а не входные данные раздела "Add Movie". Любые ошибки преобразования или проверки достоверности для полей раздела "Add Movie" могут вызвать отклонение передачи, что помешает обновить поля, находящиеся в таблице, что также нежелательно. В отношении кнопок Preview, Remove и Add также существуют подобные требования к выборочной обработке.

Таким образом, выборочная обработка определенных входных данных при взаимодействии пользователя с определенными элементами передачи является общим и критическим требованием к веб-приложениям. Обработка входных данных включает в себя их преобразование и проверку, активацию при любом изменении значения, связанного с входными данными, и их привязку к целевому элементу (если элемент является привязанным). Элементом ввода является любой элемент, принимающий вводимую пользователем информацию, например, текстовое поле, текстовая область, раскрывающийся список или переключатель. (С технической точки зрения к элементам ввода относятся элементы, реализующие интерфейс EditableValueHolder.) Элементом передачи является любой элемент, вызывающий передачу веб-страницы и таким образом инициирующий обработку входной информации; к ним относятся не только кнопки и ссылки (реализующие интерфейс "ActionSource"), но и элементы ввода с включенной функцией "Auto-submit On Change". Таким образом, элемент может одновременно быть и элементом ввода и элементом передачи. Таким элементом является раскрывающийся список "Current Genre", расположенный на странице Page1.jsp приложения "Movie Administration".

Полные требования к выборочной обработке для страницы Page1.jsp приведены ниже:

  • Раскрывающийся список "Current Genre". При выборе нового текущего жанра раскрывающийся список Current Genre должен автоматически передавать веб-страницу, а входные данные раскрывающегося списка должны быть обработаны отдельно от других, остальные входные данные необходимо игнорировать.
  • Кнопка "Update". При нажатии кнопки Update должны обрабатываться только те поля, которые находятся внутри таблицы, но не поля, расположенные в разделе "Add Movie". Если это происходит, обработка выбора текущего жанра не требуется, поскольку он не был изменен.
  • Кнопки "Preview/Remove". При нажатии кнопки Preview или Remove входные данные вообще не должны обрабатываться. В этом случае обработка входных данных не требуется, поскольку элемент "Table" и интерфейсы API DataProvider предоставляют доступ к строке, в которой была нажата кнопка. Любые входные данные, введенные в поля внутри таблицы или в разделе "Add Movie", должны игнорироваться. И снова обработка выбора текущего жанра не требуется, поскольку он не был изменен
  • Кнопка "Add". При нажатии кнопки Add необходимо обработать только те входные данные, которые были введены в разделе "Add Movie".

Для страницы Page1.jsp также существует дополнительное требование к выборочной обработке. Если в таблице отображаются элементы управления подкачкой страниц, при взаимодействии с ними должны обрабатываться только те входные данные, которые были введены в таблице. В противном случае ошибки преобразования и проверки достоверности полей, находящихся вне таблицы, могут стать причиной отклонения передачи.

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

Введение в виртуальные формы

Виртуальная форма определяет группы элементов ввода и элементов передачи на странице. Говорят, что элементы ввода участвуют в виртуальной форме, т.е. являются ее "участниками". Про элементы передачи говорят, что они "передают" ее. При взаимодействии пользователя веб-сайта с элементом, передающим виртуальную форму, участники виртуальной формы будут обработаны, в то время как оставшиеся входные данные, приведенные на странице, игнорируются.

Обратите внимание на следующее:

  • Виртуальная форма может включать в себя нулевое количество или несколько участников и одного или нескольких отправителей.
  • В виртуальной форме могут участвовать только элементы ввода. Поскольку по определению элементом передачи является любой элемент, который может передавать веб-страницу (включая элементы ввода с включенной функцией "Auto-submit On Change"), любой подобный элемент может быть отправителем виртуальной формы.
  • Виртуальные формы не налагают топографических ограничений; их участники и отправители не должны визуально находиться рядом друг с другом.
  • Элемент ввода может участвовать в нескольких виртуальных формах, однако элемент передачи может передавать не больше одной виртуальной формы.
  • Элемент ввода может передавать виртуальную форму и одновременно участвовать в одной или нескольких виртуальных формах.
  • Если элемент передачи не передает ни одной виртуальной формы, при взаимодействии пользователя с ним, как обычно, будет передана текстовая форма.

В отличие от свойства immediate, определяющего только одну группу, на странице можно использовать столько виртуальных форм, сколько необходимо, благодаря чему создается функциональное решение. Кроме того, в то время как свойство immediate изменяет жизненный цикл JavaServer Faces и поэтому предназначено для опытных разработчиков, виртуальные формы не оказывают подобного влияния и являются более простыми в использовании.

Взгляните на Рис. 3, на котором страница Page1.jsp приложения "Movie Administration" представлена в визуальном редакторе IDE. Виртуальные формы обозначены с помощью цветов; сплошными линиями выделены участники; пунктирные линии указывают на элементы передачи. Используются четыре виртуальные формы:

  • genre. Раскрывающийся список Current Genre участвует в виртуальной форме "genre" (синий цвет) и передает ее. Для демонстрации того, что он одновременно является и участником, и элементом передачи виртуальной формы, его верхней и левой границами являются сплошные линии, а нижней и правой границами – пунктирные линии.
  • update. Внутри таблицы поля заголовка, года выпуска, продолжительности в минутах, рейтинга, URL-адрес изображения и описания являются участниками обновления виртуальной формы (зеленый цвет), а кнопка Update передает ее.
  • preview/remove. Кнопки "Preview" и "Remove" используются для передачи виртуальной формы "preview/remove" (красный цвет), не имеющей участников.
  • add. В разделе "Add Movie" все поля "Genre", "Title", "Year", "Minutes", "Rating", "Image" и "Description" участвуют в виртуальной форме "add", а кнопка Add передает ее.

Примечание: На странице Page1.jsp имеется элемент "Message List", встроенный в элемент "Group Panel". В визуальном редакторе элемент "Message List" имеет красную окантовку, а элемент "Group Panel" отображается с пунктирной границей. Имейте в виду, что границы этих элементов не относятся к виртуальным формам.

Страница "Page1.jsp" в Visual Designer

Стоит повторить, что в то время как виртуальная форма может иметь один или несколько элементов передачи, любой элемент передачи может передавать не больше одной формы. Так, например, виртуальная форма "preview/remove" включает в себя два элемента передачи – кнопки Preview и Remove. Однако каждая из этих кнопок передает только одну виртуальную форму; передача нескольких виртуальных форм невозможна. Кроме того, несмотря на то, что это не выполняется в приложении "Movie Administration", участие элемента ввода в нескольких виртуальных формах может быть идеальным вариантом (и, зачастую, довольно распространено). В то время как для элементов, связанных с каждой виртуальной формой на странице Page1.jsp, существует тенденция визуального расположения рядом друг с другом, это ни в коем случае не является требованием механизма виртуальных форм.

Для удовлетворения особых требований к выборочной обработке на странице Page1.jsp используются следующие четыре виртуальные формы:

  • genre. При изменении сотрудником варианта выбора в раскрывающемся списке Current Genre выполняется передача виртуальной формы "genre". Поскольку раскрывающийся список является единственным участником виртуальной формы, обрабатываются только его входные данные; другие входные данные, находящиеся на странице, игнорируются. В результате этого проверки и преобразования, относящиеся к ним, не могут стать причиной отклонения передачи.
  • update. При нажатии сотрудником кнопки Update выполняется передача виртуальной формы "update". Поскольку в этой виртуальной форме участвуют только входные данные, находящиеся внутри таблицы, эти данные обрабатываются, в то время как другие входные данные игнорируются. В результате этого проверки и преобразования, относящиеся к полям раздела "Add Movie", не могут стать причиной отклонения передачи.
  • preview/remove. При нажатии сотрудником кнопки Preview или кнопки Remove выполняется передача виртуальной формы "preview/remove". Обработка входных данных не осуществляется, поскольку виртуальная форма не содержит ни одного участника. Как было указано ранее, обработка входных данных не требуется, поскольку элемент "Table" и интерфейсы API источников данных обеспечивают доступ к строке, в которой была нажата кнопка. В результате ни одно преобразование или проверка не могут стать причиной отклонения передачи.
  • add. При нажатии сотрудником кнопки Add выполняется передача виртуальной формы "add". Поскольку в этой виртуальной форме участвуют только входные данные раздела "Add Movie", обрабатываются именно они, в то время как другие входные данные игнорируются. В результате этого преобразования и проверки полей, содержащихся в таблице, не могут стать причиной отклонения передачи.

Сохранение и игнорирование переданных значений

Если пользователь передает виртуальную форму, инициирующую повторное отображение той же самой страницы, требуемое поведение виртуальной формы по умолчанию состоит в сохранении и отображении переданных значений для элементов, не являющихся участниками. Подобным образом предотвращается потеря любых данных пользователей, которые не были обработаны. В качестве примера, предположим, что пользователь ввел некоторые данные в поля раздела "Add Movie". Однако перед нажатием кнопки "Add" он принял решение сменить вариант выбора в раскрывающемся списке "Current Genre" или изменить какие-либо данные в таблице и нажал кнопку "Update". В результате будет передана виртуальная форма, в которой не участвуют поля ввода раздела "Add Movie". Для предотвращения потери данных, введенных пользователем в эти поля, при повторном отображении страницы в этих полях сохраняются и отображаются их переданные значения, а не выводятся собственные значения. Переданными значениями являются непроверенные и неизмененные данные, содержавшиеся в полях ввода при передаче веб-страницы пользователем. Собственные значения представляют собой фактические текущие значения элементов.

Однако существуют некоторые действия пользователей, для которых необходимо переопределить поведение по умолчанию. В этих случаях вместо сохранения и отображения переданных значений для некоторых элементов, не являющихся участниками, необходимо явным образом отбросить переданные значения и отобразить имеющиеся значения. Например, поля ввода, находящиеся внутри таблицы, не участвуют в виртуальной форме "genre". Поэтому при изменении пользователем варианта выбора в списке "Current Genre" и повторном отображении страницы поведение по умолчанию состоит в сохранении и выводе на экран переданных значений полей ввода. Этот результат нежелателен, поскольку в таблице появятся фильмы старого, а не нового жанра. По этой причине необходимо переопределить поведение по умолчанию на явное удаление этих переданных значений в методе currentGenreDropDown_processValueChange:

Пример кода 1: метод "currentGenreDropDown_processValueChange"
// Виртуальная форма "genre", участником которой является только один метод "currentGenreDropDown", была передана; необходимо убедиться в том, что в полях ввода таблицы фильмов не сохраняются переданные значения.
form1.discardSubmittedValues("update");

Участники виртуальной формы "update" (а именно, все поля ввода, находящиеся в таблице) явно игнорируют переданные значения. В результате в них отображаются собственные значения, т.е. в таблице выводятся фильмы нового, а не старого жанра.

Элемент "Form" содержит следующие методы удаления переданных значений для полей ввода, не являющихся участниками виртуальной формы:

Пример кода 2: методы для игнорирования переданных значений полей ввода, не являющихся участниками
public void discardSubmittedValues(String virtualFormName)
public void discardSubmittedValue(EditableValueHolder inputField)

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

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

Свойство internalVirtualForm

Элемент "Table" обладает свойством internalVirtualForm, которое по умолчанию имеет значение "False". В таблице, приведенной на странице Page1.jsp, для этого свойства было установлено значение "True". Это обуславливает необходимость использования виртуальной формы внутри таблицы. В результате при применении элементов управления подкачкой страниц обрабатываются только те входные данные, которые находятся внутри таблицы. Таким образом предотвращается отклонение передачи, вызванное возможными проверками и преобразованиями полей, находящихся вне таблицы.

Диалоговое окно "Virtual Forms"

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

Диалоговое окно "Virtual Forms"

Использовать это диалоговое окно довольно просто. Для изменения цвета, относящегося к виртуальной форме, щелкните цветовую ячейку и выберите цвет из списка. Для переименования виртуальной формы дважды щелкните имя ячейки и измените имя. В этом диалоговом окне также можно создавать и удалять виртуальные формы.

Диалоговое окно "Configure Virtual Forms"

В то время как диалоговое окно "Virtual Forms" позволяет создавать, удалять и переименовывать виртуальные формы, а также изменять их цветовые коды, оно не дает возможности настраивать элементы, участвующие в ней, и передавать каждую виртуальную форму. Диалоговое окно "Configure Virtual Forms" позволяет выполнять эти операции. Для вызова этого диалогового окна выберите один или несколько элементов в окне визуальном редакторе или в окне "Outline", щелкните правой кнопкой мыши и выберите пункт "Configure Virtual Forms" в контекстном меню. Появившееся диалоговое окно позволяет определять виртуальные формы, в которых участвуют выбранные элементы. Также можно указывать виртуальную форму, передаваемую выбранными элементами. Как и диалоговое окно "Virtual Forms", диалоговое окно "Configure Virtual Forms" позволяет создавать, удалять и переименовывать виртуальные формы, а также изменять их цветовые коды. На рисунке ниже представлено диалоговое окно "Configure Virtual Forms" после выбора всех элементов ввода в разделе "Add Movie" на странице Page1.jsp.

Диалоговое окно "Configure Virtual Forms"

Виртуальные формы и автоматическая передача страницы при изменении значения элемента

В то время как кнопки и элементы ссылки являются самыми распространенными элементами, элемент ввода, например, раскрывающийся список, также может быть элементом передачи. На странице Page1.jsp демонстрационного приложения "Movie Administration" раскрывающийся список Current Genre одновременно участвует в виртуальной форме "genre" и передает ее. Для его настройки использовалось диалоговое окно "Configure Virtual Forms". Однако для обеспечения фактической передачи веб-страницы при помощи раскрывающегося списка существовала необходимость в активации функции "Auto-submit On Change", выполняемая при помощи щелчка элементу правой кнопкой мыши и выбора соответствующего пункта. Следует отметить, что параметр "Auto-submit On Change" для кнопок и элементов ссылки отсутствует, поскольку они изначально передают веб-страницы.

Виртуальные формы и фрагменты страницы

В среде IDE NetBeans отсутствует поддержка виртуальных форм, находящихся внутри фрагментов страницы. Для настройки выборочной обработки элементов во фрагменте страницы устанавливается значение "True" свойства immediate для этих элементов. Этого решения достаточно для охвата целого ряда случаев использования; однако поддержка по-прежнему ограничена, поскольку возможна настройка выборочной обработки только для одной группы элементов.

Виртуальные формы и стандартный элемент "Data Table"

Несмотря на то, что этот вариант использования не является распространенным, следует отметить, что при необходимости использовать кнопку или ссылку в стандартном элементе "Data Table" (но не в новом элементе "Table") для передачи виртуальной формы необходимо добавить небольшой дополнительный сценарий к свойству onClick (или onclick) кнопки или ссылки. Предположим, что в стандартном элементе "Data Table" существует элемент "Button" со значением button1 свойства id. К свойству onClick кнопки необходимо добавить следующий код:
Пример кода 3:
common_leaveSubmitterTrace(this.form,'button1');

Без этого дополнительного сценария кнопка не сможет использоваться для передачи виртуальной формы. И снова это относится лишь к кнопкам и ссылкам (а не к элементам ввода) стандартного элемента "Data Table" (а не нового элемента "Table").

Заключение

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

  • требования к выборочной обработке в демонстрационном приложении "Movie Administration" и использование виртуальных форм в качестве мощного и комплексного решения для удовлетворения этих требований;
  • изменение настройки виртуальной формы страницы в среде IDE с помощью диалоговых окон "Virtual Forms" и "Configure Virtual Forms";
  • передача виртуальных форм элементами ввода с активированной функцией "Auto-submit On Change".
  • Виртуальные формы не изменяют жизненный цикл JavaServer Faces подобно непосредственным свойствам и поэтому проще в использовании.

Дополнительная информация



наверх

<

Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   GlassFish Community: an Open Source Application Server   Open Solaris  Open JDK: an Open SourceJDK   Mobile & Embedded Community     Sponsored by 
Sponsored by Sun Microsystems