// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Введение в веб-платформу Wicket
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Введение в веб-платформу Wicket - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Введение в веб-платформу Wicket

В этом документе описаны основы создания повторно используемых компонентов и их сборки в веб-приложение. Каждый компонент состоит из класса Java и файла HTML. Платформа, которая позволяет разрабатывать приложения таким способом, называется Wicket. Помимо основанного на компонентах подхода, отличительной чертой Wicket является отсутствие XML-файлов конфигурации. Для общих настроек приложения, таких как идентификация главной страницы, вместо XML-файла конфигурации используется класс Java.

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


image::images/netbeans-stamp-80-74-73.png[title="Содержимое этой страницы применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0"]


*Для работы с этим учебным курсом требуется следующее программное обеспечение и ресурсы.*

|===
|Программное обеспечение или ресурс |Требуемая версия 

|link:https://netbeans.org/downloads/index.html[+IDE NetBeans+] |7.2, 7.3, 7.4, 8.0, Java EE 

|Комплект для разработчика на языке Java (JDK) |link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+версия 7+] или более поздние 

|Подключаемый модуль Wicket для IDE NetBeans |link:http://plugins.netbeans.org/plugin/3586/wicket-support[+Страница подключаемого модуля Wicket для NetBeans+] 

|GlassFish Server Open Source Edition 
_или_ 
Контейнер сервлетов Tomcat |3.1.x или более поздние 
_ _ 
версия 7.x или более поздние 
|===

*Примечания.*

* Вспомогательный подключаемый модуль Wicket для NetBeans состоит из следующих компонентов:
* *org-netbeans-modules-web-wicket.nbm.* Предоставляет функциональность Wicket, описанную в данном учебном курсе.
* *org-netbeans-modules-wicket-templates.nbm.* Предоставляет шаблоны файлов Wicket для создания типичных артефактов Wicket, таких как страницы и панели.
* *org-netbeans-modules-wicket-library.nbm.* Предоставляет файлы Wicket JAR и устанавливает их в Диспетчере библиотек IDE. Таким образом, вам не потребуется загружать дистрибутив Wicket с веб-сайта Wicket, так как все необходимые компоненты содержатся в подключаемом модуле.
* Чтобы установить вспомогательный подключаемый модуль Wicket в среде IDE, перейдите в Диспетчер расширений (выберите Сервис > Подключаемые модули в главном меню), затем перейдите на вкладку 'Загруженные' и установите модуль. Подробные инструкции по установке подключаемого модуля платформы в среде см. в разделе link:framework-adding-support.html[+Реализация поддержки веб-платформ+].
* Дополнительную информацию о платформе Wicket можно найти на веб-сайте по адресу link:http://wicket.sourceforge.net/[+http://wicket.sourceforge.net/+]. Информацию о поддержке Wicket в IDE NetBeans для разработчиков можно найти на веб-сайте по адресу link:http://java.net/projects/NbWicketSupport[+http://java.net/projects/NbWicketSupport+]. Если у вас есть опыт работы с Wicket, вы можете дополнить код подключаемого модуля Wicket для IDE NetBeans.


== Установка среды

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


=== Создание исходной структуры приложения Wicket

Исходная структура приложения должна включать в себя файлы Wicket JAR, регистрацию сервлета Wicket в файле  ``web.xml`` , а также некоторые стандартные артефакты, такие как класс приложения и главная страница. Поскольку вы работаете в среде IDE, создавать все эти файлы вручную не требуется. Вместо этого можно воспользоваться мастерами.

Выберите сценарий, который больше всего соответствует вашим потребностям:

* <<create-1,Сценарий 1. Создание приложения Wicket на основе Ant с нуля>>
* <<create-2,Сценарий 2. Создание приложения Wicket на основе Maven с нуля>>
* <<create-3,Сценарий 3. Создание приложения Wicket на основе Maven с использованием архетипа>>
* <<create-4,Сценарий 4. Реализация поддержки Wicket в существующем приложении>>


==== Сценарий 1. Создание приложения Wicket на основе Ant с нуля

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

1. Выберите команду "Файл" > "Новый проект". В области "Категории" выберите "Web". В области "Projects" выберите "Web Application". Нажмите 'Далее'.
2. На панели 'Имя и расположение' в поле 'Имя проекта' введите  ``MyFirstWicketApp`` . В поле "Местоположение проекта" укажите любой каталог на компьютере. Нажмите 'Далее'.
3. Оставьте все настройки без изменений. Но если хотите, вы можете их изменить. Wicket поддерживает все версии Java EE. Приложение Wicket можно развернуть на любом сервере. Нажмите 'Далее'.
4. 
На панели 'Платформы' выберите Wicket, как показано на рисунке:

image::https://blogs.oracle.com/geertjan_images/resource/wicket-160-nb.png[]

*Примечание.* В зависимости от того, какие модули установлены в среде IDE, набор доступных элементов в списке 'Платформы' может отличаться от изображенного на снимке экрана.

Оставьте все настройки на вышеуказанной панели без изменений. В полях на вышеуказанной панели содержатся следующие данные:

* *Имя фильтра Wicket.* Имя фильтра, заданного в файле  ``web.xml`` .
* *Шаблон URL-адреса Wicket.* Шаблон относительного URL-адреса, добавляемый в файл  ``web.xml`` .
* *Класс приложения Wicket.* Имя класса, определяющего общие параметры приложения, такие как настройки главной страницы.
* *Главная страница Wicket.* Имя главной страницы, которая состоит из файлов  ``xxx.java``  и  ``xxx.html`` .
* *Основной пакет.* Пакет Java, в который среда IDE помещает все созданные артефакты.
* *Версия.* Версия Wicket. В вышеуказанном списке 'Версия' будут отображаться все библиотеки с префиксом 'Wicket', доступные в Диспетчере библиотек. По умолчанию в списке отображается только версия 1.6.0, так как именно эта версия предоставляется подключаемым модулем.

[start=5]
. Нажмите 'Готово'.

Среда IDE создает проект  ``MyFirstWicketApp `` . Проект содержит все исходные файлы и метаданные проекта, например сценарий построения Ant. Проект откроется в среде IDE. Логическую структуру можно просмотреть в окне 'Проекты' (Ctrl-1):

image::https://blogs.oracle.com/geertjan_images/resource/wicket-160-nb-2.png[]


==== Сценарий 2. Создание приложения Wicket на основе Maven с нуля

Если у вас уже есть приложение на основе Ant, вы можете реализовать в нем поддержку Wicket с помощью среды IDE.

1. Выберите команду "Файл" > "Новый проект". В Categories ("Категории) выберите Maven. В области "Projects" выберите "Web Application".

image::images/maven-1.png[]

Нажмите 'Далее'.


[start=2]
. На панели 'Имя и расположение' в поле 'Имя проекта' введите  ``MyFirstWicketApp`` . Измените значения в поле 'Местоположение проекта' и параметры Maven как требуется.

image::images/maven-3.png[]

Нажмите 'Далее'.


[start=3]
. Выберите нужный сервер. В качестве версии Java EE укажите 'Java EE 6 Web'.

image::images/maven-4.png[]

Нажмите 'Готово'. Среда IDE создает исходную структуру, как показано на рисунке:

image::images/maven-5.png[]


[start=4]
. Поскольку мы реализовали поддержку Java EE 6, на предыдущем этапе не создается файл  ``web.xml`` . Однако Wicket требует, чтобы в файле  ``web.xml``  был зарегистрирован фильтр приложения Wicket. Поэтому прежде чем продолжить, необходимо добавить в приложение новый файл  ``web.xml`` .

Щелкните приложение правой кнопкой мыши и выберите Создать > Другие, затем выберите Веб > Стандартный дескриптор развертывания (web.xml). Нажмите кнопку "Далее", а затем нажмите кнопку "Готово".


[start=5]
. Теперь можно реализовать поддержку Wicket в приложении. Щелкните правой кнопкой узел проекта и выберите команду "Свойства". В диалоговом окне 'Свойства проекта' выберите 'Платформы' и 'Wicket'. Используя информацию из предыдущих сценариев, заполните поля в разделе 'Конфигурация Wicket' диалогового окна. Нажмите OK.

Среда IDE все файлы Wicket, необходимые для начала работы:

image::images/maven-6.png[]


==== Сценарий 3. Создание приложения Wicket на основе Maven с использованием архетипа

В репозиториях Maven имеются артефакты для настройки приложений Wicket.

1. Выберите команду "Файл" > "Новый проект". В Categories ("Категории) выберите Maven. Выберите 'Проект' из списка 'Архетип' в разделе 'Проекты'.

image::images/maven-7.png[]

Нажмите 'Далее'.


[start=2]
. В поле 'Поиск' введите 'wicket', затем выберите архетип, который вы хотите использовать.

image::images/maven-8.png[]

Заполните поля на экране мастера необходимыми данными. Нажмите 'Готово'.

Среда IDE добавляет поддержку Wicket в приложение, созданное с использованием архетипа.


==== Сценарий 4. Реализация поддержки Wicket в существующем приложении

Если у вас уже есть приложение на основе Ant или Maven, вы можете реализовать в нем поддержку Wicket с помощью среды IDE.

1. Щелкните приложение правой кнопкой мыши и выберите 'Свойства'.
2. В диалоговом окне 'Свойства проекта' выберите панель 'Платформы' и нажмите 'Добавить'. Выберите 'Wicket'. Нажмите OK.
3. Используя информацию из предыдущего раздела, заполните поля в разделе 'Конфигурация Wicket' на панели 'Платформы'.
4. Для подтверждения нажмите OK .

Среда IDE добавляет поддержку Wicket в существующее приложение.

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


=== Обеспечение поддержки альтернативных версий Wicket

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

1. Перейдите в раздел Сервис | Библиотеки Ant. Обратите внимание на файлы Wicket JAR, зарегистрированные подключаемым модулем Wicket для NetBeans:

image::images/maven-9.png[]


[start=2]
. В диалоговом окне, показанном на рисунке, нажмите 'Создать библиотеку' и создайте новую библиотеку, имя которой должно иметь префикс 'Wicket'. Добавьте файлы JAR в созданную библиотеку (другими словами, зарегистрируйте файлы JAR предпочтительной версии Wicket в этой библиотеке).

[start=3]
. 
Впоследствии при создании очередного веб-приложения или добавлении поддержки Wicket в существующее приложение на панели 'Платформы' будет отображаться библиотека, которую вы только что зарегистрировали (если имя библиотеки имеет префикс 'Wicket'):

image::images/maven-91.png[]

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

*Примечание.* Вышеописанный подход применяется только к приложениям Wicket на основе Ant. Если требуется использовать альтернативную версию Wicket в приложении на основе Maven, измените соответствующий файл POM.


=== Рассмотрение исходной структуры приложения, созданного на платформе Wicket

Мастер создания веб-приложений IDE создал множество файлов. Посмотрите на эти файлы и определите, как они связаны друг с другом в контексте разработки на платформе Wicket.

1. Перейдем к обзору созданных файлов.

* *Веб-дескриптор.* Начнем с файла  ``web.xml`` . Это обычный дескриптор развертывания, общий для всех веб-приложений, соответствующих серверной спецификации. Разверните структуру папки  ``WEB-INF``  или папки 'Файлы конфигурации', откройте файл в исходном формате XML и обратите внимание на определение фильтра Wicket:


[source,xml]
----

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <filter>
        <filter-name>WicketApplication</filter-name>
        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
        <init-param>
            <param-name>applicationClassName</param-name>
            <param-value>com.myapp.wicket.Application</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>WicketApplication</filter-name>
        <url-pattern>/wicket/*</url-pattern>
    </filter-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file/>
    </welcome-file-list>
</web-app>
----

*Примечание.* Имя класса приложения имеет значение  ``com.myapp.wicket.Application`` . Теперь откройте файл класса приложения и рассмотрите его содержимое.

* *Класс приложения Wicket.* Откройте пакет  ``com.myapp.wicket``  в папке 'Исходные пакеты', затем откройте файл  ``Application.java`` . Он выглядит следующим образом:


[source,java]
----

package com.myapp.wicket;           

import org.apache.wicket.protocol.http.WebApplication;

public class Application extends WebApplication {

    public Application() {
    }

    @Override
    public Class getHomePage() {
        return HomePage.class;
    }

}
----

Этот файл Java содержит общие настройки приложения и сравним с файлом  ``struts-config.xml``  платформы Struts и файлом  ``faces-config.xml``  платформы JSF. Обратите внимание на определение метода  ``getHomePage()`` . Это метод является минимальным требованием для общего класса приложения. Он указывает первую (главную) страницу, которая отобразится после развертывания приложения. Обратите внимание на возвращаемый класс  ``HomePage.class`` . Далее откройте файл  ``HomePage.java``  и изучите его содержимое.

* *Главная страница Wicket.* Откройте файл  ``HomePage.java`` . Он выглядит следующим образом:


[source,java]
----

package com.myapp.wicket;           

public class HomePage extends BasePage {

    public HomePage() {
        add(new Label("message", "Hello, World!"));
    }

}
----

Этот файл добавляет метку на главную страницу. Представление виджетов Wicket, созданных в этом файле, осуществляется в файле с таким же именем и в той же исходной структуре. Это может быть только файл  ``HomePage.html`` , который в данном случае выглядит так:


[source,xml]
----

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
      xml:lang="en"  
      lang="en"> 
    <head> 
        <wicket:head> 
            <title>Wicket Example</title> 
        </wicket:head> 
    </head> 
    <body> 
        <wicket:extend> 
            <h1 wicket:id="message">This gets replaced</h1>
        </wicket:extend> 
    </body> 
</html>
----

Обратите внимание, что в файле  ``HomePage.java``  расширяется элемент  ``BasePage`` . Файл  ``HomePage.html``  содержит атрибут  ``wicket:id`` , который указывает на то, что это заместитель определенного объекта, созданного файлом Java. Также здесь есть ссылка на таблицу стилей CSS, сгенерированную средой IDE. Эта таблица находится в папке 'Веб-страницы' в окне 'Проекты'. Далее откройте файл  ``BasePage``  и рассмотрите его содержимое.

* *Базовая страница.* Откройте файл  ``BasePage.java`` . Вот как он выглядит:


[source,java]
----

package com.myapp.wicket;           

import org.apache.wicket.markup.html.WebPage;

public abstract class BasePage extends WebPage {

    public BasePage() { 
        super(); 
        add(new HeaderPanel("headerpanel", "Welcome To Wicket")); 
        add(new FooterPanel("footerpanel", "Powered by Wicket and the NetBeans Wicket Plugin"));
    } 

}
----

Это класс, который будут расширять наши веб-страницы. Каждый класс, расширяющий  ``BasePage`` , наследует экземпляр  ``HeaderPanel``  и  ``FooterPanel`` . Это нужно для того, чтобы у всех веб-страниц были одинаковые верхние и нижние колонтитулы. Вид базовой страницы в представлении HTML:


[source,xml]
----

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
      xml:lang="en"  
      lang="en"> 
    <head> 
        <wicket:head> 
            <wicket:link> 
                <link rel="stylesheet" type="text/css" href="style.css"/> 
            </wicket:link> 
        </wicket:head> 
    </head> 
    <body> 
        <header wicket:id="headerpanel" />
        <section class="content_container"> 
            <wicket:child/> 
        </section> 
        <footer wicket:id="footerpanel" /> 
    </body> 
</html>
----

Далее откройте файл  ``HeaderPanel.java``  и изучите его содержимое.

* *Панель верхнего колонтитула.* Откройте файл  ``HeaderPanel.java`` . Вот как он выглядит:


[source,java]
----

package com.myapp.wicket;           

import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;

public class HeaderPanel extends Panel {

    public HeaderPanel(String componentName, String exampleTitle)
    {
        super(componentName);
        *add(new Label("exampleTitle", exampleTitle));*
    }

}
----

Обратите внимание на строку, выделенную жирным шрифтом. Здесь создается виджет Wicket Label. HeaderPanel является повторно используемым компонентом. Это представление Java, где создаются виджеты. Теперь рассмотрим представление HTML, где должен быть представлен виджет Wicket Label. Теперь откройте файл  ``HeaderPanel.html``  и изучите его содержимое.

Измените второй аргумент на 'My Very First Component Based Application', чтобы определение элемента Label приняло следующий вид:


[source,java]
----

add(new Label("exampleTitle", "My Very First Component Based Application"));
----

Откройте файл  ``HeaderPanel.html`` . Обратите внимание на то, что этот файл имеет такое же имя, как файл Java, который мы только что рассматривали. Этот файл находится в той же исходной структуре. Вот как он выглядит:


[source,xml]
----

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
      xml:lang="en"  
      lang="en"> 
    <head><title>Wicket Example</title></head>
    <body>
        <wicket:panel>
            <h1>Wicket Example</h1>
            <p id="titleblock">
                <b><font size="+1">Start of <span wicket:id="exampleTitle">Example Title Goes Here</span></font></b>
            </p>
        </wicket:panel>
    </body>
</html>
----

Обратите внимание на строку, выделенную жирным шрифтом. Здесь указывается, где должен быть представлен виджет на странице в представлении HTML. Удерживая клавишу Ctrl, наведите указатель мыши на значение атрибута  ``wicket:id``  в теге  ``span`` . Как видите, значение превращается в гиперссылку:

image::images/hyperlink-1.png[]

Щелкните эту гиперссылку. В результате откроется веб-страница в представлении Java.

Теперь щелкните стрелку влево в верхней части редактора исходного кода, чтобы вернуться на страницу HTML:

image::images/hyperlink-2.png[]

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

* *Панель нижнего колонтитула.* Панель нижнего колонтитула имеет такую же структуру, как и панель верхнего колонтитула, которая была описана ранее в этом разделе.

[start=2]
. 
Щелкните проект правой кнопкой мыши и запустите его выполнение. Среда IDE выполняет сборку приложения, создает файл WAR, отправляет его на сервер развертывания, открывает стандартный браузер IDE и отображает приложение:

image::images/deploy-1.png[]

*Примечание.* Убедитесь, что URL-адрес заканчивается на '/wicket', как указано на рисунке выше. Это необходимо для сопоставления URL-адреса с фильтром Wicket, зарегистрированным в файле  ``web.xml`` .



== Использование компонентов Wicket

В следующих разделах содержится информация о трех ключевых компонентах Wicket и о том, как подключаемый модуль Wicket для NetBeans обеспечивает поддержку этих компонентов в среде IDE NetBeans.

* <<widget,Виджет>>
* <<component,Повторно используемый компонент>>
* <<ajax,Поддержка AJAX>>

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


=== Добавление виджета

Из этого раздела вы узнаете, как создать первый виджет Wicket. Как и большинство других артефактов Wicket, виджет имеет два представления: представление Java и представление HTML. В представлении Java виджет создается. В представлении HTML он отображается. Как упоминалось ранее, для перехода от одного представления к другому можно использовать гиперссылку.

1. Откройте файл  ``HomePage.html`` . Если палитра не открывается автоматически, выберите Окно > Палитра (Ctrl-Shift-8).

image::images/widget-2.png[]


[start=2]
. После добавления строки под элементом H1 в файле HTML перетащите элемент Label из палитры в область под элементом H1. Откроется следующее диалоговое окно:

image::images/widget-3.png[]

Измените значения в диалоговом окне следующим образом:

image::images/widget-4.png[]

Нажмите OK. Как видите, в файл был добавлен тег, выделенный полужирным шрифтом:


[source,xml]
----

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
      xml:lang="en"  
      lang="en"> 
    <head> 
        <wicket:head> 
            <title>Wicket Example</title> 
        </wicket:head> 
    </head> 
    <body> 
        <wicket:extend> 
            <h1 wicket:id="message">This gets replaced</h1>
            *<span wicket:id="message1">This gets replaced</span>*
        </wicket:extend> 
    </body> 
</html>
----

Теперь к виджету можно применить стиль, например, используя теги H3:


[source,xml]
----

<h3 wicket:id="message1">This gets replaced</h3>
----

Теперь откройте файл  ``HomePage.java`` . Как видите, в него была добавлена метка с таким же идентификатором, как в файле HTML (изменения выделены *полужирным шрифтом*):


[source,java]
----

public class HomePage extends BasePage {

    public HomePage() {
        add(new Label("message", "Hello, World!"));
        *add(new Label("message1", "Hello again, World!"));*
    }

}
----

[start=3]
. 
Сохраните файлы. Обновите страницу в браузере. В результате отобразится виджет Wicket Label, представленный в файле  ``HomePage.html`` :

image::images/deploy-2.png[]

Вы можете создать заполнители точно так же, как создавали теги в файле  ``HomePage.html`` , и передать файл HTML веб-дизайнеру. Пока веб-дизайнер занимается проектированием страницы, вы можете независимо от него работать в представлении Java и создавать виджеты. Поскольку теги HTML не встраиваются в файл Java, вы, как и ваш веб-дизайнер, сможете оценить основное преимущество Wicket - разделение обязанностей.

Откройте Навигатор (Окно > Навигация > Навигатор), предварительно выбрав файл HTML в редакторе. Навигатор отображает обзор тегов в списке 'Теги Wicket':

image::images/wicket-navigator.png[]

Если на странице HTML есть непарные теги, в файле Java отображается предупреждение:

image::images/widget-1.png[]


=== Добавление повторно используемого компонента

Одно из преимуществ Wicket заключается в повторно используемых компонентах. В этом разделе показано, как с помощью матера создать панель, которая снова имеет два представления: представление Java и представление HTML. Панель будет создана таким образом, чтобы можно было повторно использовать баннер на веб-страницах и обеспечить одинаковый вид баннера на всем веб-сайте. Добавить панель на веб-страницу совсем не сложно.

1. Щелкните правой кнопкой мыши узел пакета  ``com.myapp.wicket``  и выберите Создать > Другие. В разделе 'Категории' выберите 'Веб'. В разделе 'Типы файлов' обратите внимание на следующие шаблоны:

image::images/panel-1.png[]

Выберите 'Панель Wicket' и нажмите 'Далее'.


[start=2]
. В поле 'Имя файла' введите  ``BannerPanel`` . На экране должны быть представлены следующие параметры:

image::images/panel-2.png[]

Нажмите 'Готово'.

В результате в пакете будет создано два новых файла:  ``BannerPanel.html``  и  ``BannerPanel.java`` .


[start=3]
. Откройте файл  ``BannerPanel.html``  и обратите внимание на содержимое этого файла:


[source,xml]
----

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:wicket>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>BannerPanel</title>
    </head>
    <body>
        <wicket:panel>
            <!-- TODO - add components here, ala
            
            <span wicket:id="title">title here</span>
            
            -->
        </wicket:panel>
    </body>
</html
----

Между тегами  ``wicket:panel``  находится заполнитель Wicket. Удалите строки над и под тегом SPAN, чтобы строка с тегом SPAN не была закомментирована. Удерживая клавишу Ctrl, наведите указатель мыши на значение идентификатора Wicket и щелкните отображенную гиперссылку. Откроется файл  ``BannerPanel.java`` :


[source,java]
----

package com.myapp.wicket;

import org.apache.wicket.markup.html.panel.Panel;

public final class BannerPanel extends Panel {
    BannerPanel(String id) {
        super (id);
    }
}
----

Добавьте метку так же, как в файле  ``HomePage.java``  (изменения выделены полужирным шрифтом):


[source,java]
----

package com.myapp.wicket;

*import org.apache.wicket.markup.html.basic.Label;*
import org.apache.wicket.markup.html.panel.Panel;

public final class BannerPanel extends Panel {
    BannerPanel(String id) {
        super (id);
        *add(new Label("title","I am a reusable component!"));*
    }
}
----

[start=4]
. Простая панель почти готова. Добавим ее на главную страницу. Откройте файл  ``HomePage.java``  и создайте новый экземпляр элемента BannerPanel, добавив следующую строку в конечный сегмент конструктора:


[source,java]
----

add(new BannerPanel("bannerPanel"));
----

[start=5]
. Теперь нужно отобразить панель. Откройте файл  ``HomePage.html``  и добавьте тег-заполнитель сразу над закрывающим тегом BODY. Обязательно используйте такой же идентификатор Wicket, как и в файле Java:


[source,java]
----

<span wicket:id='bannerPanel'/>
----

[start=6]
. 
Выполните проект еще раз. Панель отображается на странице точно в том месте, которое указано в файле HTML:

image::images/result-3.png[]

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


=== Добавление компонентов AJAX

Вместо использования JavaScript для добавления в приложение Wicket асинхронных веб-компонентов (по технологии link:http://en.wikipedia.org/wiki/Ajax_(programming)[+AJAX+]) можно использовать модель компонента Java со встроенными компонентами AJAX. Далее показано, как изменить элемент BannerPanel и включить в него виджет автозаполнения AJAX вместо виджета метки, который вы создавали ранее.

1. В представлении HTML класса  ``BannerPanel``  перетащите элемент AJAX Text Input из палитры (Ctrl-Shift-8), как показано на рисунке:

image::images/drag-1.png[]

Поместите элемент под существующим заполнителем Wicket, как показано ниже:


[source,xml]
----

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:wicket>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>BannerPanel</title>
    </head>

    <body>
        
        <wicket:panel>

            <span wicket:id="title">title here</span>

            *<input type="text" wicket:id="countries" size="50"/>*

        </wicket:panel>

    </body>
    
</html>
----

[start=2]
. В соответствующем представлении Java будут автоматически добавлены следующие элементы:


[source,java]
----

final AutoCompleteTextField field = new AutoCompleteTextField("countries", new Model("")) {
    @Override
    protected Iterator getChoices(String input) {
        if (Strings.isEmpty(input)) {
            return Collections.EMPTY_LIST.iterator();
        }
        List choices = new ArrayList(10);
        Locale[] locales = Locale.getAvailableLocales();
        for (int i = 0; i < locales.length; i++) {
            final Locale locale = locales[i];
            final String country = locale.getDisplayCountry();
            if (country.toUpperCase().startsWith(input.toUpperCase())) {
                choices.add(country);
                if (choices.size() == 10) {
                    break;
                }
            }
        }
        return choices.iterator();
    }
};
----

[start=3]
. Нажмите Ctrl-Shift-I и выберите корректные операторы импорта:

image::images/imports-1.png[]

Нажмите ОК и убедитесь, что в классе  ``BannerPanel``  используются следующие операторы импорта:


[source,java]
----

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.string.Strings;
----

[start=4]
. 
Обновите страницу в браузере еще раз. На странице появится автоматически заполняемое поле AJAX. При вводе символов в поле будет подставляться название страны, соответствующее введенному тексту.

image::images/result-4.png[]


== Что дальше?

На этом вводная часть курса по разработке на платформе Wicket в среде IDE NetBeans завершена. Рекомендуем вам продолжить знакомство с платформой Wicket и поработать с образцом приложения Pizza Application Sample, описанным в книге link:http://www.ensode.net/wicket_first_look.html[+A First Look at the Wicket Framework+] Дэвида Р. Хеффельфингера (David R. Heffelfinger). Напоминаем, что результат работы, выполненной в рамках этого учебного курса, доступен в качестве образца в мастере создания проектов наряду с остальными образцами. См. рисунок ниже:

image::images/samples.png[] 

link:/about/contact_form.html?to=3&subject=Feedback: Introduction to the Wicket Framework in 7.2[+Мы ждем ваших отзывов+]



== См. также

Похожие и расширенные учебные курсы представлены на следующих ресурсах:

* link:../../docs/web/quickstart-webapps.html[+Введение в разработку веб-приложений+]
* link:../../docs/web/quickstart-webapps-struts.html[+Введение в веб-платформу Grails+]
* link:quickstart-webapps-spring.html[+Введение в веб-платформу Spring+].
