Изучаем Java EE 7 - [179]
Рис. 11.9. Страницы и классы веб-приложения
Написание сущности Book
Я не буду вдаваться в излишние подробности, говоря о листинге 11.15, поскольку вы сразу поймете код сущности Book. Помимо преобразования JPA и аннотаций Bean Validation, обратите внимание на именованный запрос findAllBooks, который извлекает из базы данные, отсортированные по названию.
>@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 не нуждается в дескрипторе развертывания.
>@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
>····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 и сохранен в базе данных.
>@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, шаблон имеет заголовок, верхний колонтитул с тегом
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.