Apache Wicket

Apache Wicket（アパッチ・ウィケット）は、Apacheソフトウェア財団のApache Wicketプロジェクトにて開発されているオープンソースのJava Webアプリケーションフレームワークである。単にWicketと呼ばれることが多い。本頁では以下、Wicketと記述する。

概要 
元々はJonathan Lockeの作成したソフトウェアであり、2005年6月にVer1.0が発表された。

2007年6月にApacheのトップレベルプロジェクトになった。

類似するWebアプリケーションフレームワークとして、JavaServer FacesやApache Tapestryが挙げられる。

wicketには、英語では「小さな門」「（銀行などの）格子窓口」の意味の他、クリケットで使用される「3本の杭と、杭の上部に2本の横木を乗せた柱状のもの」（三柱門）の意味がある。

2011年にVer1.5をリリースした後のメジャーバージョンアップは、2012年のVer6.0となる。

特徴 
Webアプリケーションフレームワークで最も普及しているもののひとつはApache Struts（以下、Struts）であったっが、StrutsはJavaで作られているにもかかわらず、Javaらしいオブジェクト指向開発を実現していない。Strutsはサーブレットを設定ファイルで制御することを目標とし、さまざまな要素を設定ファイルに記述することで、開発効率を上げようとしていた。

Wicketは、これとは逆の発想で、Javaのオブジェクト指向言語としての機能を最大限に活用できるように作られている。

Wicketから見た場合、ウェブページもオブジェクトであり、その上に置かれる文字列やタグなどもすべてオブジェクトとして取り扱う。そのため、Javaプログラムによってウェブページを継承したり、機能を委譲したり、独自に拡張することができる。

Wicketが利用する定義ファイルは、Java Servletの仕様で必要と定められているweb.xmlのみである。

画面定義やページ・テンプレートはHTMLファイル、またはXHTMLファイルで行う。Wicketが独自拡張したタグはHTMLタグの置き換えや処理を記述するのではなく、Wicketが解釈する範囲指定、意味にづけになっている。また、HTMLタグに独自拡張した属性を必要に応じて記述する。このため、JSPファイルと異なり、通常のブラウザで表示させたりAdobe DreamweaverのようなWebオーサリングツールで表示、編集することが容易である。

Wicket 独自拡張 
Wicketが独自に拡張したタグには以下のものがある。
wicket:link
wicket:panel
wicket:fragment
wicket:border
wicket:body
wicket:extend
wicket:child
wicket:message
wicket:remove
wicket:head
wicket:enclosure
wicket:container

Wicketが独自に拡張した属性には以下のものがある。
wicket:id
wicket:message
wicket:enclosure
wicket:for
wicket:unknown
wicket:scope

プログラム例 
Hello worldを表示するプログラム例を以下に示す。

 HelloWorld.html
 テンプレートとなるXHTMLファイル。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"
      xml:lang="ja" lang="ja">
<body>
    <span wicket:id="message" id="message">ここにメッセージが表示される。</span>
</body>
</html>
 HelloWorld.java
 ページ・クラス。クラス名と同じ名前のHTML/XHTMLテンプレート（この場合、HelloWorld.html）を読み込む。
 テンプレート中にあるwicket:id属性が"message"となっているタグの内容を指定した文字列（"ハロー・ワールド！"）に置き換える。
package org.wikipedia.ja.wicket;

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

public class HelloWorld extends WebPage {
    /**
     * Constructor
     */
    public HelloWorld() {
        add(new Label("message", "ハロー・ワールド！"));
    }
}

 HelloWorldApplication.java
 Applicationオブジェクト。
 アプリケーションをWebコンテナにロードするときの開始点となる。
package org.wikipedia.ja.wicket;

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

public class HelloWorldApplication extends WebApplication {
    /**
     * Constructor.
     */
    public HelloWorldApplication() {
    }

    /**
     * @see org.apache.wicket.Application#getHomePage()
     */
    public Class getHomePage() {
        return HelloWorld.class;
    }
}

 web.xml
 Wicketサーブレット・クラスを定義し、クラスにアプリケーション・クラス名をパラメーターとして指定する。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">
    <display-name>Wicket Example</display-name>
    <filter>
        <filter-name>HelloWorldApplication</filter-name>
        <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
        <init-param>
            <param-name>applicationClassName</param-name>
            <param-value>org.wikipedia.ja.wicket.HelloWorldApplication</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>HelloWorldApplication</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

脚注

参考書籍 
「オープンソース徹底活用 WicketによるWebアプリケーション開発」 矢野勉 ISBN 978-4798022215

関連項目 
POJO

外部リンク 

 Apache Wicket 
 Wicket-ja
 twitter apache_wicket

Wicket
ウェブアプリケーションフレームワーク