Apache WicketでWebアプリ

Apache Wicket 1.3がリリースされて、盛り上がってきた?Apache Wicketを試してみる。

とりあえずHello,Worldしてみる

準備するもの

環境を準備する

まずはいつものようにeclipseでwebアプリ用の設定をする。
そしていつものようにweb.xmlを編集する。

web.xmlの編集

web.xml

<?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</display-name>
	<filter>
		<filter-name>wicket</filter-name>
		<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
		<init-param>
			<param-name>applicationClassName</param-name>
		<param-value>application.core.Application</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>wicket</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
WebApplicationを作成する。

名前のとおり、このwebアプリをあらわすクラスを作成する。

Application.java

package application.core;

import org.apache.wicket.protocol.http.WebApplication;
import application.pages.SamplePage;

public class Application extends WebApplication{

	@Override
	@SuppressWarnings("unchecked")
	public Class getHomePage() {
		return SamplePage.class;
	}
	
	@Override
    protected void init() {
        super.init();
        this.getRequestCycleSettings().setResponseRequestEncoding( "UTF-8");
        this.getMarkupSettings().setDefaultMarkupEncoding("UTF-8");
    }

}

上のようにorg.apache.wicket.protocol.http.WebApplicationのサブクラスを作成する。
このクラスは抽象クラスで必ず実装しなければならないクラスはgetHomePage()メソッドだけ。このメソッドは名前のとおり、ホームページを返すメソッド。ここでは後で作成するSampleHomePageクラスのClassオブジェクトを返す。
これでコンテキストルートのパスにアクセスがあった場合にこのページが表示される。
1.3ではジェネリクス対応していないため警告が出るので@SuppressWarnings("unchecked")をつける(1.4からは対応するらしい。。。色々議論が展開されているらしいが。。)

init()メソッドは文字コードの指定をする。Wicketではここで指定する以外にない?のかな?何かコンストラクタで設定したりしてもこの時点ではクラスがまだ不完全でうまく出来ないらしいのでinit()メソッド内でやるらしいっす。
ちなみに上がjavaファイルの文字コード、下がHTMLファイルの文字コード

実際にページを作成していく

Wicketはページとクラスのマッピングは規約によって行われるため設定ファイルは不要だ。その規約とは

HTMLファイル名とクラス名を同じにする(階層も同じにする)

これだけ注意して作成していく。

HTMLページを作成する

SamplePage.html

<?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="http://www.w3.org/1999/xhtml"
	xmlns:wicket="http://wicket.apache.org"
	xml:lang="ja" lang="ja">
  <head>
    <title>List Page</title>
    <style type="text/css" media="screen">
    <!--
        h1   { font-size: 16pt; background-color: orange; padding-top: 2px; padding-bottom: 2px }
    -->
    </style>
  </head>
  <body>
    <h1>Apache Wicketテスト</h1>
    <div wicket:id="test">テストだぜFuckin</div>
  </body>
</html>

Wicketで操作したい箇所にwicket:idでマークアップする。こうすることでjava内でその部分を動的に操作することが出来る。XHTMLなのでxmlnsを利用して独自の属性を定義してるんだね。xmlns:wicket="http://wicket.apache.org"の部分は別に書かなくてもいいらしいんだけど、個人的にはxmlとしておかしいから気持ち悪いし、警告も出るので書いている。

そのページのクラスを作成する

SamplePage.java

package application.pages;

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

public class SamplePage extends WebPage{
	public SamplePage() {
	    super();
            this.add( new Label("test", new Model("Hello, World!")));
	}
}

ページを作成するときは通常org.apache.wicket.markup.html.WebPageを継承する。swingと同じようにコンストラクタ内でページの部品を作成していく。名前から想像つくけど、
this.add( new Label("test", new Model("Hello, World!")));
の部分で、
自分自身(ページ)に"test"というIDがついたラベルに"Hello, World!"という文字列を持ったモデルを追加する
とすることでHTMLでマークアップした箇所を操作している。

動かしてみる

tomcatでもjettyでも何でもいいから、通常のwebアプリと同様に動かす。そしてブラウザから
http://localhost:8080/wicket
にアクセスする(/wicketの部分はコンテキスト)


このようになる。javaで挿入した"Hello, World!"という文字列がマークアップしたタグに表示されてれば成功。

う〜む。こんなに簡単に、しかもわかりやすく出来るなんて。。。。設定ファイルがないとかすばらしいね。javaもなんだかわかりやすくていいし。なによりコンセプトがいいと思う。

Apache Wicketなかなかいいな。好きになった。。もうちょっと勉強してみようかな。

今度はFormとかその辺をいじってみようっと。

以上。