- - PR -
プロパティファイルの配置場所
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-06-22 17:51
初めて投稿します。
Tomcat5.0.25を使用してサーブレットからプロパティファイルを読み込む プログラムを作成してます。 プロパティファイルをWEB-INF\classes内に配置したのですが読み込もうとすると java.io.FileNotFoundExceptionエラーがでるので、どこのフォルダを参照しているのかを 調べるためにstoreメソッドでプロパティファイルを作成したみたところ C:\WinNT\system32の中にプロパティファイルが作成されていました。 C:\WinNT\system32の中にプロパティファイルを入れておけば読み書きできるようなのですが、 これをWEB-INF\classes内に置いて読み書きできるようにするにはどうすれば良いのでしょうか? なお、Tomcatの『Monitor Tomcat』から実行した場合はSystem32フォルダで、 『startup.bat』からTomcatを実行した場合はTomcatのインストールフォルダ (Tomcat 5.0のすぐ下)でプロパティファイルを認識しました。 ご教授お願いします。 | ||||||||
|
投稿日時: 2004-06-22 18:37
getRealPath()で取得したパスに保存してはいかがでしょうか。
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.html#getRealPath(java.lang.String) ただ、クラスタ化した場合に問題になりそうですので永続化したい情報は一般的に DB へ格納するのが安全です。 | ||||||||
|
投稿日時: 2004-06-22 19:05
ごめんなさい、ちゃんと読まずにレス返してました…
消去。 大ベテランって何事ですかorz [ メッセージ編集済み 編集者: シュン 編集日時 2004-06-22 19:21 ] あれ?やっぱり間違っていなかったみたいですね。 最初に書いておいた内容を復帰します。 プロパティファイルの読み込み方は、以下の方法がセオリーだと思います。 システムのインストール先の環境に依存しないようにするために、プロセスのコンテキストから見える位置にリソースを配置して、APIでルックアップしましょう、ということですね。 1.クラスパス上にプロパティファイルを配置 2.ClassLoader#getResource()(ServletプログラミングならばServletContext#getResource())でルックアップ、Propertiesでロード ClassLoader#getResourceAsStream()(ServletプログラミングならばSerervletContext#getResourceAsStream())でルックアップ、Propertiesでロード あるいはResoucreBundleのロード機能を利用してResoucrceBundle#getBundle()でロード getRealPath()は、Servletエンジンの実装によっては正しい値を返さないこともあるので、使うな、と昔どこかの資料で見た覚えがありますよ。 [ メッセージ編集済み 編集者: シュン 編集日時 2004-06-23 10:19 ] | ||||||||
|
投稿日時: 2004-06-22 19:29
どのようにプロパティファイルを読み込んでいるのでしょうか?
私が同様のことをする場合には、ClassLoader#GetResourceAsStreamを使用することが 多いです。その場合クラスローダには、WEB-INF/classes以下に配置されたクラスがロード されているものを指定したほうがいいでしょう。 | ||||||||
|
投稿日時: 2004-06-22 19:54
ご返事ありがとうございます。
getRealPath()でのパスの取得はうまくいったのですが、"使用すべきでない"との警告 がでました。 プロパティファイルの読み取りの為にテスト的にサーブレットを作っていたので話が ズレてしまっていたのですが、 Webアプリで使うデータベースのパスをプロパティファイルに登録しておこうと思い、 そのプロパティファイルを読み取る為のクラスを作成中でした。 具体的にはサーブレットからではなくビジネスロジック内からそのクラスを経由して プロパティファイルの読み取りをしたかったのですが・・。 サーブレットでのテストでは以下のようなソースで読込んだ内容を表示できるか 試していました。 String initialFile = "javahello.properties"; java.util.Properties prop = null; String readData = ""; prop = new java.util.Properties(); try { FileInputStream ips = new FileInputStream( initialFile ); prop.load( ips ); out.println("読込成功!"); out.println(prop.getProperty("data")); readData = prop.getProperty("data"); } catch (Exception ex) { out.println("読込でエラー発生"); out.println(ex.getMessage() ); ex.printStackTrace(); } | ||||||||
|
投稿日時: 2004-06-22 20:52
propertiesファイルって、一般的にはこうやって取るものじゃないでしょうか?
これなら、WEB-INF\classes にjavahello.properties を置けば見えるはずですが。 | ||||||||
|
投稿日時: 2004-06-22 20:56
この部分を、 InputStream ips = this.getClass().getClassLoader().getResourceAsStream( initialFile ); にしてみてください。 | ||||||||
|
投稿日時: 2004-06-23 11:00
ご返事ありがとうございます。
これでもできたのですが、ResourceBundleは多言語対応のために使用するようで、 javahello_ja.propertiesと名前を変更しなければいけませんでした。 使うのは日本のみであってもプロパティファイルにはデータベースへのパスを 格納しておきたかったので、用途が違うのかと思いためらってました。
これでWEB-INF/classesから読み取ることができました。ありがとうございます^^ 一つ疑問なんですが、プロパティファイルを読むにはHttpServletを継承している サーブレットクラス内からでないと読むことはできないのでしょうか? イメージ的には [HelloWorldServlet]→[データの取得をするクラス]→[データベースへアクセスするクラス] →[プロパティファイルを読み取るクラス] というような感じに[プロパティファイルを読み取るクラス]内でサーブレットは意識せずに プロパティファイルへアクセスしたかったのですが・・。 | ||||||||
