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

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


Рис. 11.9. Страницы и классы веб-приложения

Написание сущности Book

Я не буду вдаваться в излишние подробности, говоря о листинге 11.15, поскольку вы сразу поймете код сущности Book. Помимо преобразования JPA и аннотаций Bean Validation, обратите внимание на именованный запрос findAllBooks, который извлекает из базы данные, отсортированные по названию.


Листинг 11.15. Сущность Book, содержащая именованный запрос и аннотацию Bean Validation

>@Entity

>@NamedQuery(name = "findAllBooks", query = "SELECT b FROM Book b

>············ORDER BY b.title DESC")

>public class Book {

>··@Id @GeneratedValue

>··private Long id;

>··@NotNull @Size(min = 4, max = 50)

>··@Column(nullable = false)

>··private String title;

>··private Float price;

>··@Column(length = 2000)

>··private String description;

>··private Integer nbOfPage;

>··private Boolean illustrations;

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

>}

Как вы знаете, эта сущность также должна содержать файл persistence.xml, но ради простоты я не буду приводить его здесь (см. главу 4).

Написание BookEJB

В листинге 11.16 содержится сессионный компонент, который создает представление без интерфейса. Это означает, что клиент (то есть компонент-подложка) не нуждается в интерфейсе (локальном или удаленном) и может непосредственно ссылаться на EJB. В этот EJB будет внедрена ссылка на менеджер сущностей с помощью аннотации @Inject. Для этого ей нужен CDI DatabaseProducer, похожий на тот, что был показан в листинге 8.13 (не приводится здесь, см. главу 8). С помощью этого менеджера сущностей сохраняется сущность Book (метод createBook()), запрашиваются все книги из базы данных (по именованному запросу findAllBooks) и выполняется поиск книги по ее идентификатору. Обратите внимание, что EJB имеет аннотацию @Named, поэтому он может быть вызван со страницы JSF (подробнее об этом — далее) и определяет источник данных с помощью аннотации @DataSourceDefinition. Этот EJB не нуждается в дескрипторе развертывания.


Листинг 11.16. EJB, не сохраняющий свое состояние, который создает и получает книги

>@Named

>@Stateless

>@DataSourceDefinition(name = "java: global/jdbc/lab11DS",

>········className = "org.apache.derby.jdbc.EmbeddedDriver",

>········url = "jdbc: derby: memory: lab11DB;create=true;user=app;password=app"

>)

>public class BookEJB {

>··@Inject

>··private EntityManager em;


>··public Book createBook(Book book) {

>····em.persist(book);

>····return book;

>··}


>··public List findAllBooks() {

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

>··}


>··public Book findBookById(Long id) {

>····return em.find(Book.class, id);

>··}

>}

Написание компонента-подложки BookController

Одна из обязанностей компонента-подложки — взаимодействие с другими уровнями приложения (например, слоем EJB) или выполнение проверки. BookController в листинге 11.17 содержит аннотацию @Named, поэтому может быть использован на страницах JSF. Вторая аннотация — @RequestScoped — определяет продолжительность жизни компонента. Он существует в течение всего срока существования запроса.

Компонент-подложка содержит один атрибут book, который станет использоваться на страницах. Это объект, который будет преобразован на представлении (странице newBook.xhtml), отображен в viewBook.xhtml и сохранен в базе данных.


Листинг 11.17. Компонент-подложка BookController, вызывающий EJB

>@Named

>@RequestScoped

>public class BookController {

>··@Inject

>··private BookEJB bookEJB;

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


>··public String doCreateBook() {

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

>····FacesContext.getCurrentInstance(). addMessage(null,

>······new FacesMessage(FacesMessage.SEVERITY_INFO, "Book created",

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

>····return "newBook.xhtml";

>··}


>··public void doFindBookById() {

>····book = bookEJB.findBookById(book.getId());

>··}

>··// Методы работы со свойствами

>}

Вся бизнес-логика (создание и получение книг) осуществляется через компонент-подложку BookEJB. В него внедряется ссылка на EJB с помощью аннотации @Inject. Он имеет два метода, которые будут вызываться страницами.

• doCreateBook() — позволяет создавать книги благодаря вызову EJB, не сохраняющего состояние, и передаче атрибута Book. Если сохранение прошло успешно, то на странице будут отображены информационные сообщения. Далее метод возвращает имя страницы, на которую нужно перейти.

• doFindBookById() — используется страницей viewBook.xhtml для извлечения книги по ее идентификатору с применением EJB, не сохраняющего состояние.

В листинге 11.17 показан компонент-подложка BookController. Все методы работы со свойствами в этом фрагменте кода опущены для удобства чтения, но необходимы для атрибута book.

Написание шаблона layout.xhtml

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


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