みなさん、こんにちは!
キャスレーコンサルティング、ID(インテグレーション&デザイン)部の柳です。

はじめに

今回は、Apache WicketのWebPageの継承について、ご紹介したいと思います。
Apache Wicketでは、HTMLをオブジェクトとして取り扱うことで、ウェブページを継承することが可能です。

そもそもApache Wicketって何?という方は、下記リンク先も併せてご参照頂けますと、幸いです。
Apache WicketでHelloWorld!

では、早速ですが画面レイアウトの制御について、触れていきます。

画面レイアウトの制御

画面レイアウトが、ヘッダ・フッタ・本文となる場合を例としました。

extend_layout

この組み合わせを全画面に適用したい場合、本来であれば各画面ファイル(例えばJSPファイル)に
他の画面ファイルを、インポートする処理が必要です。

しかし、Wicketを使用することで、画面ファイルもオブジェクトとして、管理する事ができます。

Javaの継承を使って、親クラスで子クラスの方式を制御することができるのと同じ考えで、
画面レイアウトを制御することが、可能となります。

<継承イメージ>

extend_flow

この継承イメージを、実際にソースに落とし込むと下記の様になります。

ソース

レイアウトの設定する親クラス

SuperPage.java

public class SuperPage extends WebPage {
    private static final long serialVersionUID = 1L;
    public SuperPage(final PageParameters parameters) {
        super(parameters);
    }
}

レイアウトの設定する親クラスのHTML

SuperPage.html

<body>
    

<div id="hd">
        

<div id="logo">
            <img src="logo.png" width="50px" height="50px" alt="Wicket Logo" />
            

<h1>ここはヘッダです。</h1>


        </div>


    </div>


    <wicket:child/>
    

<div id="ft">
        

<div id="banner">
            

<h1>ここはフッタです。</h1>


        </div>


    </div>


</body>

実際データを表示する子クラス

HomePage.java

public class HomePage extends SuperPage {
    private static final long serialVersionUID = 1L;
    public HomePage(final PageParameters parameters) {
        super(parameters);
        add(new Label("ver", getApplication().getFrameworkSettings().getVersion()));
        add(new Label("message", "これはWicketのサンプルページです。"));
    }
}

実際データを表示する子クラスのHTML

HomePage.html

<body>
    <wicket:remove>
        

<div id="hd">
            

<div id="logo">
                <img src="logo.png" width="50px" height="50px" alt="Wicket Logo" />
                

<h1>ここはヘッダです。</h1>


            </div>


        </div>


    </wicket:remove>
    <wicket:extend>
        

<div id="bd">
            

                Please mention the correct Wicket version:
                <wicket:container wicket:id="ver"></wicket:container>
            

            

                <wicket:container wicket:id="message"></wicket:container>
            

        </div>


    </wicket:extend>
    <wicket:remove>
        

<div id="ft">
            

<div id="banner">
                

<h1>ここはフッタです。</h1>


            </div>


        </div>


    </wicket:remove>
</body>

ソースのポイント

SuperPage.java

レイアウトを設定する、親クラスです。
Extends WebPageにより、WicketのWebPageクラスを継承します。

SuperPage.html

<wicket:child/>により子クラスの内容が入力されます。

HomePage.java

public class HomePage extends SuperPage {
親クラスであるSuperPageを継承します。

HomePage.html

<wicket:remove>

</wicket:remove>

このタグに囲まれているソースは、未反映となります。
未反映にも関わらず使用する理由としては、親クラスから取得するソースを表示することで、可読性を向上させております。

<wicket:extend>

</wicket:extend>

このタグに囲まれているソースは、親クラスの内容が反映されます。
それによって、子クラスの内容が入力されている親クラスの内容が、反映されます。

出力画面イメージ

extend_view

継承する上での注意点

<wicket:extend>と<wicket:child>の継承の中で、
wicketのidが定義されてない場合や、継承タグの漏れがある場合などは、
wicketのエラーが発生するので、Javaクラスに定義して関係とマッピングしなければなりません。

また、多重継承はJavaと同じ仕様で、禁止されています。

最後に

Wicketの継承について、少しでもイメージを掴めていただけたでしょうか?

継承を使用することで、画面レイアウトを一つのクラスを通じて、一括制御することができるようになります。

Wicketには他にもいろいろ機能がありますが、画面表示の機能をメインに今後も執筆していく予定です。
次回の技術ブログでは、クラス参照で画面を表示するPanelの機能について、ご紹介出来ればと思います。

最後までお読みいただき、ありがとうございました。