Newuserguide意訳 - My First Application

My First Application

これから作るアプリケーションは簡単Hello World!です。非常に簡単ですがアプリケーションですがHello, World!がWicketの仕組みにおいてWebページをどのように作るか示しています。その次のステップでは、若干のインタラクティビティによって、シンプルなフォーム関連のコンポーネント開発をする方法を示しています。
最終的なHTMLは次のコードを生み出すはずです:

<html>
  <body>
    Hello, world!
  </body>
</html>
The HTML

最終的な結果(HTML)はシンプルですが、それを実装する方法はいくつかあります。この例ではテキストHello, World!を作るために'Label'呼ばれるコンポーネントを使います。
そして基本的に私たちは考慮するべき2つのものがあります:

  1. the HTML page
  2. the label component

HTMLページのための中身は以前と同じです:

<html>
  <body>
    Hello, world!
  </body>
</html>

ヘッダー情報を加えて、スタイルシートを使用したり、javascript などを置くことも、もちろん可能です。ここでは例のために、省略しています。

このHTMLコードは詐欺みたいなもんだ。だって僕らは要求されてる文字列をプログラム的に生成したんじゃなくて、HTMLに直接埋め込んでるだけなんだから。Wicketコンポーネントを通してテキストをレンダリングするようにするために、WicketにWebページのどの部分がコンポーネントであるか宣言する必要があります。この場合、私たちはラベルコンポーネント定義でテキストを置き換えることができます。

<html>
  <body>
    <span wicket:id="message">Message goes here!</span>
  </body>
</html>

ここではspan要素の中にwicket:idを使用しコンポーネントをどこにレンダリングするかを定義しています。ここで実現したことは、単に静的なメッセージを出力するといった単純なものではありません。WicketにWebページのどこへラベルコンポーネントレンダリングするべきかを宣言するだけでメッセージを出力するアプリケーションが作れてしまうのです。次のセクションで実際にWikcetで、どのように動作をしてメッセージを出力したのかを見ていきます。

The Java Code

WicketでWebページを作ることは2つの作業からなりたっています。まず1つめは、WicketコンポーネントがHTMLのどこにレンダリングされるか定義すること、もうひとつはWebページに必要とされる機能をJavaクラスで実装することです。この例では、WicketにLabelコンポーネントレンダリングするするということと、LabelコンポーネントにHello,World!の文字列を出力しなさいという定義する必要があります。このセクションではこの作業を1ステップで行います。
まず最初にWebページを作る必要があります。WicketにはWebページを表現するWebPageクラスがあります。Wicketでは、すべてのWebページはこのWePageクラスを継承する必要があります。そして、WicketではHTMLファイルとclassファイル名が同じにする必要があります。例えばIndex.htmlとIndex、IndexPage.htmlとIndexPageあるいはHelloWorld.htmlとHelloWorldという具合です(もちろんクラスファイルのソースファイルはxxxx.javaですよ)。そして、このHTMLファイルとクラスファイルは同じクラスパス上にある必要があります。ですが、とくに理由がない限り同じディレクトリに格納するの方法が一般的です。htmlファイルとjavaファイルというスタイルは最初は違和感があるかもしれません。しかし、このペアは1つのコンポーネントでもあるので、それは再利用可能な生産性の高い方法になります。

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

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

Wicket1.3からパッケージ名が変わったので、以前から1.3以前を利用していたユーザは注意が必要です。もし1.3以前を利用していたならばパッケージ名を変更してください。パッケージ名にorg.apacheを追加すれば良いです。
例えば次のようになります。

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

これを次のように変更します。

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

WicketからHTMLにコンポーネントを加えるとき、文字列の形式でIDを指定する必要があります。上記の例では、コンポーネントのIDはmessageになります。idはページ内でユニークである必要があります。いいかえればページ内で同じIDは許されません(ページが別なら問題ありません)。
HTMLタグのIDはコンポーネントで指定するIDと対になります。なので以下のようにHTMLでは記述していました。

<span wicket:id="message">Message goes here</span>

こう指定することで、Wicketはスコープ内でmessageのコンポーネントを自動的に検出します。また同じidのコンポーネント上にModelを持つことになります。このModelがコンポーネントのステート(状態)を保持しています。Modelが任意のオブジェクトをラップして、そしてこのModelオブジェクトからコンポーネントにデータを渡します、そしてそれがWebページに出力されることになります。今回の例で言うと、ModelはStrig型のHello World!をラップしし、そしてHTML側のspanタグのボディーを置き換えることになります。基本的にWicketではModelのインスタンスを作って、そしてそれをコンポーネント(ModelはIModelインタフェースの実装クラスである必要があります)と結び付ける必要があります。そんなに難しいことではありません、多くのコンポーネントはモデルを組み立てるのに便利なコンストラクターが用意されています。上記のラベル例でも、コンストラクターにString型の文字列を渡してあげるだけで、それはLabelコンポーネントのためのシンプルなModelを生成しているのです。
一般に、あなたはコンポーネントに柔軟に実装するためにModelを使用することは、とても良い実装方法です。
上記のサンプルを実行させるにはもう1つApplicationオブジェクトが必要です。
ApplicationオブジェクトはWebアプリケーションないに1つあれば良いです、そしてそれはアプリケーションに設定を行うクラスでもあります。
今回のサンプルでは以下のように作成します:

package mypackage;

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

public class HelloWorldApplication extends WebApplication
{
    public Class getHomePage()
    {
        return HelloWorld.class;
    }
}

メモ:Wicketがすぐにテンプレートファイルに対する変更を検知出来るように以下のように設定しておく良いでしょう(運用時はdeploymentを指定する必要があります)、これはweb.xmlに次の設定を含めるか、JVMの起動オプション時に -Dwicket.configurationを使用して設定することが可能です。

<context-param>
  <param-name>configuration</param-name>
  <param-value>development</param-value>
</context-param>
web.xml configuration

アプリケーションを実行するにはweb.xmlに次のコードを加えてください。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
   "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<context-param>
  <param-name>configuration</param-name>
  <param-value>development</param-value>
</context-param>

<filter>
  <filter-name>WebApplication</filter-name>
    <filter-class>
      org.apache.wicket.protocol.http.WicketFilter
    </filter-class>
    <init-param>
      <param-name>applicationClassName</param-name>
      <param-value>mypackage.HelloWorldApplication</param-value>
</init-param>

  <filter-mapping>
    <filter-name>WebApplication</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

これで最初のWicketアプリケーションを動かす準備が出来ました!

Deploying the application

とりあえずWicketのアプリケーション作りたいという方はWicket QuickStart を使うことで簡単に出来ます。何度かリリースを重ねたためjettyからのいくつかのjarファイルが除かれたことに注意してください:その場合はビルドパスに手作業でlib/org.mortbay.servlet.jarとext/jasper-*.jar を加える必要があります。

もし、手作でパッケージを作ることを望むなら、次のディレクトリ構造が必要です

WEB-INF/
    classes/
      HelloWorldApplication.java
      HelloWorld.java
      HelloWorld.html
    lib/
      wicket-1.3.0.jar
      slf4j-simple-1.4.3.jar.
      slf4j-api-1.4.3.jar
    web.xml

手動でアプリケーションを場合は、wicket-1.3.0.jarをclasspathに追加して、.java ファイルを作ってください。実行の際には、libディレクトリの中のすべての.jar ファイルがclasspathにある必要があります。たいていのWebサーバーと servletコンテナは(Tomcatもその1つ)があなたの classpathのlibディレクトリ以下のライブラリを自動的にをロードします。Wicketアプリケーションを作るには便利IDEを利用したほうが良いでしょう。IDEを利用することでビルド/実行といった作業がインタラクティブに行えます。環境はeclipseNetBeansTomcat等といった形で好みで選ぶことができます。

目次へ