Pull to refresh

Wicket: HelloWorld

Reading time7 min
Views9.1K
Недавно занялся изучением замечательного фреймворка Wicket. К сожалению, в рунете информации о нем крайне мало и поэтому здесь я бы хотел вам показать некоторые его возможности. А за одно и записать чтобы самому не забыть.
Wicket — это фреймворк для написания пользовательских интерфейсов для веб приложений, который позволяет подавляющее большинство задач реализовать на java. Более подробно обо всех его преимуществах написано на оффсайте. Там же есть примеры, но лично мне они не очень понравились, поэтому заинтересовавшимся рекомендую полистать книгу (на английском) под названием «Wicket in action» (перевод полностью я врядли осилю, но некоторые вкусности оттуда покажу). А теперь собственно к делу. Для создания проекта (я использую maven) напишем простенькое заклинание

mvn archetype:create -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.4.7 -DgroupId=ru.habrahabr.helowicket -DartifactId=helloworld

которое создаст проект. В результате мы получим проект с 3мя файлами: файл с говорящим названием WicketApplication.java,
package ru.habrahabr.helowicket;<br><br>import org.apache.wicket.protocol.http.WebApplication;<br><br>public class WicketApplication extends WebApplication<br>{  <br>  public WicketApplication()<br>  {<br>  }<br>  public Class<HomePage> getHomePage()<br>  {<br>    return HomePage.class;<br>  }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.
а так же файлы HomePage.html и HomePage.java, содержащие сответственно разметку и логику страницы (файлы должны иметь одинаковое название и различаться расширениями).
HomePage.html
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" ><br>  <head> <br>    <title>Wicket Quickstart Archetype Homepage</title><br>  </head><br>  <body><br>    <strong>Wicket Quickstart Archetype Homepage</strong><br>    <br/><br/><br>    <span wicket:id="message">message will be here</span><br>  </body><br></html><br><br>* This source code was highlighted with Source Code Highlighter.

HomePage.java
package ru.habrahabr;<br>import org.apache.wicket.PageParameters;<br>import org.apache.wicket.markup.html.basic.Label;<br>import org.apache.wicket.markup.html.WebPage;<br><br>public class HomePage extends WebPage {<br><br>  private static final long serialVersionUID = 1L;<br><br>  public HomePage(final PageParameters parameters) {<br>    add(new Label("message", "If you see this message wicket is properly configured and running"));<br>  }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.
Смысл я думаю понятен, но в 2х словах прокоментирую. Файл разметки содержит строку
<span wicket:id="message">message will be here</span><br><br>* This source code was highlighted with Source Code Highlighter.
благодаря чему в коде java становится возможно обращение к этому элементу c помощью строки
add(new Label("message", "If you see this message wicket is properly configured and running"));
после чего мы можем манипулировать этим объектом. То есть посредством атрибутов (wicket:id) производится сопоставление тегов разметки с объектами, создаваемыми при работе приложения на стороне сервера.Например, чтобы Label нам показывала, текущие дату и время надо написать что-то типа

add(new Label("message", new Date().toString()));

Заметьте, что надпись "message will be here" из файла разметки мы не увидим. Как это работает мы можем увидеть нажав волшебную кнопку в любимой IDE. Для открытия проекта, например, в eclipse применяется комманда mvn eclipse:eclipse -DdownloadSources=true в каталоге проекта. Полный список спеллов есть на сайте Wicket'а. Можно поступить проще набрав: mvn tomcat:run .
А теперь добавим AJAX. Пусть у нас будет ссылка, которая обновляет не всю страницу а только дату. Начнем с разметки:
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" ><br>  <head> <br>    <title>Wicket Quickstart Archetype Homepage</title><br>  </head><br>  <body><br>  <a href="#" wicket:id="link">This link</a> has been clicked<br>  <span wicket:id="label">123</span> times.<br>  </body><br></html><br><br>* This source code was highlighted with Source Code Highlighter.
Тут все просто. Мы создали label для отображения даты и ссылку link для обновления. Теперь напишем java код:
  public HomePage(final PageParameters parameters) {<br>    super(parameters);<br>    add(new AjaxFallbackLink("link") { <br>      @Override<br>      public void onClick(AjaxRequestTarget target) { <br>        time = new Date().toString();<br>        if(target != null) { <br>          target.addComponent(label); <br>        }<br>      }<br>    });<br>    label = new Label("label", new PropertyModel(this, "time"));<br>    label.setOutputMarkupId(true);<br>    add(label);<br>    <br>  }<br><br>* This source code was highlighted with Source Code Highlighter.
Мы будем хранить ссылку на label для дальнейших издевательств над содержимом. Сама link имеет обработчик событий к котором задается новое значение даты. Замечу, что PropertyModel находит у текущего объекта (this) поле "time", в котором собственно и хранится время. О моделях и их видах вы можете прочитать в книге.

И наконец надо решить задачу "единообразия страниц". Раньше я использовал SiteMech, Wicket позволяет обойтись наследованием. Основные заклинания, которыми мы будем пользоваться - это <wicket:child/> в базовой странице и <wicket:extend> в дочерней.Добавим java класс и файл разметки для базовой страницы (назовем ее BasePage) и поправим нашу HomePage. В итоге получится вот что:
BasePage.html
<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" ><br><body><br> <div><br> <!-- Тут может быть шапка --><br> <span wicket:id="bpspan"></span><br> <wicket:child/><br> <!-- а тут - подвал --><br> </div><br></body><br></html><br><br>* This source code was highlighted with Source Code Highlighter.

BasePage.java
package ru.habranabr.helowicket;<br><br>import org.apache.wicket.PageParameters;<br>import org.apache.wicket.markup.html.WebPage;<br>import org.apache.wicket.markup.html.basic.Label;<br><br>/**<br> * @author office<br> */<br>public class BasePage extends WebPage {<br><br>  public BasePage(final PageParameters parameters) {<br>    super(parameters);<br>    add(new Label("bpspan", "Hello from BasePage!"));<br>  }<br>}<br><br><br>* This source code was highlighted with Source Code Highlighter.

HomePage.html
<wicket:extend><br>  <a href="#" wicket:id="link">This link</a> has been clicked<br>  <span wicket:id="label">123</span> times.<br></wicket:extend><br><br>* This source code was highlighted with Source Code Highlighter.

HomePage.java
import java.util.Date;<br><br>import org.apache.wicket.PageParameters;<br>import org.apache.wicket.ajax.AjaxRequestTarget;<br>import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;<br>import org.apache.wicket.markup.html.basic.Label;<br>import org.apache.wicket.model.PropertyModel;<br><br>public class HomePage extends BasePage {<br><br>  private static final long serialVersionUID = 1L;<br>  private Label label;<br>  private String time;<br>  <br>  public HomePage(final PageParameters parameters) {<br>    super(parameters);<br>    add(new AjaxFallbackLink("link") { <br>      @Override<br>      public void onClick(AjaxRequestTarget target) { <br>        time = new Date().toString();<br>        if(target != null) { <br>          target.addComponent(label); <br>        }<br>      }<br>    });<br>    label = new Label("label", new PropertyModel(this, "time"));<br>    label.setOutputMarkupId(true);<br>    add(label);<br>    <br>  }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.
Вот и все что я хотел сегодня поведать. Вышеизложеное - это всего лишь маленькая илюстрация к возможностям Wicket'а, но надеюсь, что этого поможет составить хотя бы самое общее представление об этом замечательном фреймворке.

PS. Все вышенаписаное не шутка, на дату внимания не обращайте.
Tags:
Hubs:
+7
Comments1

Articles