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