SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
低い学習コストを重視した「Apache Click」 (3)

第6回

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>
図2 追加されたメニュー。menu.xmlで定義したものがレイアウトされ表示される。
図2 追加されたメニュー。menu.xmlで定義したものがレイアウトされ表示される。

 できあがったら、実際に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」というファイルを用意してください。そしてそれぞれ次のように記述しておきます。

HeloPage_en.properties
layout.header=Helo Page
layout.footer=copyright tuyano@2009.
page.title=sample page.
page.init_msg=Welcome to Apache Click World!!
HeloPage_ja.properties(native2ascii前)
layout.header=Heloページ
layout.footer=コピーライト 掌田津耶乃 2009年
page.title=サンプルページ
page.init_msg=ようこそ、アパッチ・クリックの世界へ!
HeloPage_ja.properties(native2ascii後)
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クラスをそれぞれ次のように修正しておきましょう。

helo.htm
<h2 id="title">$title</h2>
<p>$msg</p>
HeloPageクラス
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>
図3 メニューを選ぶことで、表示が英語と日本語に切り替わる。
図3 メニューを選ぶことで、表示が英語と日本語に切り替わる。

 修正したら、実際に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」で引数に読み込むメッセージの名前を指定すれば、その値が読み込まれます。現在のロケールに応じて、自動的に最適なプロパティファイルから値は読み込まれます。

次のページ
コントロールの作成

この記事は参考になりましたか?

Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4557 2009/12/10 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー