Это приложение 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. Есть два требования к сущности:
- аннотирование класса аннотацией @Entity .
- аннотирование идентификатора первичного ключа с помощью @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.
Запуск примера приложения
- Если вы еще этого не сделали, загрузите и установите среду IDE NetBeans , GlassFish и MySQL Community Server . Вы можете загрузить и установить GlassFish с NetBeans в виде одного пакета .
- Следуйте этим инструкциям для настройки Netbeans с помощью плагина Wicket.
- Загрузите образец кода.
Создайте базу данных каталога домашних животных
Чтобы запустить пример кода, сначала необходимо создать базу данных каталога домашних животных и заполнить таблицу предметов.
- Запустите среду 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 в каталог riapetcatalog \ упражнения \ exerc0 и вставьте его в командное окно 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 с сохранением данных.
Запуск примера решения:
Если вы хотите запустить пример решения, сначала необходимо создать таблицы базы данных каталога, как описано выше.
- Если вы еще не загрузили пример кода и запустите IDE NetBeans. Распакуйте файл catalog.zip, который вы скачали, это создаст каталог каталога с кодом проекта.
- Откройте файл catalog / setup / sun-resources.xml и убедитесь, что указанные им свойства совпадают со значениями базы данных petcatalog и ресурсов jdbc, которые вы создали. При необходимости измените значения свойств.
- Откройте каталог проекта следующим образом:
- В IDE NetBeans выберите «Открыть проект» в меню «Файл». Откроется диалоговое окно «Открыть проект».
- Перейдите в диалоговом окне «Открыть проект» в каталог каталога и нажмите кнопку «Открыть проект».
В ответ IDE открывает каталог проекта. Вы можете просмотреть логическую структуру проекта в окне Projects (Ctrl-1). - Запустите каталог, щелкнув правой кнопкой мыши по проекту каталога в окне «Проекты» и выбрав «Запустить проект». Среда IDE NetBeans компилирует приложение, развертывает его на Glassfish и открывает страницу по умолчанию в вашем браузере. (по адресу http: // localhost: 8080 / catalogue /).