init() yöntemi

Ve birkaç başka yararlı küçük şey. Tabii ki, servlet başlatma hakkında konuşuyorum. Bildiğiniz gibi, web sunucusu sunucu uygulaması nesnesini oluşturup kapsayıcıya yerleştirdikten sonra, sunucu uygulamasının init() yöntemini çağırır . Bu yöntemi geçersiz kılabilir ve içinde ihtiyacınız olan her şeyi başlatabilirsiniz.

Neden bir yapıcı kullanmıyorsunuz?

Çünkü bir servlet oluşturma süreci şuna benzer:

  • Miras alınan bir nesne yaratıyoruzHttpServlet
  • bir nesne oluşturServlet Bağlamıservlet değişkenini ekleyin
  • bir nesne oluşturServletConfigservlet değişkenini ekleyin
  • Web sunucusu, servlet'i kaba ekler
  • init() yöntemini çağırma

Sunucu uygulamanızın yapıcısında, dahili değişkenlerinin çoğu hala başlatılmadı. Konteyner sunucu uygulamanız hakkında hiçbir şey bilmez, sunucu uygulamanız ise bağlamı hakkında hiçbir şey bilmez. Bence burada her şey açık.

Başlatıldığında, ayarlarla birlikte bir özellikler dosyası bulan bir sunucu uygulaması yazalım:

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

Burada bir nesne oluşturuyoruzÖzelliklerve config.properties dosyasındaki verileri dosyaya yükleyin . Peki, gelecekte nesneden çıkabilirsinizÖzelliklerveritabanına erişmek için veri gibi çeşitli seçenekler, örn.

Özellikler dosyası nasıl doğru şekilde yüklenir

Bu arada, ya sunucu uygulamanız bilgisayarınızda çalışmıyorsa?

Diyelim ki buraya yazdılar ve dünyanın başka bir yerindeki bir sunucuda çalışıyor. Veya birden çok sunucu. Bu durumda özellikler dosyası nasıl doğru şekilde yüklenir?

İyi soru. Normalde, bir sunucu uygulaması çalışırken, mutlak yolunu değil, yalnızca özellikler dosyalarının göreli yolunu bilir , çünkü sunucu uygulaması savaş dosyaları herhangi bir yerde depolanabilir.

Bu nedenle, sunucu uygulamamızın depolandığı yolu bulmamız (sunucu uygulaması zaten başlatıldı) ve buna göreli bir yol eklememiz gerekiyor :)

Şunun gibi görünüyor:

String path = absoluteServletParh + "relative path";

Ve her zaman olduğu gibi, böylesine basit bir görevin genellikle kendi küçük "ama" sı vardır. Servlet'iniz ve onun özellikler dosyası arşivin içinde saklanır :) Elbette şart değil, ama olur. özellikler dosyası genellikle jar veya savaş dosyalarının içinde saklanır.

Yani, dosyanızın diskte fiziksel bir yolu olmayabilir. Ancak kap, sunucu uygulamanızı yükleyebildiğinden, büyük olasılıkla özellikler dosyanızı da yükleyebilir.

Bunu yapmak için sınıf yükleyici nesnesini almanız gerekir (Sınıf Yükleyici) ve ondan dosyanızı yüklemesini isteyin. İşte nasıl görüneceği:

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

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

getConfig() Yöntem

Bu arada, özellikler dosyalarındaki tüm parametreler sunucu uygulamasına aktarılamaz. Örneğin, servlet'iniz dağıtılmış bir web uygulamasında diğer servlet'lerle iletişim kurar.

Ardından, init() yöntemini çağırdığında kabın gerekli tüm bilgileri sunucu uygulamanıza ilettiğinden emin olmanız gerekir . Üstelik tam da bunu yapıyor.

Sunucu uygulamanız ( HttpServlet sınıfından miras kaldığını unutmayın ) bir getServletConfig() yöntemine sahiptir . hangi bir nesne döndürürServletConfig, kapsayıcı tarafından oluşturuldu ve başlatıldı. Bu nesne aşağıdaki yöntemlere sahiptir:

getInitParameterNames() Sunucu uygulaması parametre adlarının bir listesini döndürür
getInitParameter(Dize adı) Adına göre bir servlet parametresi döndürür
getServletName() Sunucu uygulamasının kendi adını döndürür
getServletContext() Bir nesne döndürürServlet Bağlamı

Parametrelerinin bir listesini döndüren bir sunucu uygulaması yazalım.ServletConfig'A. Bunları oraya koymak web.xml dosyası aracılığıyla olacaktır:

	<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>

Bir sunucu uygulaması, parametrelerini şu kodu kullanarak alabilir:

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