2007 年 4 月 19 日 1 時 49 分

Struts のメッセージリソース


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


一覧表示のページである、list.jsp の出力を見てみると、
既定の処理が「deny」や「allow」などの英語表記である。
FormBean の値を、<bean:write> で直接出力しているからだ。

GUI の設計を考えると、ここは「許可」や「拒否」など、
日本語で表示しておくのが好ましい。

これを実現するためには、<bean:write> で書くのではなく、
値を調べて日本語に変換するコードを書く必要がある。
これを、直接 JSP の条件分岐で書いても良いのだが、
折角なので、メッセージリソースを使う事を考えてみよう。

Struts には、メッセージリソースという機能がある。
既定では、properties ファイルがベースとなっており、
PropertyResourceBundle を拡張したような機能を持つ。

properties ファイルは、文字列をキーとして、
文字列の値を管理する Map であると考えることができ、
その内容は、key=value という表記の行を並べたものだ。
Properties という Java の組み込みクラスを使えば、
このファイルの読み書きを行うことができる。

PropertyResourceBundle も、Java の組み込みクラスで、
自動的に properties の多言語化を行ってくれる。
元となるプロパティファイルに加え、
各言語用の properties ファイルを別に作成しておけば、
ロケールによって自動的に選択して読み込んでくれる。

たとえば、Messages.properies を用意したとしよう。
ここには英語で文字列を定義しているとする。
これが基準のプロパティファイルとなる。
追加で Messages_ja_JP.properies を用意し、
ここには日本語化したいものだけを定義しておく。

PropertyResourceBundle のインスタンスを作成する際には、
基準のファイルと、ロケールを指定する。

PropertyResourceBundle を日本語ロケールで作成すれば、
日本語に対応した Messages_ja_JP.properies が使われ、
Messages_ja_JP.properies に定義されていないものは、
基準となる Messages.properies から読み込んでくれる。
言わば、内容を言語別にオーバーライドできるのである。

さて、Struts の持つメッセージリソース機能は
PropertyMessageResources というクラスとなっており、
.properies ファイルの作成や言語別の上書き方法は、
PropertyResourceBundle と同様である。

ただし、インスタンスが特定のロケールに関連付けられる、
PropertyResourceBundle と異なり、
PropertyMessageResources は、
メッセージ取得時の任意のロケール指定や
メッセージの書式化やパラメータ置換等が可能となっている。

Struts は Web アプリケーションであるため、
パフォーマンス上の問題により、
PropertyMessageResources のインスタンスは、
アプリケーション実行中に存在し続ける。

しかしながら、Web アプリケーションのメッセージは、
通常、利用者のブラウザで設定されたロケールに依存する。
そのため、その都度要求に応じたロケールの文字列を、
インスタンスから自由に取得できる必要があるのである。

メッセージの書式化機能は、
エラーメッセージ等を表現するのに便利である。
メッセージリソースは、ActionMessage でも使うことができ、FormBean の検証機能と組み合わせることができる。

と、メッセージリソースは強力なのだが、
その多機能さゆえに、設定や利用方法が少しややこしい。
明日から、少しずつ組み合わせを考えていこう。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.