- - PR -
StrutsでのMessageResourcesのファイル読み込みについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-10-29 18:49
みなさん、こんにちは。
// ようやく初めて、Strutsを使いはじめました。 struts-blankをコピーして、ようやく動かすことができて、Strutsがどんなものか把握しようといま、いろいろ触っています。 そこで、ご質問なのですが、MessageResourcesですが、Struts-config.xmlに <message-resources parameter="MessageResources" /> という書き方をするかと思います。 上記の場合 /WEB-INF/classes/MessageResources.properties が読み込まれると思います。 /WEB-INF/classesをベースとして、読み込まれると思うのですが、これをclassesより上位のプロパティファイルを読み込ませることは可能なのでしょうか。 例えば、 /WEB-INF/properties/MessageResources.properties を読み込ませたい場合、どういう方法があるのでしょうか。 classesがベースかと思ったので、 <message-resources parameter="../properties/MessageResources" /> としたのですが、読み込まれませんでした。 classesより上位のファイルを読み込ませることはできないのでしょうか。 // 単に、プロパティファイルを一つのディレクトリにまとめたいだけなのですが・・・。 ご存知の方がおいでましたら、ご教授いただけると幸いです。 | ||||
|
投稿日時: 2005-10-29 19:42
デフォルトのMessageResourcesを使う限り無理です。
このファイルの指定は、ServletContext#getResource(String)ではなく、 ClassLoader##getResource(String)を使っているからです。 MessageResourcesを拡張すれば可能かもしれませんが、初期化時に ServletContextが伝わらないので泥臭い方法しかないと思います。 | ||||
|
投稿日時: 2005-10-29 19:53
あしゅさん、ご返信いただきありがとうございます。
> デフォルトのMessageResourcesを使う限り無理です。 そうですか。 ご教授いただき、大変ありがとうございました。 しかし、それにしてもStrutsはすごいですね。 今まで、自分で実装していたメッセージ表示(essageResources)とか、フレームワークで提供してくれていて、すごいと思いました。 まだ、サンプルしか動かしたことがなのですが、これからもう少し勉強していこうと思います。 ご教授いただきまして、ありがとうございました。 | ||||
|
投稿日時: 2005-10-30 01:35
>あしゅさん
全てのAPサーバのWEBアプリのクラスローダに言える事ではないのですが、 Tomcatのクラスローダでは相対パス指定でリソースの参照が可能です。 どんたくおさんの方法は、結果から言うと無理なんですが、 概念的には100%の間違ではないです。 何故どんたくおさんの方法である、相対パスでの読み込みができないかと言うと、 Strutsではparameter属性の値を、 カレントスレッドのクラスローダを使用して読み込む前に、 ピリオドをスラッシュに置換して、".properties"を付加しています。 つまり、 parameter="../properties/MessageResources" では、 ClassLoader#getResourceAsStream("///properties/MessageResources.properties"); を実行している事になり、相対パスによる親の参照が失敗している事になります。 >どんたくおさん org.apache.struts.util.MessageResources org.apache.struts.util.MessageResourcesFactory を拡張して、そのファクトリクラスを factory="ファクトリクラス名" で、指定することにより独自のメッセージリソースを扱う事が可能です。 factory属性を省略した場合は org.apache.struts.util.PropertyMessageResources org.apache.struts.util.PropertyMessageResourcesFactory が使用されますが、 こちらのクラスを継承して、初期化部分を改造すればOKかなと思います。 #何故Strutsって、ResourceBundleを使用していないのかが不明ですね・・・ #リソースのロケールの管理を独自で実装しているっぽいです。 | ||||
|
投稿日時: 2005-10-30 12:28
どんたくおです。
かつのりさん、またご返信いただきましてありがとうございます。 > org.apache.struts.util.MessageResources > org.apache.struts.util.MessageResourcesFactory > を拡張して、そのファクトリクラスを > factory="ファクトリクラス名" > で、指定することにより独自のメッセージリソースを扱う事が可能です。 なるほど。 当方さりげなくStrutsをはじめたもので、かなり的を外しているかもしれませんが、struts-config.xmlで、 <message-resources parameter="MessageResources" /> に指定できるのは parameter属性とkey属性の二つとありました。 ということは、かつのりさんがご教授くださった、 factory="ファクトリ名" のようにする場合は、一度Strutsのソースコードを独自のメッセージリソースを使用するように変更する必要があるのでしょうか。 また、どこかの設定ファイル(?)を変更すれば独自のメッセージリソースを使用できるように変更できるのでしょうか。 いつも、質問ばかりで大変もうしわけございませんが、ご教授いただけると幸いです。 | ||||
|
投稿日時: 2005-10-30 17:11
Strutsのバージョンは何でしょうか? 1.1/1.2なら問題なく使用できますが、それ以前は私も検証していません。 ・org.apache.struts.util.MessageResources ・org.apache.struts.util.MessageResourcesFactory この2つのクラスを継承すればいいですよ。 で、org.apache.struts.util.MessageResourcesFactoryを継承したクラスを factory属性で指定します。 | ||||
|
投稿日時: 2005-11-02 00:17
かつのりさん、ご返信いただきながら、返信できずに大変すみませんでした。
一度かつのりさんからご教授いただいた方法につきまして、検証してからご返信させていただこうと思っていたのですが、仕事でのトラブル(?)が続出し時間をとることができませんでした。 検証でき結果がわかりましたら、またご報告させていただきます。 > Strutsのバージョンは何でしょうか? 大変申し訳ございません。 Strutsの1.2を使用しております。 取り急ぎご返信させてください。 | ||||
|
投稿日時: 2005-11-03 16:10
みなさん、こんにちは。
どんたくおです。 > 一度かつのりさんからご教授いただいた方法につきまして、検証 > してからご返信させていただこうと思っていたのですが、仕事での > トラブル(?)が続出し時間をとることができませんでした。 > 検証でき結果がわかりましたら、またご報告させていただきます。 先ほど確認させていただきました。 かつのり様より、ご教授いただきました。 > ・org.apache.struts.util.MessageResources > ・org.apache.struts.util.MessageResourcesFactory を継承するクラスを作成し、 <message-resources parameter="MessageResources" factory="XXXX"/> とすることで、classesより上位のプロパティファイルを参照することができました。 また、お助けいただきまして、本当にありがとうございました。 |