menu.xmlの作成
これでレイアウトへのメニューの組み込みはできました。では、実際に表示するメニューのデータを作成しましょう。WEB-INF内に新たに「menu.xml」というファイルを作成し、次のように記述をしてください。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<menu>
<menu label="Top" path="helo.htm" roles="tomcat, role1"/>
<menu label="Other" path="other.htm" roles="tomcat, role1">
<menu label="sub 1" path="sub1.htm" roles="tomcat, role1"/>
<menu label="sub 2" path="sub2.htm" roles="tomcat, role1"/>
</menu>
</menu>

できあがったら、実際にhelo.htmなどにアクセスしてみてください。画面の一番上にメニューが表示されます。ここでは「Top」「Other」という項目があり、これをクリックするとtop.htm、other.htmに移動します。また「Other」にマウスポインタを移動すると、さらに「sub 1」「sub 2」というメニュー項目が表示されます。これらはsub1.htm、sub2.htmというパスに設定してあります(今はページが用意されていないので、選ぶとエラーページに移動するはずです)。
ここでは、メニューは<menu>というタグを使って記述しています。これは次のような形で記述されます。
<menu label=ラベル path=パス roles=ロール />
ラベルは、実際にメニューに表示されるテキストとなります。またパスはクリックしたときに表示されるページを示します。rolesはロール(利用者のグループのようなもの)を指定するもので、これによりアクセスする利用者のグループごとにメニューの表示などを変えることができるようになっています。
ここでは階層的にメニューを表示させていますが、これもそのまま<menu>タグの中にさらに<menu>タグを用意するだけで作成されることが分かります。もちろん、さらにその中に<menu>タグを……という具合にして何階層もメニューを作っていくことができます。
国際化への対応
Webサイトのローカライズも頭を悩ませる問題です。Apache Clickでは、プロパティファイルを使って表示テキストを読み込むことで、他言語への対応を可能にしています。プロパティファイルの利用はサーバーサイドの開発ではよく見られますが、Apache ClickではPageクラス内に直接リソースからメッセージをロードするためのメソッドを備えており、より簡単に扱うことができます。
では、簡単な例として、helo.htmを英語と日本語の切り替え表示可能なページにしてみましょう。まず最初に、リソースファイルを用意します。HeloPage.javaが置かれている場所(src内のjp.codezine.clickパッケージ内)に「HeloPage_ne.properties」「HeloPage_ja.properties」というファイルを用意してください。そしてそれぞれ次のように記述しておきます。
layout.header=Helo Page layout.footer=copyright tuyano@2009. page.title=sample page. page.init_msg=Welcome to Apache Click World!!
layout.header=Heloページ layout.footer=コピーライト 掌田津耶乃 2009年 page.title=サンプルページ page.init_msg=ようこそ、アパッチ・クリックの世界へ!
layout.header=Helo\u30da\u30fc\u30b8 layout.footer=\u30b3\u30d4\u30fc\u30e9\u30a4\u30c8 \u638c\u7530\u6d25\u8036\u4e43 2009\u5e74 page.title=\u30b5\u30f3\u30d7\u30eb\u30da\u30fc\u30b8 page.init_msg=\u3088\u3046\u3053\u305d\u3001\u30a2\u30d1\u30c3\u30c1\u30fb\u30af\u30ea\u30c3\u30af\u306e\u4e16\u754c\u3078\uff01
見れば分かるように、プロパティファイルは「クラス名_ロケール.properties」といったファイル名で作成されます。こうすることにより、それぞれのPageクラスに応じて自動的に対応するプロパティファイルを探し出しメッセージを読み込むようになります。
helo.htmの国際化向け修正
では、Webページを修正しましょう。helo.htmとHeloPageクラスをそれぞれ次のように修正しておきましょう。
<h2 id="title">$title</h2> <p>$msg</p>
public class HeloPage extends LayoutPage {
public String locale="";
public String header = "";
public String footer = "";
public String title = "";
public String msg = "";
@Override
public void onInit(){
if (locale.equals("ja")){
this.getContext().setLocale(Locale.JAPAN);
} else {
this.getContext().setLocale(Locale.US);
}
header = this.getMessage("layout.header");
footer = this.getMessage("layout.footer");
title = this.getMessage("page.title");
msg = this.getMessage("page.init_msg");
}
}
さらに、両者を切り替えられるようにメニューを修正しましょう。menu.xmlを次のように書き換えてください。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<menu>
<menu label="Top" path="helo.htm" roles="tomcat, role1">
<menu label="JA" path="helo.htm?locale=ja" roles="tomcat, role1"/>
<menu label="US" path="helo.htm?locale=us" roles="tomcat, role1"/>
</menu>
</menu>
修正したら、実際にhelo.htmにアクセスしてみましょう。「Top」メニューにある「JA」を選ぶと日本語ページに、「US」を選ぶと英語ページに切り替わります。ここではメニューのpathに、path="helo.htm?locale=ja"というようにしてlocaleという値を追加しています。そしてHeloPage側にlocaleというpublicフィールドを用意してやります。Apache Clickにより、送られた値は自動的にlocaleフィールドに保管されますので、この値をチェックしてロケール情報を変更すればよいわけです。ロケール情報の変更は、例えばこのように行います。
this.getContext().setLocale(Locale.JAPAN);
getContextで取得されたContextインスタンスの「setLocale」を使うことでロケールを動的に切り替えることができます。切り替えたら、後はプロパティファイルから必要なメッセージを読み込んでフィールドに保管していくだけです。メッセージの取得は、このように行っています。
header = this.getMessage("layout.header");
「getMessage」で引数に読み込むメッセージの名前を指定すれば、その値が読み込まれます。現在のロケールに応じて、自動的に最適なプロパティファイルから値は読み込まれます。

