metoda init().

I kilka innych przydatnych drobiazgów. Oczywiście mówię o inicjalizacji serwletu. Jak już wiesz, po utworzeniu obiektu serwletu i umieszczeniu go w kontenerze serwer WWW wywołuje metodę init() serwletu . Możesz zastąpić tę metodę i zainicjować w niej wszystko, czego potrzebujesz.

Dlaczego nie użyć konstruktora?

Ponieważ proces tworzenia serwletu przebiega mniej więcej tak:

  • Tworzymy obiekt odziedziczony zHttpServlet
  • Utwórz obiektServletContext, dodaj jego zmienną serwletu
  • Utwórz obiektServletConfig, dodaj jego zmienną serwletu
  • Serwer WWW dołącza serwlet do kontenera
  • Wywołanie metody init().

W konstruktorze serwletu wiele jego zmiennych wewnętrznych wciąż nie jest zainicjowanych. Kontener nie wie nic o twoim serwlecie, twój serwlet nie wie nic o swoim kontekście. Myślę, że tutaj wszystko jest jasne.

Napiszmy serwlet, który po zainicjowaniu znajduje plik właściwości z ustawieniami:

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

Tutaj tworzymy obiektNieruchomościi załadować do niego dane z pliku config.properties . Cóż, w przyszłości możesz wydostać się z obiektuNieruchomościróżne opcje, takie jak dane dostępu do bazy danych, np.

Jak poprawnie załadować plik właściwości

Przy okazji, co jeśli twój serwlet nie działa na twoim komputerze?

Powiedzmy, że napisali to tutaj i działa na serwerze gdzieś w innej części świata. Lub wiele serwerów. Jak w takim przypadku poprawnie załadować plik właściwości?

Dobre pytanie. Normalnie podczas działania serwlet zna tylko ścieżkę względną swoich plików właściwości, a nie ścieżkę bezwzględną, ponieważ pliki wojny serwletów mogą być przechowywane w dowolnym miejscu.

Musimy więc znaleźć ścieżkę, w której przechowywany jest nasz serwlet (servlet jest już zainicjowany) i dodać do niego ścieżkę względną :)

Wygląda to mniej więcej tak:

String path = absoluteServletParh + "relative path";

I jak zwykle takie elementarne zadanie często ma swoje małe „ale”. Twój serwlet i jego plik właściwości są przechowywane w archiwum :) Niekoniecznie, oczywiście, ale się zdarza. properties jest często przechowywany w plikach jar lub war.

Oznacza to, że plik może nie mieć fizycznej ścieżki na dysku. Ale ponieważ kontener był w stanie załadować twój serwlet, najprawdopodobniej będzie mógł również załadować twój plik właściwości.

Aby to zrobić, musisz pobrać obiekt ładujący klasy (Ładowarka klas) i poproś go o przesłanie pliku. Oto jak to będzie wyglądać:

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

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

getConfig() Metoda

Nawiasem mówiąc, nie wszystkie parametry można przekazać serwletowi w plikach właściwości. Na przykład twój serwlet wchodzi w interakcję z innymi serwletami w rozproszonej aplikacji internetowej.

Następnie musisz upewnić się, że kontener przekazuje wszystkie niezbędne informacje do twojego serwletu, gdy wywołuje swoją metodę init() . Co więcej, właśnie to robi.

Twój serwlet (pamiętaj, że jest dziedziczony z klasy HttpServlet ) ma metodę getServletConfig() . który zwraca obiektServletConfig, utworzony i zainicjowany przez kontener. Ten obiekt ma następujące metody:

getInitParameterNames() Zwraca listę nazw parametrów serwletu
getInitParameter(Nazwa ciągu) Zwraca parametr serwletu według jego nazwy
pobierz nazwę serwletu() Zwraca własną nazwę serwletu
getServletContext() Zwraca obiektServletContext

Napiszmy serwlet, który zwraca listę swoich parametrów zServletConfig'A. Umieszczenie ich tam nastąpi poprzez plik 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>

Serwlet może uzyskać swoje parametry za pomocą kodu:

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