- PR -

StrutsでのMessageResourcesのファイル読み込みについて

投稿者投稿内容
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 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/08/05
投稿数: 613
投稿日時: 2005-10-29 19:42
デフォルトのMessageResourcesを使う限り無理です。
このファイルの指定は、ServletContext#getResource(String)ではなく、
ClassLoader##getResource(String)を使っているからです。

MessageResourcesを拡張すれば可能かもしれませんが、初期化時に
ServletContextが伝わらないので泥臭い方法しかないと思います。
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2005-10-29 19:53
あしゅさん、ご返信いただきありがとうございます。

> デフォルトのMessageResourcesを使う限り無理です。
そうですか。
ご教授いただき、大変ありがとうございました。

しかし、それにしてもStrutsはすごいですね。
今まで、自分で実装していたメッセージ表示(essageResources)とか、フレームワークで提供してくれていて、すごいと思いました。


まだ、サンプルしか動かしたことがなのですが、これからもう少し勉強していこうと思います。


ご教授いただきまして、ありがとうございました。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 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/08/29
投稿数: 88
投稿日時: 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のソースコードを独自のメッセージリソースを使用するように変更する必要があるのでしょうか。
また、どこかの設定ファイル(?)を変更すれば独自のメッセージリソースを使用できるように変更できるのでしょうか。

いつも、質問ばかりで大変もうしわけございませんが、ご教授いただけると幸いです。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-10-30 17:11
引用:

当方さりげなくStrutsをはじめたもので、かなり的を外しているかもしれませんが、struts-config.xmlで、
<message-resources parameter="MessageResources" />
に指定できるのは
parameter属性とkey属性の二つとありました。


Strutsのバージョンは何でしょうか?
1.1/1.2なら問題なく使用できますが、それ以前は私も検証していません。

・org.apache.struts.util.MessageResources
・org.apache.struts.util.MessageResourcesFactory
この2つのクラスを継承すればいいですよ。
で、org.apache.struts.util.MessageResourcesFactoryを継承したクラスを
factory属性で指定します。
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2005-11-02 00:17
かつのりさん、ご返信いただきながら、返信できずに大変すみませんでした。

一度かつのりさんからご教授いただいた方法につきまして、検証してからご返信させていただこうと思っていたのですが、仕事でのトラブル(?)が続出し時間をとることができませんでした。
検証でき結果がわかりましたら、またご報告させていただきます。

> Strutsのバージョンは何でしょうか?
大変申し訳ございません。
Strutsの1.2を使用しております。

取り急ぎご返信させてください。
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2005-11-03 16:10
みなさん、こんにちは。
どんたくおです。

> 一度かつのりさんからご教授いただいた方法につきまして、検証
> してからご返信させていただこうと思っていたのですが、仕事での
> トラブル(?)が続出し時間をとることができませんでした。
> 検証でき結果がわかりましたら、またご報告させていただきます。
先ほど確認させていただきました。
かつのり様より、ご教授いただきました。
> ・org.apache.struts.util.MessageResources
> ・org.apache.struts.util.MessageResourcesFactory
を継承するクラスを作成し、
<message-resources parameter="MessageResources" factory="XXXX"/>
とすることで、classesより上位のプロパティファイルを参照することができました。

また、お助けいただきまして、本当にありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)