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

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

Когда вы просто хотите перейти со страницы на страницу, выбрав ссылку или нажав кнопку, не выполняя обработки, можно использовать компоненты пользовательского интерфейса , и :

>

Но иногда этого недостаточно, поскольку вы должны получить доступ к бизнес-уровню или базе данных для получения или обработки данных. В этом случае необходимо использовать и и их атрибут action, который позволяет выбирать методы компонента-подложки, в отличие от выбора страницы с помощью компонентов или :

>

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


Рис. 11.5. Навигация между страницами newBook.xhtml и listBooks.xhtml


Переходить между страницами просто, но это действие по-прежнему нуждается в компоненте-подложке (BookController), чтобы выполнить некоторую бизнес-логику и навигацию. Обе страницы применяют компоненты (кнопки и ссылки) для навигации и взаимодействия с компонентом-подложкой. Страница newBook.xhtml использует кнопку для вызова метода компонента-подложки doCreateBook() (). Метод doCreateBook() затем вызовет EJB для сохранения сущности Book в базе данных и возвращения строки, содержащей имя следующей страницы. После этого страница listBooks.xhtml использует обычную ссылку для того, чтобы вернуться к странице newBook.xhtml без какой-либо обработки ().

Компонент не вызывает непосредственно ту страницу, на которую нужно перейти. Он вызывает метод компонента-подложки, отвечающий за навигацию и решающий, какую страницу загрузить далее. Навигация работает согласно набору правил, которые определяют все возможные пути навигации в приложении. В коде компонента-подложки из листинга 11.10 используются простейшие правила навигации — возвращается та страница, на которую нужно перейти.


Листинг 11.10. Компонент-подложка, явно определяющий навигацию

>@Named

>@RequestScoped

>public class BookController {

>··@Inject

>··private BookEJB bookEJB;

>··private Book book = new Book();

>··private List bookList = new ArrayList<>();


>··public String doCreateBook() {

>····book = bookEJB.createBook(book);

>····bookList = bookEJB.findBooks();

>····return "listBooks.xhtml";

>··}

>··//Конструкторы, методы работы со свойствами

>}

Правила навигации

Когда компонент-подложка возвращает строку, эта строка может иметь несколько форм. В листинге 11.10 вы могли увидеть самый простой вариант — имя страницы. По умолчанию расширение файла этой страницы —.xhtml, но вы можете изменить его, если сконфигурируете FacesServlet с помощью файла web.xml, как было показано ранее.

С помощью JSF навигация по страницам может быть определена внешне в файле faces-config.xml. В нем навигация конфигурируется с помощью элемента , определяющего начальную страницу, условие и целевую страницу, на которую нужно перейти при срабатывании условия. Условие основывается на логическом имени, а не на имени страницы. Код компонента-подложки из листинга 11.10 может иметь логическое имя success, что показано в листинге 11.11.


Листинг 11.11. Фрагмент компонента-подложки, использующего логическое имя

>@Named

>@RequestScoped

>public class BookController {

>··//…

>··public String doCreateBook() {

>····book = bookEJB.createBook(book);

>····bookList = bookEJB.findBooks();

>····return "success";

>··}

>··// Конструкторы, методы работы со свойствами

>}

В листинге 11.12 показана структура файла faces-config.xml. Тег определяет страницу, на которой происходит запрос действия. В этом случае вы начинаете со страницы newBook.xhtml перед тем, как сделать вызов компонента-подложки. Если было возвращено логическое имя success (), FacesServlet перейдет к вызову страницы listBooks.xhtml ().


Листинг 11.12. Файл faces-config.xml, определяющий правила навигации

>

>

>···············xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance"

>···············xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 

>···············http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"

>···············version="2.2">

>··

>····newBook.xhtml

>····

>······success

>······listBooks.xhtml

>····

>··

>

Навигация может быть выполнена непосредственно в компонентах-подложках или с помощью файла faces-congfig.xml, но как понять, когда следует использовать тот или иной вариант? Первая причина возвращать имя страницы в компоненте-подложке — это простота. Код Java явный, и нет никаких внешних файлов XML, с которыми надо работать. Если же веб-приложению требуется активно сменять отображаемые страницы, лучше хранить правила навигации в одном месте, поскольку при внесении изменений придется поменять только один файл, а не несколько страниц. Можно также использовать комбинированный подход, храня одну часть правил навигации в компонентах-подложках, а другую — в файле faces-config.xml.


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.