Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Wicket.docx
Скачиваний:
7
Добавлен:
23.03.2015
Размер:
68.23 Кб
Скачать

Приложения Wicket

Строго говоря, Wicket относится к категории программных каркасов (application framework). Являясь надстройкой над Servlet API, Wicket предоставляет всю необходимую инфраструктуру для функционирования приложений, включая средства для управления жизненным циклом объектов, разграничения прав доступа, локализации, обработки исключительных ситуаций, поддержки сессий пользователей и т.п.

Рассмотрим процесс создания приложения Wicket на еще одном конкретном примере. Предположим, необходимо создать Web-форму для ввода имени и электронного адреса пользователя. Результаты ввода будут сохраняться в объекте нижеследующей структуры:

public class Person

{

private String name;

private String email;

public String getName()

{

return name;

}

public void setName(String name)

{

this.name = name;

}

public String getEmail()

{

return email;

}

public void setEmail(String email)

{

this.email = email;

}

}

Каждая страница приложения, реализованного с помощью Wicket, состоит из Java-класса, управляющего поведением страницы, файла с HTML-разметкой, использующейся для генерации страницы и, возможно, ресурсного файла. После сборки проекта все эти файлы должны размещаться в каталоге WEB-INF\classes сервера приложений, с учетом структуры пакетов. Создадим файл AddPersonPage.html, содержащий форму для ввода данных:

<html xmlns:wicket="http://wicket.sourceforge.net/">

<head>

<title>Сохранение персональных данных</title>

</head>

<body>

<form wicket:id="form">

<span wicket:id="feedback"/>

<div>Имя: <input wicket:id="name" type="text" /></div>

<div>Адрес: <input wicket:id="email" type="text" /></div>

<input type="submit" name="submit" value="Сохранить"/>

</form>

</body>

</html>

В данном файле у некоторых HTML-тегов присутствуют атрибуты wicket:id. Посредством этих атрибутов производится сопоставление тегов разметки с объектами, создаваемыми при работе приложения на стороне сервера. Теперь создадим класс AddPersonPage, который будет функционировать на сервере при отображении данной страницы.

public class AddPersonPage extends WebPage

{

public final class PersonForm extends Form

{

public PersonForm(String s)

{

super(s, new CompoundPropertyModel(new Person()));

add(new FeedbackPanel("feedback"));

TextField name = new TextField("name");

name.add(RequiredValidator.getInstance());

add(name);

TextField email = new TextField("email");

email.add(RequiredValidator.getInstance());

email.add(EmailAddressPatternValidator.getInstance());

add(email);

}

public void onSubmit()

{

Person person = (Person) getModelObject();

PageParameters params = new PageParameters();

params.put("result", person);

redirectTo(newPage(NextPage.class, params));

}

}

public AddPersonPage()

{

add(new PersonForm("form"));

}

}

Класс AddPersonPage, расширяющий базовый класс WebPage, управляет отображением страницы. Класс PersonForm, расширяющий Form, управляет отображением формы. Классы FeedbackPanel и TextField – это штатные компоненты библиотеки; FeedbackPanel используется для вывода сообщений об ошибках, а TextField управляет полями ввода данных. Все эти классы вложены друг в друга при помощи метода add(), в полном соответствии с вложенностью тегов в файле разметки. При инициализации каждому из классов передается строковый идентификатор, значение которого должно совпадать с идентификатором wicket:id в файле разметки.

Класс Метод onSubmit() представляет собой обработчик события ввода данных для формы. При помощи метода redirectTo() управление передается странице NextPage (реализация этой страницы здесь не рассматривается), которая должна иметь конструктор, позволяющий получить объект класса PageParameters с результатами.

Особый интерес представляет класс CompoundPropertyModel. Взаимодействие с бизнес-объектами в Wicket происходит при помощи специальных классов-посредников, реализующих интерфейс IModel. Благодаря модели CompoundPropertyModel, атрибуты name и email класса Person автоматически сопоставляются с компонентами, имеющими одноименные идентификаторы. Метод getModelObject() позволяет получить объект Person после HTTP-запроса с атрибутами, значения которых установил пользователь. Другие виды моделей будут рассмотрены далее.

В приведенном примере были использованы классы RequiredValidator и EmailAddressPatternValidator. Данные классы позволяют производить автоматическую проверку корректности результатов ввода. Основные виды таких классов представлены в таблице.

Название

Назначение

RequiredValidator

Проверка на обязательность заполнения поля

LengthValidator

Проверка ограничений на длину строки ввода

IntegerValidator

Проверка на числовое значение

PatternValidator

Проверка строки по шаблону

EmailAddressPatternValidator

Проверка формата электронного адреса

TypeValidator

Проверка на возможность конвертации результата ввода

CustomValidator

Базовый класс для создания собственных проверяющих классов

Если результат ввода не прошел проверку, метод onSubmit() не будет вызван и, посредством FeedbackPanel, пользователю будут отображены сообщения об ошибках. Тексты сообщений задаются в ресурсном файле, который в данном случае будет называться AddPersonPage.properties и содержать следующие строки.

form.name.RequiredValidator=Введите имя

form.email.RequiredValidator=Введите e-mail

form.email.EmailAddressPatternValidator=Неверный формат e-mail

Имена констант для сообщений имеют сложную форму, состоящую из идентификаторов формы, поля ввода и названия класса.

Итак, страница создана, но она еще не может получить управление. Для этого необходимо поместить в дескриптор web.xml описание сервлета WicketServlet в соответствии с приведенным ниже примером:

<web-app>

<display-name>Wicket Demo Application</display-name>

<servlet>

<servlet-name>WicketDemo</servlet-name>

<servlet-class>wicket.protocol.http.WicketServlet</servlet-class>

<init-param>

<param-name>applicationClassName</param-name>

<param-value>wicketdemo.Application</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>WicketDemo</servlet-name>

<url-pattern>/app</url-pattern>

</servlet-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

Класс WicketServlet – это штатный сервлет библиотеки Wicket. Чтобы сервлет перехватил управление при входе пользователя в приложение, в файл index.jsp можно поместить конструкцию <jsp:forward page="/app" />. В качестве параметра сервлету передается полное имя класса Application. Этот класс используется для управления режимами работы приложения и позволяет, в случае необходимости, переопределить поведение системных классов Wicket, отвечающих за локализацию, кэширование, обработку ошибок времени выполнения, разбор файлов разметки, а также обеспечивающих доступ к ресурсам и поддержку сессий пользователей.

public class Application extends WebApplication

{

public Application()

{

getPages().setHomePage(AddPersonPage.class);

getSettings().setStripWicketTags(true);

getSettings().setResourcePollFrequency(Duration.ONE_SECOND);

}

}

В конструкторе класса Application указывается, что страница AddPersonPage будет домашней страницей приложения, а также изменяется ряд настроек. Метод setStripWicketTags отключает отображение специальных тегов Wicket (см. далее) в генерируемом коде, а метод setResourcePollFrequency управляет режимом кэширования ресурсов. В нашем примере кэширование отключено, что позволяет разработчику видеть последствия изменений, вносимых в файлы разметки, без перезапуска сервера приложений. Разумеется, отключение кэширования снижает производительность и используется только на этапе отладки приложения.

Итак, приложение готово. При запуске сервера приложений создается объект WicketServlet, который, в свою очередь, создает объект класса Application. Далее Application передает управление объекту класса AddPersonPage, который генерирует HTML-страницу. После ввода данных WicketServlet получает HTTP-запрос от пользователя, автоматически вызывает проверяющие классы, устанавливает значения для атрибутов объекта Person и вызывает метод onSubmit().

Особо следует остановиться на том, каким образом происходит генерация HTML-страницы. Классы AddPersonPage, PersonForm, FeedbackPanel и TextField являются либо штатными классами Wicket, либо расширяют базовые классы, наследуя способность управлять содержимым файла разметки в соответствии с состоянием объектов. При генерации страницы теги, имеющие атрибут wicket:id, либо замещаются, либо дополняются динамически сгенерированными данными.

В приведенном примере, класс Person задает так называемую модель данных, которые обрабатываются на странице, класс AddPersonPage является контроллером, а файл AddPersonPage.html отвечает за представление данных. Таким образом, можно утверждать, что Web-приложения, создаваемые с помощью библиотеки Wicket, полностью соответствуют паттерну программирования MVC (Model-View-Controller), официально рекомендованному компанией Sun шаблону для реализации интерактивных приложений.