init() metódus

És még egy-két hasznos apróság. Természetesen servlet inicializálásról beszélek. Mint már tudja, miután a webszerver létrehozta a szervlet objektumot és elhelyezte a tárolóban, meghívja a servlet init() metódusát . Felülbírálhatja ezt a módszert, és bármit inicializálhat benne, amire szüksége van.

Miért nem használunk konstruktort?

Mivel a szervlet létrehozásának folyamata valahogy így megy:

  • Létrehozunk egy objektumot, amelyből örököltünkHttpServlet
  • Hozzon létre egy objektumotServletContext, adja hozzá a servlet változót
  • Hozzon létre egy objektumotServletConfig, adja hozzá a servlet változót
  • A webszerver servletet csatol a tárolóhoz
  • Az init() metódus meghívása

A servlet konstruktorában sok belső változója még mindig nincs inicializálva. A konténer semmit sem tud a szervletről, a servlet semmit sem tud a környezetéről. Szerintem itt minden világos.

Írjunk egy servletet, amely inicializáláskor talál egy tulajdonságfájlt a beállításokkal:

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

Itt létrehozunk egy objektumotTulajdonságokés töltse be az adatokat a config.properties fájlból . Nos, a jövőben kiszállhat az objektumbólTulajdonságokkülönféle lehetőségek, például adatok az adatbázis eléréséhez, pl.

A tulajdonságfájl helyes betöltése

Egyébként mi van, ha a servlet nem fut a számítógépen?

Tegyük fel, hogy ide írták, és a világ másik részén lévő szerveren fut. Vagy több szerver. Hogyan lehet ebben az esetben helyesen betölteni a tulajdonságfájlt?

Jó kérdés. Normális esetben futás közben egy szervlet csak a tulajdonságfájljainak relatív elérési útját ismeri , az abszolút elérési útját nem, mert a servlet háborús fájlok bárhol tárolhatók.

Tehát meg kell találnunk az elérési utat, ahol a servletünk tárolva van (a servlet már inicializálva van), és hozzá kell adni egy relatív elérési utat :)

Valahogy így néz ki:

String path = absoluteServletParh + "relative path";

És mint mindig, egy ilyen elemi feladatnak sokszor megvan a maga kis „de”. A szervlet és a tulajdonságfájlja az archívumban van tárolva :) Persze nem feltétlenül, de előfordul. A property fájl gyakran jar vagy war fájlok belsejében található.

Vagyis előfordulhat, hogy a fájlnak nincs fizikai elérési útja a lemezen. De mivel a tároló képes volt betölteni a szervletet, valószínűleg be tudja tölteni a tulajdonságfájlt is.

Ehhez be kell szereznie az osztálybetöltő objektumot (ClassLoader), és kérje meg, hogy töltse fel a fájlt. Így fog kinézni:

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

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

getConfig() metódus

Egyébként nem minden paraméter adható át a szervletnek a tulajdonságfájlokban. Például a szervlet kölcsönhatásba lép más szervletekkel egy elosztott webalkalmazásban.

Ezután meg kell győződnie arról, hogy a tároló minden szükséges információt átad a szervletnek, amikor meghívja az init() metódust . Ráadásul pont ezt teszi.

A szervlet (ne feledje, hogy a HttpServlet osztályból öröklődött ) rendelkezik egy getServletConfig() metódussal . amely visszaad egy tárgyatServletConfig, amelyet a tároló hozta létre és inicializált. Ennek az objektumnak a következő módszerei vannak:

getInitParameterNames() A szervlet paraméterneveinek listáját adja vissza
getInitParameter(karakterlánc neve) Egy szervlet paramétert ad vissza a neve alapján
getServletName() A szervlet saját nevét adja vissza
getServletContext() Egy objektumot ad visszaServletContext

Írjunk egy servletet, amely visszaadja a paramétereinek listájátServletConfig„A. Ezek elhelyezése a web.xml fájlon keresztül történik:

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

A servlet a következő kóddal kaphatja meg a paramétereit:

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