WicketはWebアプリケーションを、Swingアプリのように作れるわけですが、そうは言っても作ったあとの動作はやっぱりWebアプリケーションなわけです。Ajaxコンポーネントを使うことで、Webっぽくない動作をすることもできますが、Javascriptを使ったクライアントサイドのロジックも必要です。一番単純な例では、削除ボタンを押したときに「削除してもよろしいですか?はい・いいえ」みたいな確認ダイアログです。これぐらいならばJavascriptで即時に確認したほうがいいです。
この章では、WicketコンポーネントでJavascriptを使う方法を書いています。「全部サーバーサイドでやれ」っていうような閉鎖的なものではなく、このような拡張性も柔軟にできるようになっています。
まずは、Wicket抜きで、HTML+Javascriptだけで解決する方法。submitボタンのonclick属性に記述したスクリプトの戻り値がfalseであれば、submitしないので確認ダイアログに使用できます。
ただ、確認ダイアログを表示するボタンを配置するたびに、Javascriptを記述するのは面倒なので、確認ダイアログ付ボタン的なコンポーネントを作ります。
Panelを継承して、htmlとJavaコンポーネントを作成します。htmlは2つの部分に分けられます。
1つは、<wicket:head>で囲まれるヘッダー部。もう1つはPanelコンポーネントのレンダリングに使用される<wicket:panel>で囲まれる部分です。このコンポーネントが配置されると、htmlのヘッダー部に、<wicket:head>ないの記述がレンダリングされます。
したがって、ヘッダー部にJavascriptを記述して、パネル部にSubmitボタンの記述をすることで、確認ダイアログ付ボタン的なコンポーネント(=ConfirmDelete)コンポーネントを作成することができます。
Chapter10 Using Javascriptからの引用
<wicket:head>
<script type="text/javascript">
function getConfirmation(){
return confirm("削除してもOK?");
}
</wicket:head>
<wicket:panel>
<input type="submit" value="Delete" onclick="return getConfirmation()" />
</wicket:panel>
このようにコンポーネント化するだけで、htmlのほうはすっきりしました。デザイン的に影響のあるようなコンポーネント化ではないため、このようなコンポーネント化はどんどん進めるべきだと思います。
ここまでくると次にやりたいのは、確認ダイアログに表示するメッセージを、htmlにハードコーディングせずに、プログラミングしながら設定したいこと。コンポーネント利用単位でメッセージを指定できるようにしたい。
そこで、AttributeModifierを使用します。この例に限らず、htmlテンプレートにない属性を追加したり、書き換えたりすることができる優れもの。まあちょっと気持ち悪いけど、Java側のコードからonclick属性の値を指定してコンポーネントを生成します。そうするとJavaコンポーネントの生成時にメッセージを指定できるようになります。
new ConfirmButton("delete", "Really delete?");次のJavascriptのnamespace(名前空間)の話は、Wicketとは関係なくJavascriptにおける話です。最後に、Javascriptのソースをhtmlではなくjsファイルに記述し外だしにした際に、htmlテンプレートやJavaソースと同じように、Javascriptも同じパッケージ配下に配置したくなります。その際の参照方法です。
ResourceReferenceとHeaderContributorを使って、WebContextにJavaScriptを置くのではなく、Wicket経由でリソースにアクセスすることができます。







