Статьи

Каталог домашних животных Java EE 6 со GlassFish и MySQL

Это приложение 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. Есть два требования к сущности:

  1. аннотирование класса аннотацией @Entity .
  2. аннотирование идентификатора первичного ключа с помощью @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.
,

Запуск примера приложения

  1. Загрузите и установите  среду IDE NetBeans 6.8 M1 с GlassFish v3 b57 (предварительный просмотр Glassfish v3 — предварительный просмотр Java EE 6) и MySQL Community Server .
  2. Следуйте этим инструкциям, чтобы настроить  jdbc-драйвер для MySQL . (Обычно это уже настроено на Glassfish, но я получил сообщение об ошибке с Glassfish v3 b57, что оно отсутствует)
  3. Загрузите образец кода. Распакуйте файл catalog.zip, который вы скачали, это создаст каталог каталога с кодом проекта.

Создайте базу данных каталога домашних животных

Чтобы запустить пример кода, сначала необходимо создать базу данных каталога домашних животных и заполнить таблицу предметов.

  1. Запустите среду IDE NetBeans
  2. Убедитесь, что GlassFish зарегистрирован в IDE NetBeans следующим образом:

    • Перейдите на вкладку «Службы» в среде IDE NetBeans.
    • Разверните узел Серверы. Вы должны увидеть GlassFish v2 в списке серверов. Если нет , зарегистрируйте GlassFish v2 следующим образом:

      • Щелкните правой кнопкой мыши узел «Серверы» и выберите «Добавить сервер». Откроется мастер добавления экземпляра сервера.
      • Выберите GlassFish v2 в списке серверов мастера и нажмите кнопку «Далее».
      • Введите информацию о местоположении для сервера и нажмите кнопку Далее.
      • Введите имя администратора и пароль и нажмите кнопку Готово.
  3. Запустите базу данных MySQL или Java DB следующим образом:

    • Перейдите на вкладку «Службы» в среде IDE NetBeans.
    • Разверните узел баз данных. Вы должны увидеть базу данных Java DB в списке баз данных. Если вы установили базу данных сервера MySQL, вы также должны увидеть базу данных MySQL в списке баз данных. Примечание: Java DB поставляется в комплекте с Netbeans, вы можете  загрузить MySQL отдельно.

    • Щелкните правой кнопкой мыши базу данных Java DB или MySQL и выберите Start.
  4. Если вы установили MySQL, установите свойства базы данных сервера MySQL следующим образом:

  5. Щелкните правой кнопкой мыши по серверу MySQL или базе данных Java DB и выберите Start.
  6. Создайте базу данных petcatalog следующим образом:

    • Щелкните правой кнопкой мыши базу данных Java DB или MySQL и выберите Create Database. Откроется окно создания базы данных.
    • Введите каталог имен баз данных для Java DB или petcatalog для MySQL.

      Для базы данных Java введите приложение- пароль пользователя , как показано ниже:


       Нажмите OK, чтобы принять отображаемые настройки.

  7. Создайте таблицы в базе данных каталога следующим образом:

  8. Просмотрите данные в таблице элементов базы данных каталога домашних животных следующим образом:
  9. Следуйте этим инструкциям для создания пула соединений JDBC и ресурса JDBC. Назовите пул mysql_petcatalog_rootPool и ресурс jndi jdbc / petcatalog. Примечание: вам не нужно создавать пул и ресурс JDBC-соединений, если вы используете мастер Netbeans для создания сущностей JPA из таблиц базы данных, как описано в этой статье GlassFish и MySQL, часть 2: создание веб-приложения CRUD с сохранением данных.
  10. Откройте файл catalog / setup / sun-resources.xml и убедитесь, что указанные им свойства совпадают со значениями базы данных petcatalog и ресурсов jdbc, которые вы создали. При необходимости измените значения свойств.

Запуск примера решения:

Если вы хотите запустить пример решения, сначала необходимо создать таблицы базы данных каталога, как описано выше.

  1. Откройте каталог проекта следующим образом:

    • В IDE NetBeans выберите «Открыть проект» в меню «Файл». Откроется диалоговое окно «Открыть проект».
    • Перейдите в диалоговом окне «Открыть проект» в каталог каталога и нажмите кнопку «Открыть проект».


    В ответ IDE открывает каталог проекта. Вы можете просмотреть логическую структуру проекта в окне Projects (Ctrl-1).

  2. Запустите каталог, щелкнув правой кнопкой мыши по проекту каталога в окне «Проекты» и выбрав «Запустить проект». Среда IDE NetBeans компилирует приложение, развертывает его на Glassfish и открывает страницу по умолчанию в вашем браузере. (по адресу http: // localhost: 8080 / catalogue /).

Для получения дополнительной информации см. Следующие ресурсы: