metoda init().

Și alte câteva lucruri mici utile. Desigur, vorbesc despre inițializarea servlet-urilor. După cum știți deja, după ce serverul web a creat obiectul servlet și l-a plasat în container, apelează metoda init() a servlet-ului . Puteți suprascrie această metodă și inițializa tot ceea ce aveți nevoie în ea.

De ce să nu folosești un constructor?

Deoarece procesul de creare a unui servlet merge cam așa:

  • Creăm un obiect de la moștenitHttpServlet
  • Creați un obiectServletContext, adăugați variabila sa de servlet
  • Creați un obiectServletConfig, adăugați variabila sa de servlet
  • Serverul web atașează servlet-ul la container
  • Apelarea metodei init().

În constructorul servlet-ului dvs., multe dintre variabilele sale interne nu sunt încă inițializate. Containerul nu știe nimic despre servletul tău, servletul tău nu știe nimic despre contextul său. Cred că totul este clar aici.

Să scriem un servlet care, atunci când este inițializat, găsește un fișier de proprietăți cu setări:

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

Aici creăm un obiectProprietățiși încărcați datele din fișierul config.properties în el . Ei bine, în viitor puteți ieși din obiectProprietățidiverse opțiuni, cum ar fi date pentru a accesa baza de date, de ex.

Cum să încărcați corect fișierul de proprietăți

Apropo, ce se întâmplă dacă servletul tău nu rulează pe computer?

Să presupunem că l-au scris aici și rulează pe un server undeva în altă parte a lumii. Sau mai multe servere. Cum să încărcați corect fișierul de proprietăți în acest caz?

Buna intrebare. În mod normal, atunci când rulează, un servlet știe doar calea relativă a fișierelor sale de proprietăți, nu calea sa absolută, deoarece fișierele război servlet pot fi stocate oriunde.

Deci, trebuie să aflăm calea în care este stocat servletul nostru (servletul este deja inițializat) și să îi adăugăm o cale relativă :)

Arata cam asa:

String path = absoluteServletParh + "relative path";

Și, ca întotdeauna, o astfel de sarcină elementară are adesea propriul „dar”. Servletul dvs. și fișierul de proprietăți ale acestuia sunt stocate în arhivă :) Nu neapărat, desigur, dar se întâmplă. fișierul proprietăți este adesea stocat în fișierele jar sau war.

Adică, este posibil ca fișierul dvs. să nu aibă o cale fizică pe disc. Dar, deoarece containerul a reușit să vă încarce servletul, cel mai probabil va putea să vă încarce și fișierul de proprietăți.

Pentru a face acest lucru, trebuie să obțineți obiectul de încărcare a clasei (ClassLoader) și cereți-i să vă încarce fișierul. Iată cum va arăta:

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

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

Metoda getConfig().

Apropo, nu toți parametrii pot fi trecuți servlet-ului în fișierele de proprietăți. De exemplu, servletul dumneavoastră comunică cu alte servleturi într-o aplicație web distribuită.

Apoi trebuie să vă asigurați că containerul transmite toate informațiile necesare servlet-ului dvs. atunci când își apelează metoda init() . Mai mult, chiar asta face.

Servletul dvs. (rețineți că este moștenit din clasa HttpServlet ) are o metodă getServletConfig() . care returnează un obiectServletConfig, creat și inițializat de container. Acest obiect are următoarele metode:

getInitParameterNames() Returnează o listă de nume de parametri de servlet
getInitParameter(nume șir) Returnează un parametru servlet după numele său
getServletName() Returnează numele propriu al servlet-ului
getServletContext() Returnează un obiectServletContext

Să scriem un servlet care returnează o listă a parametrilor săi de laServletConfig'A. Punerea lor acolo va fi prin fișierul 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>

Un servlet își poate obține parametrii folosind codul:

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