«1. Обзор

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

С помощью Wicket можно создать веб-приложение, используя только код Java и HTML-страницы, совместимые с XHTML. Нет необходимости ни в Javascript, ни в файлах конфигурации XML.

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

В этой статье мы познакомимся с основами, создав приложение HelloWorld Wicket, а затем приведем полный пример с использованием двух встроенных компонентов, которые взаимодействуют друг с другом.

2. Настройка

Чтобы запустить проект Wicket, добавим следующие зависимости:

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-core</artifactId>
    <version>7.4.0</version>
</dependency>

Вы можете проверить последнюю версию Wicket в репозитории Maven Central, которая на момент чтение может не совпадать с используемым здесь.

Теперь мы готовы создать наше первое приложение Wicket.

3. HelloWorld Wicket

Давайте начнем с создания подкласса класса WebApplication Wicket, который, как минимум, требует переопределения класса Class\u003c? расширяет метод Page\u003e getHomePage().

Wicket будет использовать этот класс в качестве основной точки входа приложения. Внутри метода просто верните объект класса с именем HelloWorld:

public class HelloWorldApplication extends WebApplication {
    @Override
    public Class<? extends Page> getHomePage() {
        return HelloWorld.class;
    }
}

Wicket отдает предпочтение соглашению, а не конфигурации. Для добавления новой веб-страницы в приложение необходимо создать два файла: файл Java и файл HTML с одинаковым именем (но другим расширением) в одном каталоге. Дополнительная настройка необходима только в том случае, если вы хотите изменить поведение по умолчанию.

В каталог пакета исходного кода сначала добавьте HelloWorld.java:

public class HelloWorld extends WebPage {
    public HelloWorld() {
        add(new Label("hello", "Hello World!"));
    }
}

затем HelloWorld.html:

<html>
    <body>
        <span wicket:id="hello"></span>
    </body>
</html>

В качестве последнего шага добавьте определение фильтра в web.xml: ~ ~~

<filter>
    <filter-name>wicket.examples</filter-name>
    <filter-class>
      org.apache.wicket.protocol.http.WicketFilter
    </filter-class>
    <init-param>
        <param-name>applicationClassName</param-name>
        <param-value>
          com.baeldung.wicket.examples.HelloWorldApplication
        </param-value>
    </init-param>
</filter>

Вот и все. Мы только что закодировали наше первое веб-приложение Wicket.

Запустите проект, создав военный файл (пакет mvn из командной строки) и разверните его в контейнере сервлетов, таком как Jetty или Tomcat.

Давайте зайдем на http://localhost:8080/HelloWorld/ в браузере. Пустая страница с сообщением Hello World! появится.

4. Компоненты Wicket

Компоненты Wicket представляют собой триады, состоящие из класса Java, разметки HTML и модели. Модели — это фасад, который компоненты используют для доступа к данным.

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

Следующий пример демонстрирует, как добавить поведение Ajax к компоненту. Он состоит из страницы с двумя элементами: выпадающим меню и ярлыком. При изменении выбора в раскрывающемся списке метка (и только метка) будет обновлена.

Тело HTML-файла CafeSelector.html будет минимальным, всего два элемента, выпадающее меню и метка:

<select wicket:id="cafes"></select>
<p>
    Address: <span wicket:id="address">address</span>
</p>

На стороне Java давайте создадим метку:

Label addressLabel = new Label("address", 
  new PropertyModel<String>(this.address, "address"));
addressLabel.setOutputMarkupId(true);

~~ ~ Первый аргумент в конструкторе Label, соответствующий идентификатору wicket:id, указанному в HTML-файле. Второй аргумент — это модель компонента, оболочка для базовых данных, представленных в компоненте.

Метод setOutputMarkupId позволяет модифицировать компонент через Ajax. Давайте теперь создадим выпадающий список и добавим к нему поведение Ajax:

DropDownChoice<String> cafeDropdown 
  = new DropDownChoice<>(
    "cafes", 
    new PropertyModel<String>(this, "selectedCafe"), 
    cafeNames);
cafeDropdown.add(new AjaxFormComponentUpdatingBehavior("onchange") {
    @Override
    protected void onUpdate(AjaxRequestTarget target) {
        String name = (String) cafeDropdown.getDefaultModel().getObject();
        address.setAddress(cafeNamesAndAddresses.get(name).getAddress());
        target.add(addressLabel);
    }
});

Создание аналогично лейблу, конструктор принимает идентификатор калитки, модель и список названий кафе.

Затем добавляется AjaxFormComponentUpdatingBehavior с методом обратного вызова onUpdate, который обновляет модель метки после отправки запроса ajax. Наконец, компонент метки устанавливается в качестве цели для обновления.

Наконец, компонент метки устанавливается в качестве цели для обновления.

Как видите, все на Java, ни одной строчки Javascript не понадобилось. Чтобы изменить то, что отображает метка, мы просто изменили POJO. Механизм, с помощью которого изменение объекта Java преобразуется в изменение веб-страницы, происходит за кулисами и не имеет отношения к разработчику.

«Wicket предлагает большой набор готовых компонентов с поддержкой AJAX. Каталог компонентов с живыми примерами доступен здесь.

5. Заключение

В этой вводной статье мы рассмотрели основы Wicket, компонентной веб-инфраструктуры на Java.

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

Мы включили два простых примера, которые можно найти на GitHub, чтобы дать вам представление о том, как выглядит разработка с использованием этого фреймворка.