Изучаем Java EE 7 - [171]
>@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. Страница, отображающая сообщение для компонентов пользовательского интерфейса
Страница будет иметь текстовое поле ввода с идентификатором (id="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.
>@Named
>@Stateless
>public class BookEJB {
>··@Inject
>··private EntityManager em;
>··public List
>····return em.createNamedQuery("findAllBooks", Book.class). getResultList();
>··}
>}
Метод findAllBooks() в листинге 11.9 возвращает список книг. Чтобы заполнить таблицу базы данных этим списком, не нужно использовать компонент-подложку. Страницы могут непосредственно вызывать метод bookEJB.findAllBooks() в компоненте
>
>··
>····
>··
>
Навигация
Веб-приложения состоят из нескольких страниц, по которым необходимо переходить. В зависимости от приложения вы можете иметь различные уровни навигации потоков страниц, которые являются более или менее сложными. Вы можете думать о мастерах, где реально вернуться к предыдущей или начальной странице, бизнес-кейсах, где вы переходите на определенную страницу в зависимости от правила, и т. д. JSF имеет несколько способов навигации и позволяет контролировать поток, основываясь на одной странице, а также глобально для всего приложения.
Явная навигация
В JSF вы можете легко перейти на страницу, если знаете ее имя. Вам просто нужно явно задать имя страницы либо в методе компонента-подложки, либо на странице JSF. FacesServlet, выступая в качестве контроллера, сделает все остальное: перехватит вызов, получит страницу по ее названию, привяжет значения к компонентам и отрисует страницу для пользователя. При явной навигации вы можете выбрать между мгновенным переходом на страницу и выполнением некоторых действий перед переходом.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.