Изучаем Java EE 7 - [178]

Шрифт
Интервал

>····{execute:'isbn title price description nbOfPage illustrations',

>·····render:'booklist'}); return false;"

>····actionListener="#{bookController.doCreateBook}" />

Когда клиент делает AJAX запрос, жизненный цикл страницы на стороне сервера остается неизменным (он проходит через те же шесть фаз). Основное преимущество состоит в том, что ответ представляет собой небольшой фрагмент данных, а не большую HTML-страницу в браузере. Фаза «Применить запрос» определяет, является ли текущий запрос «частичным запросом», и объект PartialViewContext используется на протяжении жизненного цикла страницы. Он содержит методы и свойства, которые относятся к частичной обработке запроса и частичной отрисовке ответа. В конце жизненного цикла ответ AJAX (или, строго говоря, частичный ответ) отправляется клиенту на этапе «Отрисовать ответ». Он обычно состоит из XHTML-, XML- или JSON-кода, который будет преобразован с помощью JavaScript на клиентской стороне.

JSF 2 также включает в себя декларативный подход, который удобнее и проще в использовании. В этом подходе задействуется новый тег . Вместо самостоятельного кодирования JavaScript для вызова запроса AJAX вы можете декларативно указать такое же поведение, не используя никакого кода JavaScript.

>

>····

>

В этом примере render указывает на идентификатор компонента, который мы хотим отрисовать (компонент Booklist). Атрибут execute относится ко всем компонентам, которые принадлежат форме. В табл. 11.5 показаны все возможные значения, которые могут принимать атрибуты render и execute.


Таблица 11.5. Возможные значения атрибутов render и execute
ЗначениеОписание
@allОтрисовывает или выполняет все компоненты представления
@noneНе отрисовывает и не выполняет ни одного компонента представления (применяется по умолчанию, если не задано другое значение)
@thisОтрисовывает или выполняет только этот компонент (компонент, сделавший запрос AJAX)
@formОтрисовывает или выполняет все компоненты внутри этой формы (из которой был сделан запрос AJAX)
Разделенный пробелами список идентификаторовОдин или несколько идентификаторов компонентов, которые должны быть отрисованы или выполнены
Язык выраженийВыражение, которое преобразуется в коллекцию строк

Все вместе

Теперь объединим все эти понятия и напишем веб-приложение, позволяющее пользователю создавать новую книгу, выводить все книги из базы данных и наглядно представлять характеристики книг. Это веб-приложение состоит из двух веб-страниц:

• newBook.xhtml отображает в верхней части форму, позволяя вам создавать книги, а также выводит список всех книг в нижней части. Когда вы создаете книгу и нажимаете кнопку Создать книгу, внизу обновится только список книг с помощью AJAX. При щелчке на ссылке-названии книги пользователь переходит на другую страницу и отображаются характеристики книги;

• viewBook.xhtml показывает детали этой книги (название, цену, описание и т. д.). Можно добавлять страницы в закладки, а также отображать содержание любой книги, просто изменив URL (например, viewBook.xhtml?id=123 или viewBook.xhtml?id=456).

Эти две страницы имеют один и тот же шаблон, показывающий ссылку в верхней части (чтобы вернуться к странице newBook.xhtml) и метку в нижней части. На рис. 11.8 приведены эти две страницы и различные пути навигации (либо с помощью , либо посредством ).


Рис. 11.8. Пути навигации между страницами newBook.xhtml и viewBook.xhtml


Страницы используют компоненты-подложки BookController для хранения необходимых свойств и для навигации. Воспользовавшись возможностью сохранения с помощью JPA и бизнес-логикой посредством EJB, можно подключить вместе все части (JSF, EJB, JPA, Bean Validation и CDI). Компонент-подложка делегирует всю бизнес-логику BookEJB, он содержит три метода: один сохраняет книгу в базу данных (createBook()), второй позволяет получить все книги (findAllBooks()), а третий — получить книгу по ее идентификатору (findBookById()). Этот сессионный компонент, не сохраняющий состояние, использует API менеджера сущностей для манипулирования сущностью Book (с помощью аннотаций Bean Validation).

На рис. 11.9 показаны взаимодействующие компоненты этого веб-приложения. Они упакованы в файл с расширением. war и развернуты в запущенном экземпляре GlassFish и в памяти базы данных Derby.

Это веб-приложение соответствует структуре каталогов Maven, поэтому классы, файлы и веб-страницы должны быть помещены в следующие каталоги:

• src/main/java — содержит сущность Book, BookEJB и компонент-подложку BookController;

• src/main/resources — включает файл META-INF/persistence.xml, используемый для отображения сущности в базе данных;

• src/main/webapp — содержит две веб-страницы — newBook.xhtml и viewBook.xhtml;

• src/main/webapp/WEB-INF — содержит файлы faces-config.xml и beans.xml, используемые для вызова JSF и CDI;

• pom.xml — представляет модель объектов проекта Maven (POM) с описанием проекта, его зависимостей и надстроек.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.