init() メソッド

他にも便利な小物がいくつかあります。もちろん、私はサーブレットの初期化について話しています。すでにご存知のとおり、Web サーバーはサーブレット オブジェクトを作成してコンテナーに配置した後、サーブレットのinit()メソッドを呼び出します。このメソッドをオーバーライドして、その中で必要なものをすべて初期化できます。

なぜコンストラクターを使用しないのでしょうか?

サーブレットの作成プロセスは次のようになります。

  • から継承したオブジェクトを作成しますHTTPサーブレット
  • オブジェクトを作成するサーブレットコンテキスト、そのサーブレット変数を追加します
  • オブジェクトを作成するサーブレット構成、そのサーブレット変数を追加します
  • Webサーバーがサーブレットをコンテナにアタッチします
  • init()メソッドの呼び出し

サーブレットのコンストラクターでは、多くの内部変数がまだ初期化されていません。コンテナはサーブレットについて何も知りませんし、サーブレットもそのコンテキストについて何も知りません。ここですべてが明らかだと思います。

初期化時に設定を含むプロパティ ファイルを検索するサーブレットを作成しましょう。

public class PropertiesServlet extends HttpServlet {
    public init() {
         try (InputStream input = new FileInputStream("c:/path/to/config.properties")) {

             Properties prop = new Properties();
             prop.load(input);

             String databaseURL = prop.getProperty("db.url");
             String databaseUser = prop.getProperty("db.user ");
             String databasePassword = prop.getProperty("db.password");
	 }
  }
}

ここでオブジェクトを作成しますプロパティそして、 config.propertiesファイルからデータをロードします。まあ、将来的にはオブジェクトから抜け出すことができますプロパティデータベースにアクセスするためのデータなどのさまざまなオプション。

プロパティファイルを正しくロードする方法

ところで、サーブレットがコンピュータ上で実行されていない場合はどうすればよいでしょうか?

彼らがここでそれを書いて、それが世界の別の場所にあるサーバー上で実行されているとしましょう。または複数のサーバー。この場合、プロパティ ファイルを正しくロードするにはどうすればよいでしょうか?

良い質問。通常、サーブレットの war ファイルはどこにでも保存できるため、実行中、サーブレットは絶対パスではなく、プロパティ ファイルの相対パスのみを認識します。

したがって、サーブレットが保存されているパスを見つけて (サーブレットはすでに初期化されています)、それに相対パスを追加する必要があります:)

次のようになります。

String path = absoluteServletParh + "relative path";

そして、いつものように、このような初歩的なタスクには、多くの場合、独自の小さな「しかし」があります。サーブレットとそのプロパティ ファイルはアーカイブ内に保存されます :) もちろん、必ずしもそうとは限りませんが、実際にはそうなります。プロパティ ファイルは、多くの場合、jar ファイルまたは war ファイル内に保存されます。

つまり、ファイルにはディスク上に物理パスがない可能性があります。ただし、コンテナーはサーブレットをロードできたので、プロパティ ファイルもロードできる可能性が高くなります。

これを行うには、クラス ローダー オブジェクト (クラスローダー) そして、ファイルをアップロードするように依頼してください。以下のようになります。

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");

Properties prop = new Properties();
prop.load(stream);

getConfig() メソッド

ちなみに、すべてのパラメータをプロパティ ファイルでサーブレットに渡すことができるわけではありません。たとえば、サーブレットは分散 Web アプリケーション内の他のサーブレットと通信します。

次に、コンテナがそのinit()メソッドを呼び出すときに、必要なすべての情報をサーブレットに渡すことを確認する必要があります。さらに、彼はまさにそれを行います。

サーブレット ( HttpServletクラスから継承されていることに注意してください) にはgetServletConfig()メソッドがあります。オブジェクトを返すサーブレット構成、コンテナによって作成および初期化されます。このオブジェクトには次のメソッドがあります。

getInitParameterNames() サーブレットパラメータ名のリストを返します。
getInitParameter(文字列名) サーブレットパラメータを名前で返します
getサーブレット名() サーブレット自体の名前を返します
getServletContext() オブジェクトを返しますサーブレットコンテキスト

パラメータのリストを返すサーブレットを作成しましょう。サーブレット構成「A. これらをそこに配置するには、web.xml ファイルを使用します。

	<web-app> 
 	
        <servlet> 
            <servlet-name>Print-Servlet</servlet-name> 
            <servlet-class>PrintServlet</servlet-class> 
            <init-param> 
                <param-name>jdbc-driver</param-name> 
    	        <param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value> 
	        </init-param> 
        </servlet> 
  	
        <servlet-mapping> 
            <servlet-name>Print-Servlet</servlet-name> 
            <url-pattern>/print</url-pattern> 
        </servlet-mapping> 
  	
    </web-app>

サーブレットは、次のコードを使用してパラメータを取得できます。

public class PrintServlet extends HttpServlet {
    public void init() {
        ServletConfig config = this.getServletConfig();
        Enumeration<String> initParameterNames = config.getInitParameterNames();

        while (initParameterNames.hasMoreElements()){
       	     String key = initParameterNames.nextElement();
             System.out.println("%s: %s\n", key, config.getInitParameter(key));
    	}
  }
}