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

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


Листинг 11.8. Добавление сообщений различной степени тяжести

>@Named

>@RequestScoped

>public class BookController {

>··@Inject

>··private BookEJB bookEJB;

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


>··public String doCreateBook() {

>····FacesContext ctx = FacesContext.getCurrentInstance();


>····if (book.getIsbn() == null || "".equals(book.getIsbn())) {

>······ctx.addMessage("bookForm: isbn", 

>······new FacesMessage(FacesMessage.SEVERITY_WARN, 

>········"Неверный ISBN", "Вы должны ввести ISBN"));

>····}

>····if (book.getTitle() == null || "".equals(book.getTitle())) {

>······ctx.addMessage("bookForm: title", 

>······new FacesMessage(FacesMessage.SEVERITY_WARN, 

>·······"Неверное название", "Вы должны ввести название книги"));

>····}


>····if (ctx.getMessageList(). size()!= 0)

>······return null;


>····try {

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

>······ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, 

>········"Книга создана", "Книга" + book.getTitle() + " была создана 

>·········with id=" + book.getId()));


>····} catch (Exception e) {

>······ctx.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 

>········"Книга не может быть создана", e.getMessage()));

>····}

>····return null;

>··}

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

>}

На этой странице доступны FacesContext и FacesMessage. Страница может затем отобразить глобальные сообщения (чье значение clientId равно null) с помощью одного тега . Когда мы хотим отобразить сообщение в определенном месте на странице для конкретного компонента (как это обычно бывает в случае проверки или ошибки преобразования), мы используем . На рис. 11.4 показана страница с сообщениями, предназначенными непосредственно для полей ISBN и title.


Рис. 11.4. Страница, отображающая сообщение для компонентов пользовательского интерфейса


Страница будет иметь текстовое поле ввода с идентификатором (id="isbn"), а тег будет ссылаться на этот компонент (for="ISBN"). В результате конкретное сообщение будет отображаться только для этого компонента.

>

>··errorStyle="color: red"/>

>

>··

>··

>

Если поле ISBN не заполнено, рядом с текстовым полем ввода ISBN появится предупреждающее сообщение. JSF использует этот механизм обмена сообщениями для преобразователей, валидаторов и Bean Validation. Обратите внимание, что тег может иметь разные стили в зависимости от степени тяжести (здесь ошибки выделяются красным цветом, а предупреждения — оранжевым).

Объединение JSF и EJB

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

Одна из целей CDI — сведение компонентов JSF и EJB. Что вам нужно делать? Не так много: просто добавьте аннотацию @Named к вашему EJB, и вы сможете вызвать его благодаря языку выражений. В листинге 11.9 показан EJB, не сохраняющий состояния, который использует JPA, чтобы получить список всех книг из базы данных. Он имеет аннотацию CDI @Named и, следовательно, может быть вызван на странице JSF.


Листинг 11.9. EJB, не сохраняющий состояния, с CDI-аннотацией @Named

>@Named

>@Stateless

>public class BookEJB {

>··@Inject

>··private EntityManager em;

>··public List findAllBooks() {

>····return em.createNamedQuery("findAllBooks", Book.class). getResultList();

>··}

>}

Метод findAllBooks() в листинге 11.9 возвращает список книг. Чтобы заполнить таблицу базы данных этим списком, не нужно использовать компонент-подложку. Страницы могут непосредственно вызывать метод bookEJB.findAllBooks() в компоненте с помощью EL.

>

>··

>····

>··

>

Навигация

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

Явная навигация

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


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