Apche Wicket自分用まとめ

お仕事で使うらしい、Apache Wicketについて勉強中。
復習がてら、今日学んだことを簡単にまとめておきます。
勉強は「WicketによるWebアプリケーション開発」で行っています。

Apache Wicketとは

  • javaで動くWebアプリケーションフレームの1つであり、サーブレットAPI仕様準拠なんので様々なJavaEEアプリサーバーで動作可能。
  • 設定ファイルいらずで、オブジェクト指向を生かしたWebアプリケーションの開発が可能になる。
  • ステートフルであり、ページの状態はWicketが保持。

詳しいインストール方法は本とか解説サイトを見ましょう。


基本的に、HTML上でコンポーネントを利用したら、それをJava上でも追加する形で使う。

<html>
<body>
  <form wicket:id="submitForm"></form>
</body>
</html>

としたのであれば、

Form<void> submitForm = new Form<void>("submitForm");
add(submitForm);

とする必要がある。

コンポーネントから入力(イベント)を受け取るには「onXXXXXX」をオーバーライドして用いる。
SubmitイベントならばonSubmitをオーバーライド。

Form<void> submitForm = new Form<void>("submitForm"){
  @override
  protected void onSubmit(){
    //処理内容
  }
}

※入力を受け取るため、Wicketを用いると上記のように匿名サブクラスを多様することになる。
このため、実際にアプリケーションを作る際には、javaの「匿名サブクラスから外部のローカル変数にアクセスする際はその変数はfinalである必要がある」という制約に注意する必要がある。

入力を受け取り、その値を使って処理するために入力値を受け取るための方法は、入力コンポーネントのgetModelメソッドを用いてモデルを取り出したあと、それに対してgetObjectメソッドを用いることで値を得る。
逆にオブジェクトに値を渡す場合は、setterを用いる。

TextField<String> field = …
//省略
Imodel<String> model = field.getModel();
String inputValue = model.getObjext();

ただし、modelをいちいち生成してやるのは面倒くさいので、getModelObjectを用いることで一発で取り出せる。

TextField<String> field = …
//省略
String inputValue = field.getModelObject();

Labelなどの非フォームコンポーネントは、型パラメータを指定出来ないためgetDefaultModelメソッドを用いた後にキャストを行う。
しかし、これも面倒くさいので、getDefaultModelObjectメソッドが用意されていたり、「たいてい、取り出したいのは文字だよね」ということで、getDefaultModelObjectAsStringを用いる。


実際にWicketで運用をしようと思うと設定が必要。
「配備モード」と「開発モード」の2種類があり、切り替え方法は4種類。

  1. メソッドのオーバーライド
  2. システムプロパティで設定
  3. ServletContextの初期化パラメータ
  4. filterの初期化初期化パラメータ

1.メソッドのオーバーライド

@override
public String getConfigurationType(){
  return Application.DEVELOPMENT;
}

4.filterの初期化初期化パラメータ

<filter>
  <init-pratform>
    <param-name>wicketconfiguraion</para-name>
    <para-value>deployment</para-valued>
  </init-pratform>
</filter>


HTMLタグとWciketコンポーネントを結びつけるにはwidth:id属性を用いる。(※配備モードで自動的に消される)


ビヘイビア化
タグの属性を変更するには、simpleAttributeModifierを用いる

new Label(id, "ラベル").add(nwe SimpleAttributeModifier["class", "red"]);

属性が固定値でないときは、AtttibuteModifierを用いる。

new Label(id, "ラベル").add(new AttributeModifier("colors",
  new AbstractReadOnlyModel<String>(){
    @override
    public String getObject(){
      return hasErro() ? "red" : "green";
    }
}));

タグに属性を新たに追加する場合はAttributeAppenderを用いる。


今日学んだのはこんな感じ。
あと、それぞれのオブジェクトについて細かくメソッドなんかを見たけど、それは詳しい解説サイトなり本なりを読んでください。