wicket勉強会メモ

id:t_yanoさんの紹介記事がわかりやすい。
http://www.javelindev.jp/wicket/

特徴がよくわかるエントリ
http://d.hatena.ne.jp/t_yano/20070116/1168972384

Wicketはライトウェイトなフレームワークじゃない。でも気持ちがいい。

  • 必要な環境

以下をWEB-INF/libにインポートする。

    • wicket-1.3.2.jar
    • wicket-XXXX-1.3.2.jar(たくさんあるけど、wicketについてくるので全部入れてよいと思われる)
    • slf4f-api-1.3.2.jar

テンプレートエンジンvelocityは必ずしも必要ない

    • velocity-1.4.jar
    • velocity-dep.1.4jar

以下は実際に利用するロガーによって代わる

    • slf4f-log4j12-1.3.2.jar
    • log4j-1.2.13.jar
  • 関連リンク

本家 http://wicket.apache.org/index.html
ロギングラッパ http://www.slf4j.org/download.html
wicket最新版は1.3.2
1.3からapacheのトップレベルのプロジェクトとなり、パッケージ名他が変更されている。

基本的な作成方法
http://journal.mycom.co.jp/articles/2006/05/08/wicket/

但し、上のページはバージョンが古いので下記のエントリ参照
http://d.hatena.ne.jp/kajilab/20080226/1204037826

  • 内部クラス、無名クラス

http://www.javaroad.jp/java_class15.htm
内部クラスを復習しておくこと

  • 基本的な理解

構築しようとするアプリケーションをorg.apache.wicket.protocol.http.WebApplicationのサブクラスとして作る

制作しようとするhtmlコンテンツをxxxx.htmlとして作る
さらに、それに対応するjavaコードをorg.apache.wicket.markup.html.WebPageのサブクラスとして作る。
そのhtmlファイルとjavaコードは原則として同じファイルシステム上の階層に置く


WebPageクラスはコンテナであり、Label、Formなど様々なページの構成要素をaddすることにより作る。

構成要素とhtml上の要素とをひも付けするのは "wicket:id" 属性で表現されるidである。
例)

<span wicket:id="message">ここにメッセージが表示される。</span>

javaコード上のmessageにひも付けされた内容によって、"ここにメッセージが表示される"の中身が書き換わる。

このhtmlコンテンツの要素に相当するjavaコード上のオブジェクトをモデルオブジェクトと呼ぶ。
モデルオブジェクトはIModelインターフェースを実装しているクラスである。

  • ExamplePage.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>ここにタイトルを挿入</title>
</head>
<body>
 <span wicket:id="message">ここにメッセージが表示される。</span>
 
<form wicket:id="form">

	<input wicket:id="textField" type="text"/>
	<input wicket:id="nextButton" type="submit" value="Next"/>
</form>

    <dl wicket:id="entryList">
        <dt><span wicket:id="title">2006/8/30</span></dt>
        <dd><span wicket:id="entry">記事のdescriptionです。</span></dd>
    </dl>

   <div wicket:id="feedback">ここにエラー内容を表示</div>
</body>
</html>


NextPage.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>ここにタイトルを挿入</title>
</head>
<body>
 <span wicket:id="nextMessage">ここに次のメッセージが表示される。</span>
 </body>
</html>

public class ExamplePage extends WebPage {
    private static final long serialVersionUID = 1L;

    public ExamplePage() {
            //表示する文字をセットしたLabelを作成しページに追加
            super.add(new Label("message", "Hello Wicket!"));
            
            
            Form form = new Form("form");
            add(form);
            
            TextField textField =new TextField("textField", new Model()) ;
//            textField.setRequired(true);
//            textField.add(new PatternValidator("^http://.*$"));
            form.add(textField);
            
            add( new FeedbackPanel("feedback"));
            
            Button nextButton = new Button("nextButton"){
                private static final long serialVersionUID = 1L;
                public void onSubmit() {
//                	setResponsePage(NextPage.class);
                        setResponsePage(new NextPage(this.getParent().get("textField").getModel()));
                }
            };//匿名クラス
            form.add(nextButton);
            

            //リストビューを作る
            final IModel entryListModel = new LoadableDetachableModel(){
            	protected Object load() {
                    List<String> entryList = new ArrayList<String>();
                    for(int i=0;i<15;i++){
                        entryList.add("sampleentry"+i);            	
                    }
					return entryList;
				}
            };
            
            final ListView listView = new ListView( "entryList", entryListModel) {
                public void populateItem(ListItem item) {
                    final String entry = (String)item.getModelObject();
                    item.add( new Label( "title", entry.substring(entry.length()-1, entry.length())));
                    item.add( new Label( "entry", entry));
                }
            };
            add( listView);
            
            
    }
}
public class NextPage extends WebPage {
    private static final long serialVersionUID = 1L;

    public NextPage() {
            super.add(new Label("nextMessage", "これは2ページ目です。"));
    }
    
    public NextPage(IModel model) {
        super.add(new Label("nextMessage", model));
    }
}