metode init()

Dan beberapa hal kecil berguna lainnya. Tentu saja, saya berbicara tentang inisialisasi servlet. Seperti yang sudah Anda ketahui, setelah server web membuat objek servlet dan meletakkannya di wadah, ia memanggil metode init() servlet . Anda dapat mengganti metode ini dan menginisialisasi apa pun yang Anda perlukan di dalamnya.

Mengapa tidak menggunakan konstruktor?

Karena proses pembuatan servlet berlangsung seperti ini:

  • Kami membuat objek yang diwarisi dariHttpServlet
  • Buat objekServletContext, tambahkan variabel servletnya
  • Buat objekServletConfig, tambahkan variabel servletnya
  • Server web menempelkan servlet ke wadah
  • Memanggil metode init()

Di konstruktor servlet Anda, banyak variabel internalnya masih belum diinisialisasi. Wadah tidak tahu apa-apa tentang servlet Anda, servlet Anda tidak tahu apa-apa tentang konteksnya. Saya pikir semuanya jelas di sini.

Mari menulis servlet yang, ketika diinisialisasi, menemukan file properti dengan pengaturan:

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");
	 }
  }
}

Di sini kita membuat objekPropertidan muat data dari file config.properties ke dalamnya . Nah, di masa depan Anda bisa keluar dari objek tersebutPropertiberbagai pilihan seperti data untuk mengakses database, misalnya.

Cara memuat file properti dengan benar

Omong-omong, bagaimana jika servlet Anda tidak berjalan di komputer Anda?

Katakanlah mereka menulisnya di sini, dan itu berjalan di server di suatu tempat di belahan dunia lain. Atau beberapa server. Bagaimana cara memuat file properti dengan benar dalam kasus ini?

Pertanyaan bagus. Biasanya, saat dijalankan, servlet hanya mengetahui jalur relatif dari file propertinya, bukan jalur absolutnya, karena file perang servlet dapat disimpan di mana saja.

Jadi, kita perlu mencari tahu jalur tempat servlet kita disimpan (servlet sudah diinisialisasi) dan menambahkan jalur relatif ke sana :)

Ini terlihat seperti ini:

String path = absoluteServletParh + "relative path";

Dan, seperti biasa, tugas dasar seperti itu sering kali memiliki "tetapi" kecilnya sendiri. Servlet Anda dan file propertinya disimpan di dalam arsip :) Tidak harus, tentu saja, tetapi itu terjadi. File properti sering disimpan di dalam jar atau file perang.

Artinya, file Anda mungkin tidak memiliki jalur fisik di disk. Tetapi karena penampung dapat memuat servlet Anda, kemungkinan besar penampung juga dapat memuat file properti Anda.

Untuk melakukan ini, Anda perlu mendapatkan objek pemuat kelas (ClassLoader) dan minta dia untuk mengunggah file Anda. Inilah tampilannya:

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

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

metode getConfig()

Omong-omong, tidak semua parameter dapat diteruskan ke servlet di file properti. Misalnya, servlet Anda berinteraksi dengan servlet lain dalam aplikasi web terdistribusi.

Maka Anda perlu memastikan bahwa penampung meneruskan semua informasi yang diperlukan ke servlet Anda saat memanggil metode init() . Selain itu, dia melakukan hal itu.

Servlet Anda (ingat bahwa itu diwarisi dari kelas HttpServlet ) memiliki metode getServletConfig() . yang mengembalikan objekServletConfig, dibuat dan diinisialisasi oleh container. Objek ini memiliki metode berikut:

getInitParameterNames() Mengembalikan daftar nama parameter servlet
getInitParameter(Nama string) Mengembalikan parameter servlet dengan namanya
getServletName() Mengembalikan nama servlet itu sendiri
getServletContext() Mengembalikan objekServletContext

Mari kita menulis servlet yang mengembalikan daftar parameternyaServletConfig'A. Menempatkannya di sana akan melalui file 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>

Servlet bisa mendapatkan parameternya menggunakan kode:

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));
    	}
  }
}