Статьи

Wicket, JPA, GlassFish и Java Derby или MySQL

Это приложение Pet Catalog объясняет веб-приложение, которое использует Wicket, JPA, GlassFish и MySQL. Я взял этот пример  JSF 2.0, JPA, GlassFish и MySQL   и изменил его, чтобы использовать Wicket вместо JSF. 

Объяснение использования Wicket, Java Persistence API, Glassfish и MySQL в примере приложения из каталога магазина

На рисунке ниже показана страница списка каталогов, которая позволяет пользователю просматривать список товаров в магазине.


Каркас калитки

Wicket Web Framework обеспечивает программно -ориентированное манипулирование компонентами HTML-разметки . Диаграмма ниже показывает, как Wicket Framework вписывается в шаблон проектирования MVC.

Контроллер компонентов Wicket получает пользовательский ввод. Компонент использует пользовательский ввод для взаимодействия с моделью, для обработки навигации по страницам и событиям. Модель предоставляет компоненты с интерфейсом для данных домена. В представлении «Компонент» отображаются элементы HTML интерфейса пользователя. Части контроллера и вида объединены в Компонент в Wicket.

Калитка триада шаблонов, компонентов и модели HTML

Компонент Wicket, модель и шаблон HTML работают вместе. Шаблон HTML определяет статические части страниц, компоненты заполняют динамические части, а модели используются компонентами для получения данных домена для динамических частей. Wicket сопоставляет теги wicket: id с компонентами. Модели представляют собой ссылку на данные для компонентов Java.

HTML-шаблоны калитки

Шаблоны калитки написаны в формате обычного HTML и могут использоваться стандартными редакторами HTML. Wicket использует стандарты пространства имен HTML для расширения HTML с помощью заполнителей, где подключаются компоненты Wicket, так что пользовательский синтаксис вообще отсутствует. Wicket соответствует атрибутам wicket: id и присоединяет компоненты Java к тегам, в которых определены эти атрибуты.

Веб-страницы Wicket — это все классы Java, которые отображаются в шаблон HTML с тем же именем, что и класс Java.

Файл ListPage.html содержит разметку для ListPage.java. Wicket сопоставляет экземпляр страницы Java и файл шаблона HTML с тем же именем в том же пакете Java.

<table>
<tr>
<th> Name </th>
<th> Photo</th>
<th> Price </th>
</tr>
<tr wicket:id="rows" >
<td>
<a wicket:id="details" href="#">
<span wicket:id="name">name</span>
</a>
</td>
<td> <img wicket:id="photo"/></td>
<td><span wicket:id="price"></span></td>

</tr>
</table>
<span wicket:id="pager">navigation controls here</span>

 Страницы — это специальные компоненты верхнего уровня, которые содержат корень для деревьев компонентов. Ниже приведено дерево компонентов для ListPage выше:

Калитка Компоненты

Wicket сопоставляет атрибут wicket: id = «rows» в ListPage.html с соответствующим Java-компонентом в ListPage.java, который является DataViewComponent с моделью DataProvider, как показано на диаграмме ниже.

Соответствующий код ListPage.java показан ниже:

 

public class ListPage extends WebPage {

// create the Model DataProvider
IDataProvider itemDataProvider = new IDataProvider<Item>() {

public Iterator iterator(int first, int count) {
return itemController.findItemEntities(count, first).iterator();
}
public int size() {
return itemController.getItemCount();
}
public IModel model(final Item object) {
return new LoadableDetachableModel() {
@Override
protected Item load() {
return (Item) object;
}
};
}
public void detach() {
}
};

// create the DataView component corresponding to the wicketid "rows" attribute in ListPage.html
DataView dataView = new DataView<Item>("rows", itemDataProvider, ROWS_PER_PAGE) {

@Override
protected void populateItem(org.apache.wicket.markup.repeater.Item<Item> repItem) {
Item item = (Item) repItem.getModelObject();
repItem.setModel(new CompoundPropertyModel<Item>(item));
repItem.add(ItemDetails.link("details", item));
repItem.add(new Image("photo", new ResourceReference(this.getClass(), item.getImagethumburl())));
repItem.add(new Label("price"));

}
};
// add the DataView component to the page
add(dataView);
// create the PagingNavigator component corresponding to the "pager" attribute in ListPage.html
PagingNavigator pager = new PagingNavigator("pager", dataView);
add(pager);

DataView — это компонент, который упрощает заполнение Wicket RepeatingView из базы данных, используя IDataProvider в качестве интерфейса между базой данных и представлением данных. Wicket RepeatingView визуализирует добавленные к нему компоненты из данных из коллекции объектов.

Экземпляр DataView передает в конструктор идентификатор калитки » rows «, itemDataProvider и количество строк для подкачки и анонимно переопределяет метод populateItem (), который будет вызываться для каждого объекта Item, предоставленного itemDataProvider.  PopulateItem метод добавляет дочерние элементы (ссылки, изображения, этикетки) с пунктом модели к DataView.

ItemDataProvider IDataProvider предоставляет данные элемента каталога домашних животных в DataView. Метод итератора IDataProvider (int first, int count) получает итератор для подмножества общих данных. Метод итератора itemDataProvider
вызывает itemController.findItemEntities, который использует JPA для запроса к базе данных и возврата списка сущностей Item. Метод
модели itemDataProvider — это функция
обратного вызова, используемая потребителем этого поставщика данных для обертывания объектов, извлеченных из итератора (int, int), в модель (обычно съемную).

Использование Java Persistence API (JPA) с Wicket

Метод ItemJpaController findItemEntities определен, как показано ниже:

public class ItemJpaController {

public ItemJpaController() {
emf = Persistence.createEntityManagerFactory("wicketCatalogPU");
}
private EntityManagerFactory emf = null;

public EntityManager getEntityManager() {
return emf.createEntityManager();
}
private List<Item> findItemEntities(boolean all, int maxResults, int firstResult) {
EntityManager em = getEntityManager();
try {
Query q = em.createNamedQuery("Item.findAll");
if (!all) {
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
}
return q.getResultList();
} finally {
em.close();
}
}



ItemJpaController использует Java Persistence API
EntityManager Query объект возвращает список элементов.
ItemJpaController называет
Persistence.createEntityManagerFactory , который получает
EntityManagerFactory   когда он instatiated. 

API-интерфейсы Java Persistence Query используются для создания и выполнения запросов, которые могут возвращать список результатов. Интерфейс JPA Query обеспечивает поддержку разбиения на страницы с помощью методов setFirstResult () и setMaxResults (): q. setMaxResults (int maxResult) устанавливает максимальное количество результатов для извлечения. кв. setFirstResult (int startPosition) устанавливает позицию первого получаемого результата.

В приведенном ниже коде мы показываем класс сущности Item, который отображается в таблицу ITEM, в которой хранятся экземпляры элемента. Это типичный объект сущности Java Persistence. Есть два требования к сущности:

  1. аннотирование класса аннотацией @Entity .
  2. аннотирование идентификатора первичного ключа с помощью @Id

Поскольку имена полей, описание …. являются основными отображениями полей объекта в столбцы с одинаковыми именами в таблице базы данных, их не нужно аннотировать.

@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;


public Item() { }

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

...
}

Компонент Wicket PagingNavigator используется для предоставления навигационных ссылок на следующую, предыдущую, первую и последнюю страницы элементов каталога. Компонент PagingNavigator поддерживает полный навигатор страниц, предназначенный для простого добавления в любой PageableListView.

<span wicket:id="pager">navigation controls here</span>

Код ниже для добавления создания PagingNavigator для dataView и добавления его в ListPage:

public class ListPage extends WebPage {


PagingNavigator pager = new PagingNavigator("pager", dataView);
add(pager);

Компонент Wicket Link используется для предоставления ссылки, по которой можно перейти, чтобы перейти на страницу с деталями выбранного элемента .

  <a wicket:id="details" href="#">
<span wicket:id="name" >name</span>
</a>

Код ниже показывает вызов ItemDetails. Метод ссылки для создания и добавления ссылки:

public class ListPage extends WebPage {
// create the DataView component corresponding to the wicketid "rows" attribute in ListPage.html
DataView dataView = new DataView<Item>("rows", itemDataProvider, ROWS_PER_PAGE) {
@Override
protected void populateItem(org.apache.wicket.markup.repeater.Item<Item> repItem) {
' ...
// call ItemDetails to create the link component
repItem.add(ItemDetails.link("details", item));
...

}
};
// add the DataView component to the page
add(dataView);


Приведенный ниже код для создания BookmarkablePageLink для добавления в dataView. Если щелкнуть эту ссылку, перейдите на страницу ItemDetails , передав выбранный Itemid в качестве параметра.

public class ItemDetails extends BasePage {

public static BookmarkablePageLink<Void> link(final String name, final Item item) {

final BookmarkablePageLink<Void> link = new BookmarkablePageLink<Void>(name, ItemDetails.class);

if (item != null) {
link.setParameter("itemid", item.getItemid());
link.add(new Label("name", new Model<Item>(item)));
}

return link;
}

Страница ItemDetails, показанная ниже, отображает подробную информацию о выбранном элементе каталога:

<html xmlns:wicket="http://wicket.apache.org/">
<head>
<title></title>
<link wicket:id='stylesheet'/>
</head>
<body>
<span wicket:id='mainNavigation'/>
<table>
<tr>
<td align="right">Name:</td>
<td>
<span wicket:id="name">name </span>
</td>
</tr>
<tr>
<td align="right">Description:</td>
<td> <span wicket:id = "description">
description
</span>
</td>
</tr>
<tr>
<td align="right">Photo:</td>
<td> <img wicket:id="imagethumburl"/> </td>
</tr>
</table>
</body>
</html>

Конструктор
ItemDetails получает
данные
элемента и добавляет метки и изображение для имени, описания и фотографии на
страницу
ItemDetails .

public class ItemDetails extends BasePage {

public ItemDetails(PageParameters params) {
Item item = itemController.findItem(params.getString("itemid"));
add(new Label("name", item.getName()));
add(new Label("description", item.getDescription()));
add(new Image("imagethumburl", new ResourceReference(this.getClass(),item.getImageurl())));
}
 

Горячее развертывание с калиткой и Glassfish

  • Инкрементная компиляция всех артефактов Wicket при сохранении.
  • Автоматическое развертывание всех веб-артефактов

Вывод

На этом завершается пример приложения, которое демонстрирует веб-приложение каталога домашних животных, в котором используются Wicket, JPA, GlassFish и MySQL.

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

  1. Если вы еще этого не сделали, загрузите и установите среду IDE NetBeans , GlassFish и MySQL Community Server . Вы можете загрузить и установить GlassFish с NetBeans в виде одного пакета .
  2. Следуйте этим инструкциям для настройки Netbeans с помощью плагина Wicket.
  3. Загрузите образец кода.

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

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

  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 с сохранением данных.

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

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

  1. Если вы еще не загрузили пример кода и запустите IDE NetBeans. Распакуйте файл catalog.zip, который вы скачали, это создаст каталог каталога с кодом проекта.
  2. Откройте файл catalog / setup / sun-resources.xml и убедитесь, что указанные им свойства совпадают со значениями базы данных petcatalog и ресурсов jdbc, которые вы создали. При необходимости измените значения свойств.
  3. Откройте каталог проекта следующим образом:

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


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

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

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