Это приложение Pet Catalog объясняет веб-приложение, которое использует JSF 2.0, Java EE 6, GlassFish и MySQL. Я взял этот пример GlassFish и MySQL: Часть 2. Создание веб-приложения CRUD с сохранением данных и изменил его, чтобы использовать некоторые из новых функций JSF 2.0 и Java EE 6.
Объяснение использования JSF 2.0 и Java EE 6 в примере приложения каталога магазина
На рисунке ниже показана страница списка каталогов, которая позволяет пользователю просматривать список товаров в магазине.
JSF 2.0 Facelets XHTML вместо JSP
Для JSF 2.0 Facelets XHTML является предпочтительным способом объявления веб-страниц JSF. JSP поддерживается для обратной совместимости, но не все функции JSF 2.0 будут доступны для представлений, использующих JSP в качестве языка объявления страниц. В JSF 2.0 Facelets есть несколько приятных функций, таких как создание шаблонов (схожих по функциональности с Tiles) и составных компонентов, о которых я не буду здесь говорить, но вы можете прочитать об этом в этой статье:
http://www.ibm.com/developerworks /java/library/j-jsf2fu2/index.html и в этом техническом
совете составные компоненты пользовательского интерфейса в JSF 2.0.
Ресурсы приложения Каталог
JSF 2.0 стандартизирует способы определения веб-ресурсов. Ресурсы — это любые артефакты, которые могут понадобиться компоненту для правильной визуализации — файлы изображений, CSS или JavaScript. С JSF 2.0 вы помещаете ресурсы в каталог ресурсов или подкаталог.
На ваших страницах Facelets вы можете получить доступ к файлам css с помощью <h: outputStylesheet>, файлам javascript с помощью <h: outputScript> и изображениям с тегами JSF <h: graphicImage>. List.xhtml использует тег <h: outputStylesheet для загрузки таблицы стилей styles.css и тег <h: graphicImage для отображения изображений из ресурсов, как показано ниже:
<h:outputStylesheet name="css/styles.css" target="body"/>
<h:graphicImage library="images" name="banner_logo.gif" />
Приложение Каталог использует пакет ресурсов для хранения статического текста и сообщений об ошибках, используемых страницами Facelets. Помещение сообщений в пакет ресурсов облегчает изменение и интернационализацию текста вашего приложения. Сообщения находятся в файле свойств в каталоге пакета java.
Title=Pet Catalog
Next=Next
Previous=Prev
Name=Name
Пакет ресурсов настраивается в файле face-config.xml (вам не нужна никакая другая конфигурация в face-config.xml для JSF 2.0, как будет объяснено позже, вам больше не нужно настраивать управляемые компоненты и навигацию с XML).
<application>
<resource-bundle>
<base-name>web.WebMessages</base-name>
<var>msgs</var>
</resource-bundle>
</application>
Страница Facelets List.xhtml использует компонент dataSable JSF для отображения списка элементов каталога в HTML-таблице. Компонент dataTable полезен, когда вы хотите отобразить набор результатов в таблице. В приложении JavaServer Faces компонент UIData (суперкласс dataTable) поддерживает привязку к коллекции объектов данных. Он выполняет итерацию по каждой записи в источнике данных. В HTML DataTable
визуализации отображает данные в виде HTML — таблицы.
На веб-странице list.xhtml dataTable определен, как показано ниже: (Примечание: красные цвета — для тегов Java EE , кода аннотаций, а зеленый — для моего кода или переменных )
<h:dataTable value='#{catalog.items}' var='row' border="1"
cellpadding="2" cellspacing="0">
Атрибут value тега dataTable ссылается на данные, которые будут включены в таблицу. Атрибут var задает имя, которое используется компонентами в теге dataTable как псевдоним данных, на которые есть ссылка в атрибуте значения dataTable. В теге dataTable со страницы List .jsp атрибут value указывает на список элементов каталога. Атрибут var указывает на один элемент в этом списке. Поскольку компонент dataTable выполняет итерацию по списку, каждая ссылка на dataTableItem указывает на текущий элемент в списке.
Аннотации JSF 2.0 вместо конфигурации XML
Значение dataTable связано с items свойство каталога управляемый боб. В управляемых компонентах JSF 2.0 нет необходимости настраивать файл face-config.xml, вместо этого вы комментируете управляемые компоненты, как показано ниже:
@ManagedBean
@SessionScoped
public class Catalog implements Serializable {
По соглашению имя управляемого компонента совпадает с именем класса, причем первая буква имени класса в нижнем регистре. Чтобы указать имя управляемого компонента, вы можете использовать атрибут name аннотации ManagedBean, например: @ManagedBean (name = «Catalog»).
Этот каталогСвойство ManagedBean items определяется, как показано ниже:
private List<Item> items = null;
public List<Item> getItems() {
if (items == null) {
getPagingInfo();
items = getNextItems(pagingInfo.getBatchSize(), pagingInfo.getFirstItem());
}
return items;
}
Метод
getItems () возвращает список объектов элемента. Таблица данных JSF, поддерживает привязку данных к коллекции объектов данных. Объект dataTable моделируется как набор объектов строк, к которым можно получить доступ по индексу строк. API предоставляют механизмы для позиционирования по указанному индексу строки и для извлечения объекта, который представляет данные, которые соответствуют текущему индексу строки.
Предмет свойства
имя ,
imagethumburl и
цены
отображаются с
компонентом столбца :
<h:dataTable var="row" value="#{catalog.items}">
<h:column>
<f:facet name="header">
<h:outputText value="#{msgs.Name}"/>
</f:facet>
<h:commandLink action="#{catalog.showDetail(row)}" value="#{row.name}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{msgs.Photo}"/>
</f:facet>
<h:graphicImage library="images" name="#{row.imagethumburl}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="#{msgs.Price}"/>
</f:facet>
<h:outputText value="#{row.price}"/>
</h:column>
</h:dataTable>
В столбце метка представляет столбцы данных в DataTable компоненты. В то время как компонент dataTable выполняет итерацию по строкам данных, он обрабатывает компонент UIColumn, связанный с каждым тегом столбца для каждой строки в таблице.
Компонент dataTable просматривает список элементов (catalog.items ) и отображает Значение атрибута item ( var = » row «) . Каждый раз, когда UIData просматривает список элементов, он отображает одну ячейку в каждом столбце .
Теги dataTable и column используют фасет для представления частей таблицы, которые не повторяются или не обновляются. К ним относятся заголовки , колонтитулы и подписи.
Java EE 6: JSF 2.0, EJB 3.1 и API персистентности Java (JPA) 2.0
КаталогManagedBean аннотирует поле private ItemFacade itemFacade ; с @EJB , который вызывает вставку EJB itemFacade при установке управляемого компонента. Каталог Метод getNextItems вызывает EJB ItemFacade Stateless, который использует объект запроса EntityManager API персистентности Java для возврата списка элементов.
@ManagedBean
@SessionScoped
public class Catalog implements Serializable {
@EJB
private ItemFacade itemFacade;
public List<Item> getNextItems(int maxResults, int firstResult) {
return itemFacade.findRange(maxResults, firstResult);
}
EJB 3.1 Неинтерфейсный локальный клиент View
В EJB 3.1 локальные EJB-компоненты не должны реализовывать отдельный интерфейс, то есть все открытые методы класса компонента автоматически выставляются вызывающей стороне.
В Java EE 6 EJB-компоненты могут быть напрямую упакованы в файл WAR, как веб-компоненты.
ItemFacade EJB использует Java Persistence API EntityManager Query объект возвращает список элементов. ItemFacade EJB аннотирует поля частных EntityManager ет ; с @PersistenceContext , который заставляет менеджера сущности быть введенным, когда он установлен.
@Stateless
public class ItemFacade {
@PersistenceContext(unitName = "catalogPU")
private EntityManager em;
public List<Item> findRange(int maxResults, int firstResult) {
Query q = em.createQuery("select object(o) from Item as o");
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
return q.getResultList();
}
API-интерфейсы Java Persistence Query используются для создания и выполнения запросов, которые могут возвращать список результатов. Интерфейс JPA Query обеспечивает поддержку разбиения на страницы с помощью методов setFirstResult () и setMaxResults (): q. setMaxResults (int maxResult) устанавливает максимальное количество результатов для извлечения. кв. setFirstResult (int startPosition) устанавливает позицию первого получаемого результата. В приведенном ниже коде мы показываем класс сущности Item, который отображается в таблицу ITEM, в которой хранятся экземпляры элемента. Это типичный объект сущности Java Persistence. Есть два требования к сущности:
- аннотирование класса аннотацией @Entity .
- аннотирование идентификатора первичного ключа с помощью @Id
Поскольку имена полей, описание …. являются основными отображениями полей объекта в столбцы с одинаковыми именами в таблице базы данных, их не нужно аннотировать. Отношения O / R с адресом и продуктом также аннотированы. Для получения дополнительной информации об определении сущностей JPA см. Книгу Pro EJB 3: Java Persistence API .
@Entity
public class Item implements java.io.Serializable {
@Id
private Integer id;
private String name;
private String description;
private String imageurl;
private String imagethumburl;
private BigDecimal price;
@ManyToOne
private Address address;
@ManyToOne
private Product product;
public Item() { }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
...
}
В каталоге ManagedBean страницы через список товар s путем поддержания PagingInfo.firstItem и атрибуты PagingInfo.batchSize и передавая их в качестве параметров Метод getNextItems (firstItem, batchSize). Область действия каталога определяется с помощью аннотации @SessionScoped , JSF Managedbean с областью действия сеанса будет сохранен в сеансе, что означает, что свойства компонента останутся живыми в течение всего жизненного цикла сеанса Http.
Команда JSF commandButton используется для предоставления кнопки, на которую можно нажать для отображения следующей страницы элементов. CommandButton используется тег представить событие действия к применению.
<h:commandButton action="#{catalog.next}" value="#{msgs.Next}" />
Этот атрибут действия commandButton ссылается на метод Managed bean next () каталога, который вычисляет номер первой строки следующей страницы и возвращает логическую строку String, которая вызывает список. Страница HTML для отображения списка следующей страницы. Каталог следующий метод определен , как показано ниже:
public String next() {
if (firstItem + batchSize < itemCount()) {
firstItem += batchSize;
}
return "list";
}
JSF 2.0 Упрощенная навигация
Соглашение JavaServer Faces 2.0 NavigationHandler добавляет .xhtml к логическому результату метода действия (в этом примере списка) и загружает этот файл, в этом случае он загружает страницу списка .xhtml после возврата этого метода. Если действие не начинается с косой черты (/), JSF предполагает, что это относительный путь. Вы можете указать абсолютный путь, добавив косую черту, например, «/ items / list».
JSF commandLink используется для предоставления ссылки, по которой можно щелкнуть, чтобы отобразить страницу с деталями элемента . Этот атрибут атрибута действия commandLink ссылается на каталог Метод showDetail () :
<h:column>
<f:facet name="header">
<h:outputText value="Name"/>
</f:facet>
<h:commandLink action="#{catalog.showDetail(row)}" value="#{row.name}"/>
</h:column>
С JSF 2.0 теперь вы можете указывать параметры в выражениях методов. Таблица данных объект строки, связанный с выбраннымссылка передается в качестве параметра в Выражение метода «# { catalog. showDetail (row) }».
Каталог showDetail () метод получает запись данных из входного параметра и возвращает строку , которая вызывает подробно .xhtml страницы для отображения сведений об элементе:
public String showDetail(Item item) {
this.item = item;
return "detail";
}
JavaServer Faces NavigationHandler добавляет .xhtml к логическому результату действия, детализирует и загружает этот файл. В этом случае, JavaServer Faces загружает реализацию на подробно .xhtml страницы после того, как этот метод возвращает.
Detail.xhtml использует компонент outputText для отображения свойств элемента каталога ManagedBean :
<h:outputText value="#{catalog.item.name}" title="Name" />
<h:outputText value="#{catalog.item.description}" title="Description"/>
<h:graphicImage library="images" name="#{catalog.item.imageurl}" title="Imageurl" />
<h:outputText value="#{catalog.item.price}" title="Price" />
<h:outputText value="#{catalog.item.address.city}" title="Address" />
<h:outputText value="#{catalog.item.contactinfo.email}" title="Address"/>
GlassFish v3 — это легкий сервер
- OSGi основе; Встроенный API; RESTful Admin API; Легкий и быстрый запуск;
- Итеративный цикл разработки «Редактировать-сохранить-обновить браузер»:
- Инкрементная компиляция всех артефактов JSF 2.0 при сохранении.
- Автоматическое развертывание всех веб-артефактов или артефактов Java EE 6
- Сохранение сеансов: поддержка сеансов при повторном развертывании
Вывод
На этом завершается пример приложения, которое демонстрирует веб-приложение каталога домашних животных, в котором используются Java EE 6, GlassFish v3 и MySQL.
,
Запуск примера приложения
- Загрузите и установите среду IDE NetBeans 6.8 M1 с GlassFish v3 b57 (предварительный просмотр Glassfish v3 — предварительный просмотр Java EE 6) и MySQL Community Server .
- Следуйте этим инструкциям, чтобы настроить jdbc-драйвер для MySQL . (Обычно это уже настроено на Glassfish, но я получил сообщение об ошибке с Glassfish v3 b57, что оно отсутствует)
- Загрузите образец кода. Распакуйте файл catalog.zip, который вы скачали, это создаст каталог каталога с кодом проекта.
Создайте базу данных каталога домашних животных
Чтобы запустить пример кода, сначала необходимо создать базу данных каталога домашних животных и заполнить таблицу предметов.
- Запустите среду IDE NetBeans
- Убедитесь, что GlassFish зарегистрирован в IDE NetBeans следующим образом:
- Перейдите на вкладку «Службы» в среде IDE NetBeans.
- Разверните узел Серверы. Вы должны увидеть GlassFish v2 в списке серверов. Если нет , зарегистрируйте GlassFish v2 следующим образом:
- Щелкните правой кнопкой мыши узел «Серверы» и выберите «Добавить сервер». Откроется мастер добавления экземпляра сервера.
- Выберите GlassFish v2 в списке серверов мастера и нажмите кнопку «Далее».
- Введите информацию о местоположении для сервера и нажмите кнопку Далее.
- Введите имя администратора и пароль и нажмите кнопку Готово.
- Запустите базу данных MySQL или Java DB следующим образом:
- Перейдите на вкладку «Службы» в среде IDE NetBeans.
- Разверните узел баз данных. Вы должны увидеть базу данных Java DB в списке баз данных. Если вы установили базу данных сервера MySQL, вы также должны увидеть базу данных MySQL в списке баз данных. Примечание: Java DB поставляется в комплекте с Netbeans, вы можете загрузить MySQL отдельно.
- Щелкните правой кнопкой мыши базу данных Java DB или MySQL и выберите Start.
- Если вы установили MySQL, установите свойства базы данных сервера MySQL следующим образом:
- Щелкните правой кнопкой мыши базу данных сервера MySQL и выберите «Свойства». Это открывает диалоговое окно MySQL Server Properties, как показано на рисунке 8 .
Рисунок 8. Основные свойства MySQL Server - На вкладке Основные свойства введите имя хоста сервера и номер порта. В среде IDE в качестве имени хоста сервера по умолчанию указывается localhost, а в качестве номера порта сервера по умолчанию — 3306.
- Введите имя пользователя администратора, если оно не отображается, и пароль администратора — пароль администратора по умолчанию пуст.
- Нажмите вкладку Свойства администратора.
- Введите соответствующий путь в поле «Путь / URL к инструменту администратора». Вы можете найти путь, перейдя к местоположению приложения администрирования MySQL, такого как MySQL Admin Tool.
- Введите соответствующий путь в команде Путь к запуску. Вы можете найти путь, перейдя к расположению команды запуска MySQL. Чтобы найти команду запуска, найдите mysqld в папке bin установочного каталога MySQL.
- Введите соответствующий путь в поле «Путь к остановке». Вы можете найти путь, перейдя к расположению команды остановки MySQL. Обычно это путь к mysqladmin в папке bin установочного каталога MySQL. Если команда mysqladmin, в поле Аргументы введите -u root stop, чтобы предоставить root-права для остановки сервера. Вкладка Admin Properties должна выглядеть примерно так, как показано на рисунке 9 .
Рисунок 9. Свойства администрирования MySQL Server - Нажмите кнопку ОК.
- Щелкните правой кнопкой мыши базу данных сервера MySQL и выберите «Свойства». Это открывает диалоговое окно MySQL Server Properties, как показано на рисунке 8 .
- Щелкните правой кнопкой мыши по серверу MySQL или базе данных Java DB и выберите Start.
- Создайте базу данных petcatalog следующим образом:
- Щелкните правой кнопкой мыши базу данных Java DB или MySQL и выберите Create Database. Откроется окно создания базы данных.
- Введите каталог имен баз данных для Java DB или petcatalog для MySQL.
Для базы данных Java введите приложение- пароль пользователя , как показано ниже:
Нажмите OK, чтобы принять отображаемые настройки.
- Создайте таблицы в базе данных каталога следующим образом:
- Под базами данных вы должны увидеть соединение с базой данных для базы данных petcatalog. Например, MySQL:
или Java DB:
- Щелкните правой кнопкой мыши на petcatalog соединение и выберите Connect.
- Щелкните правой кнопкой мыши по petcatalog соединению и выберите Execute Command. Это откроет окно команд SQL.
- Скопируйте содержимое файла catalog.sql в каталог каталога и вставьте его в командное окно SQL, как показано ниже:
- Щелкните значок «Выполнить SQL» (Ctrl + Shift + E) над окном команд SQL.
- Примечание: Это нормально , чтобы увидеть это: « Код ошибки -1 , SQL состояния 42Y55:.„DROP TABLE“не может быть выполнена на„ITEM“ , потому что не существует линия 2, колонка 1». Это просто означает, что вы удаляете несуществующую таблицу. Если вам нужно удалить и воссоздать таблицы, вы не увидите это сообщение во второй раз.
- Под базами данных вы должны увидеть соединение с базой данных для базы данных petcatalog. Например, MySQL:
- Просмотрите данные в таблице элементов базы данных каталога домашних животных следующим образом:
- Под базами данных вы должны увидеть соединение с базой данных для базы данных petcatalog. Например, MySQL:
или Java DB:
- Если соединение с базой данных разорвано, как показано на следующей диаграмме:
- Щелкните правой кнопкой мыши на petcatalog соединение и выберите Connect. как показано ниже:
- если запрашивается пароль, для MySQL оставьте поле пустым, для JavaDB введите пароль пользователя app app.
- Щелкните правой кнопкой мыши на petcatalog соединение и выберите Connect. как показано ниже:
- Разверните узел Таблицы под базой данных petcatalog в окне Службы. Вы должны увидеть таблицу элементов под узлом Таблицы. Вы можете развернуть узел таблицы элементов, чтобы увидеть столбцы таблицы, индексы и любые внешние ключи, как показано ниже:
Рисунок 12. Узел расширенной таблицыВы можете просмотреть содержимое таблицы или столбца, щелкнув правой кнопкой мыши таблицу или столбец и выбрав Просмотр данных, как показано ниже:
Рисунок 13. Просмотр содержимого таблицы
- Под базами данных вы должны увидеть соединение с базой данных для базы данных petcatalog. Например, MySQL:
- Следуйте этим инструкциям для создания пула соединений JDBC и ресурса JDBC. Назовите пул mysql_petcatalog_rootPool и ресурс jndi jdbc / petcatalog. Примечание: вам не нужно создавать пул и ресурс JDBC-соединений, если вы используете мастер Netbeans для создания сущностей JPA из таблиц базы данных, как описано в этой статье GlassFish и MySQL, часть 2: создание веб-приложения CRUD с сохранением данных.
- Откройте файл catalog / setup / sun-resources.xml и убедитесь, что указанные им свойства совпадают со значениями базы данных petcatalog и ресурсов jdbc, которые вы создали. При необходимости измените значения свойств.
Запуск примера решения:
Если вы хотите запустить пример решения, сначала необходимо создать таблицы базы данных каталога, как описано выше.
- Откройте каталог проекта следующим образом:
- В IDE NetBeans выберите «Открыть проект» в меню «Файл». Откроется диалоговое окно «Открыть проект».
- Перейдите в диалоговом окне «Открыть проект» в каталог каталога и нажмите кнопку «Открыть проект».
В ответ IDE открывает каталог проекта. Вы можете просмотреть логическую структуру проекта в окне Projects (Ctrl-1). - Запустите каталог, щелкнув правой кнопкой мыши по проекту каталога в окне «Проекты» и выбрав «Запустить проект». Среда IDE NetBeans компилирует приложение, развертывает его на Glassfish и открывает страницу по умолчанию в вашем браузере. (по адресу http: // localhost: 8080 / catalogue /).
Для получения дополнительной информации см. Следующие ресурсы:
- Выборка из EJB 3.1
- Технологии Java EE 6
- JSF 2.0 Домашняя страница Проект Мохарра
- SDN JavaServer Faces Page
- JSF 2 fu: Часть 1. Оптимизация разработки веб-приложений
- Составные компоненты пользовательского интерфейса в JSF 2.0
- Creating Your First Java EE 6 Application
- Roger Kitain’s Blog (co-spec lead for JSF 2.0)
- Ed Burns’s Blog (co-spec lead for JSF 2.0)
- Cay Horstmann’s Blog: JSF 2.0 specifying parameters in method expressions
- JavaServer Faces 2.0 Ref Card
- Jim Driscoll’s Blog
- Top reasons why GlassFish v3 is a lightweight server
- What You Can Expect From GlassFish v3
- Beginning Java™ EE 6 Platform with GlassFish™ 3: From Novice to Professional Book