[Wicket] propertiesファイルに変数を指定する

 Webページの多言語対応に便利なpropertiesファイルですが、このファイルに指定するメッセージには${(フィールド名)}の形で動的に値を埋め込むことができます。WicketにはStringResourceModelというモデルがあり、このモデルに渡すモデルのフィールドやゲッター、セッターが返す値を埋め込むことが可能です。

 Wicketのバージョンは1.5.2です。

 まず、propertiesファイルに以下のようなメッセージを記述します。

testmessage=${name}はとても便利なフレームワークです。

 そして、このtestmessageをJavaファイルから参照します。

Test test = new Test();
Label label = new Label(
    "test",
    new StringResourceModel("testmessage", this, new Model<Test>(test)))
);
add(label);

StringResourceModelはorg.apache.wicket.modelパッケージにあります。このStringResourceModelの第1引数にはメッセージのキーを、第2引数にはthisを、第3引数には値を引っ張ってきたいフィールドを持ったモデルを指定します。ここでは簡略化のためモデルではなく普通のクラスを使っているので、Modelクラスのインスタンスを仲介しています。
 この時のTestクラスの構造は以下のようになっています。

class Test implements Serializable {
    public String name = "Wicket";
}

propertiesファイルに指定した${name}は、Testクラスのnameフィールドを参照します。
 ちなみにhtmlファイルは以下のような感じ。特別なことは何もないです。

<span wicket:id="test"></span>

 propertiesファイルに指定したメッセージ内で${(フィールド名)}を使用しない(静的なメッセージである)場合は、StringResourceModelの第3引数はnullでも大丈夫ですが、その場合はgetStringでメッセージを取得したほうが楽です。

 また、Validatorによる出力メッセージの場合は、以下のような変数を指定することが可能です。

${label} org.apache.wicket.markup.html.form.FormComponent<T>のsetLabelで設定した文字列
${name} wicket:idの値
${input} テキストフィールド等、コンポーネントに入力された値

 Wicketはメッセージ周りがえらい扱いやすくていいですね。資料少ないけど。

 参考資料: https://cwiki.apache.org/WICKET/everything-about-wicket-internationalization.html

0 件のコメント :

コメントを投稿