8

サーブレット コンテナーとして Tomcat 5.5 を使用しています。私の Web アプリケーションは .jar 経由でデプロイされ、WEB-INF ディレクトリの下にいくつかのリソース ファイル (文字列と構成パラメーターを含むテキスト ファイル) があります。Tomcat 5.5 は ubuntu Linux で動作します。リソース ファイルは、ファイル リーダーで読み取られます。
fr = new FileReader("messages.properties");

問題は、サーブレットがリソース ファイルを見つけられないことがありますが、何度か再起動すると機能し、しばらくすると機能しなくなります。誰かがサーブレットからリソース文字列を読み取る最良の方法を提案できますか? または、この問題の回避策はありますか? リソース ファイルを WEB-INF/classes の下に配置しても役に立ちません。

4

5 に答える 5

9

ContextListener やその他のライフサイクル リスナーなどのサーブレット対応クラスからこのファイルにアクセスしようとしている場合は、ServletContext オブジェクトを使用してリソースへのパスを取得できます。

これら 3 つはほぼ同等です。ClassLoader( getResourceAsStream を、クラスによって提供されるものと同じものと混同しないでください。動作が大きく異なります)。

void myFunc(ServletContext context) {
   //returns full path. Ex: C:\tomcat\5.5\webapps\myapp\web-inf\message.properties 
   String fullCanonicalPath = context.getRealPath("/WEB-INF/message.properties");

   //Returns a URL to the file. Ex: file://c:/tomcat..../message.properties
   URL urlToFile = context.getResource("/WEB-INF/message.properties");

   //Returns an input stream. Like calling getResource().openStream();
   InputStream inputStream = context.getResourceAsStream("/WEB-INF/message.properties");
   //do something
}
于 2008-11-19T23:44:57.027 に答える
5

問題は、相対パスを使用してファイルにアクセスしようとしていることだと思います。絶対パスを使用すると役立ちます (つまり、「/home/tomcat5/properties/messages.properties」)。

ただし、この問題の通常の解決策は、ClassLoader の getResourceAsStream メソッドを使用することです。プロパティ ファイルを「WEB-INF/classes」にデプロイすると、クラス ローダーで使用できるようになり、プロパティ ストリームにアクセスできるようになります。

テストされていないプロトコード:

Properties props = new Properties();

InputStream is =
getClass().getClassLoader().getResourceAsStream("messages.properties");

props.load(is);
于 2008-11-18T12:15:55.560 に答える
2

次のコードを使用して、サーブレット内からプロパティ ファイルを読み込みます。

public void init(ServletConfig config) throws ServletException {
    String pathToFile = config.getServletContext().getRealPath("")
        + "/WEB-INF/config.properties";
    Properties properties = new Properties();
    properties.load(new FileInputStream(pathToPropertiesFile));
}

これは Tomcat 6.0 で動作します

于 2009-07-03T13:45:24.243 に答える
2

使用する場合

new FileReader("message.properties");

次に、FileReader はベース ディレクトリ (Tomcat では /bin フォルダーである可能性が高い) からそのファイルを読み取ろうとします。

diciuが述べたように、絶対パスを使用するか、クラスローダーのリソースとしてロードします。

于 2008-11-18T14:28:35.980 に答える
0

私はJboss Seamに使用しました:

ServletLifecycle.getServletContext().getRealPath("")

于 2009-11-11T02:08:00.273 に答える