Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Webアプリケーションの設定ファイルの取得法について

Strutsを使ったWebアプリケーション作成の勉強中のものです。
ちょっとした設定でソースに直接書きたくないようなもの(データの最大表示行数などちょくちょく変更される可能性がありそうなもの)の、良い置き場所が無いものかと考えています。

現在はPropertiesクラスを使ってpropertiesファイルに設定しています。
一度読み込んでおけば何度も読み込む必要も無いため、staticな部分でpropertiesファイルの読み込み処理を行っています。
その際propertiesファイルの位置を指定するのに絶対パスを使っているため、ソース内に絶対パスが書かれていて、なんか良くないなと思っています。

そこで、Webアプリケーションのちょっとした設定を置いておくための、カッコいいと言いますか、汎用性に優れた設定ファイルの取得方があれば教えていただけないでしょうか。

9

回答

11232

閲覧

9件の回答

評価

0

例えばconfの下に入れておけば、conf/ファイル名で読んでくれるんじゃないでしょうか。

javax.servlet.http.HttpServletクラスだと、
this.getServletContext().getRealPath(ファイル名);
とかやるとコンテキストルートからの絶対パスが得られるので、これも使えます。

評価

0

回答ありがとうございます。

>例えばconfの下に入れておけば、conf/ファイル名で読んでくれるんじゃないでしょうか。
実験してみましたが、取得できませんでした。(空データになる)

>javax.servlet.http.HttpServletクラスだと、
this.getServletContext().getRealPath(ファイル名);
とかやるとコンテキストルートからの絶対パスが得られるので、これも使えます。 
こちらはStrutsだとロジック部がサーブレット部分とは切り離されているので難しいかもしれません。
JSP経由で取得する時は使えますね。

質問する前にもいろいろ実験していたのですが、ネットで検索すると/WEB-INF/classes直下に置けばいい、みたいなことが書いてあり試したのですが取得できませんでした。(空データになる)

また、あるクラスのインスタンスからクラスローダーを使って
Properties prop = new Properties();
prop.load( new FileInputStream( new File(  this.getClass().getClassLoader().getResource( "property/bbs.properties" ).toURI() ) ) );
とすると、Windowsではうまく読めるのにLinuxでは「toURI()ってな関数はありません」みたいなエラー(正式なエラー名は忘れました(汗))が出たんですよね。
ちなみにWindowsもLinuxもTomcat5.0.28です。

実際に開発などする場合、こういうちょっとした設定って沢山出てくると思うんですが、みんなこういうのをどうしているんでしょう???
あまり情報が無いんですよ〜。(T_T)

評価

0

conf/hogehoge.propertiesで読んでるんですよねえ…。
このあたりは、Strutsを使ってないので詳しいことは分かりませんが…。

>Windowsではうまく読めるのにLinuxでは「toURI()ってな関数はありません」みたいなエラー(正式なエラー名は忘れました(汗))が出たんですよね。ちなみにWindowsもLinuxもTomcat5.0.28です。
URLクラスだから、tomcatは関係ないのでは。
Linux側のJavaのバージョンが古いだけじゃないかと。
toURI()「メソッド」は1.5からです。


しかし、空データというのが解せません。
ファイルが見つかってなかったら、InputStreamで開いた時点で例外を投げるんじゃないでしょうか。

評価

0

>URLクラスだから、tomcatは関係ないのでは。
>Linux側のJavaのバージョンが古いだけじゃないかと。
>toURI()「メソッド」は1.5からです。
そのとおりです。
Linuxの方は安定性重視して1.4にしてたのでした。(汗)すみません。
1.5のリファレンスを鵜呑みにしちゃってました。

>しかし、空データというのが解せません。
>ファイルが見つかってなかったら、InputStreamで開いた時点で例外を投げるんじゃないでしょうか。
アプリケーションのログに気を取られていたのですが、catalina.outの方には例外が投げられていました。
アプリケーションサーバ側のスレッドで例外を受け取れていないので、止まらずにそのまま動いていたみたいですね。
ちなみに、conf/と/WEB-INF/classes、両方ともです。

でも、そこから考えるとpropertiesファイルを読み込むタイミングがアプリケーションサーバに依存されていないなら、アプリケーションサーバの相対パスが取れないのもなんとなく納得いきます。

評価

0

なるほど、classesの下というのが一般的なようですね。
アプリケーションクラスで、コンテキストパスなど、なんらかの絶対パスを得られるメソッドはないんでしょうか。

>アプリケーションサーバ側のスレッドで例外を受け取れていないので
問題を個別に対処する場合は、try〜catchで良いでしょう。
この場合は、アプリのログに「プロパティファイルを読み込めませんでした。」とか、出したほうが安全でしょうね。
プロパティを読み込めなかったとき、デフォルト値を設定するか、アプリ自体をエラー終了とするかetc.は、
アプリやプロパティの性格に拠るので、一般的な解はありませんが。

>1.5のリファレンスを鵜呑みにしちゃってました。
JavaDocでは、「導入されたバージョン」(ソース上では@sinse)という項目があります。
「なんでこっちだとエラーになるんだ」ということがあったら、そこに注目してみてください。

評価

0

回答ありがとうございます。

>JavaDocでは、「導入されたバージョン」(ソース上では@sinse)という項目があります。
>「なんでこっちだとエラーになるんだ」ということがあったら、そこに注目してみてください。
ご指摘頂くまで全く気付いてませんでした。(汗)
超絶ケアレスミスですね・・。

アプリケーションサーバ側で例外が取れないなら、例外をキャッチしてなんらかの処理を入れておくべきでしょうね。
まさかアプリケーションサーバが受け取ってくれないとは思ってませんでした。(汗)
staticな処理のみで設定ファイルを扱うのは、この辺が限界かもしれませんね。

その後いろいろ調べてみた所、やはり同じ事で悩んでいる方がいらっしゃいました。
http://java-house.jp/ml/archive/j-h-b/050431.html#body

ここにいろいろ方法が載ってました。
結局なんらかのインスタンスを介在して取得するのが良いようですね。
設定ファイルを見るたびに毎回ファイルを読み込むのもばかばかしいので、設定ファイルを取得するクラスのメンバをstaticにしておき、そのクラスのインスタンスを作成した時にメンバに値が入っていない時だけファイルを読み込むようにすればなんとかなるかな、と思いました。

Strutsやアプリケーションサーバ側には標準で、任意の設定ファイル等を取得する機能が無く、みんな苦労してるのが解っただけでも収穫があったと思います。
知らないところですごい簡単な方法があったりすれば、それはそれでショックですんで。(笑)

ありがとうございました。

評価

0

>設定ファイルを見るたびに毎回ファイルを読み込むのもばかばかしいので、設定ファイルを取得するクラスのメンバをstaticにしておき、そのクラスのインスタンスを作成した時にメンバに値が入っていない時だけファイルを読み込むようにすればなんとかなるかな、と思いました。
こういう処理に良く使われる手法で、シングルトンというパターンがあります。

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) instance = new Singleton();
        return instance;
    }
    :
}

こんなやつです。
コンストラクタがprivateなので、外からのインスタンス化ができず、使う側は
Singleton s = Singleton.getInstance();
のように使うことを強制されます。
これにより、インスタンスが確実にひとつしかできないことを保証できます。
Java標準APIでも、いくつかの箇所で使われています。
今回の場合、コンストラクタでファイルを読み込んであげると、ご希望のものができると思います。

>Strutsやアプリケーションサーバ側には標準で、任意の設定ファイル等を取得する機能が無く、みんな苦労してるのが解っただけでも収穫があったと思います。
私も覚えておいたほうがいいなと思いました。
こういう掲示板の利点は、回答する側も勉強できることがある、ということだと思います。

評価

0

>こういう処理に良く使われる手法で、シングルトンというパターンがあります。
これ、いいですね。
パターンとか普段は、どこで使えばいいねん!とか思ってますが、今回のは実例があるだけに覚えやすいですね。(笑)
早速使ってます。

ありがとうございました。

評価

0

今まであまり大きな規模のシステムを作っていないか、
拡張性を考慮したり、コーディングミスを事前に防いだりという考えがあまりないか、
もしくは大規模な追加修正を行うことに疑問を感じなかったかなどで、
パターンの本質を理解する場面がなかったのでしょう。
最近まで、私も同じようなものでしたが。

過去数十年間、プログラマが頻繁に用いた手法が、いわゆるパターンです。
GoFとか呼ばれているものは、単にそれらをピックアップし、名前をつけたに過ぎません。

パターンのどれが使えるかは、作るものによるので一概には言えませんが、
個人的には、コマンド、シングルトン、ステート、テンプレートメソッド、プロキシあたりは割と使います。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。