init() metod
Och ett par andra användbara småsaker. Naturligtvis pratar jag om servletinitiering. Som du redan vet, efter att webbservern har skapat servlet-objektet och placerat det i behållaren, anropar den servletens init()- metod . Du kan åsidosätta denna metod och initiera allt du behöver i den.
Varför inte använda en konstruktor?
Eftersom processen att skapa en servlet går ungefär så här:
- Vi skapar ett objekt som ärvt frånHttpServlet
- Skapa ett objektServletContext, lägg till dess servletvariabel
- Skapa ett objektServletConfig, lägg till dess servletvariabel
- …
- Webbservern bifogar servlet till behållaren
- Anropar metoden init().
I din servlets konstruktor är många av dess interna variabler fortfarande inte initierade. Behållaren vet ingenting om din servlet, din servlet vet ingenting om sitt sammanhang. Jag tror att allt är klart här.
Låt oss skriva en servlet som, när den initieras, hittar en egenskapsfil med inställningar:
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");
}
}
}
Här skapar vi ett objektEgenskaperoch ladda data från filen config.properties till den . Tja, i framtiden kan du ta dig ur objektetEgenskaperolika alternativ såsom data för att komma åt databasen, t.ex.
Hur man laddar egenskapsfilen korrekt
Förresten, vad händer om din servlet inte körs på din dator?
Låt oss säga att de skrev det här, och det körs på en server någonstans i en annan del av världen. Eller flera servrar. Hur laddar man egenskapsfilen korrekt i detta fall?
Bra fråga. Normalt, när en servlet körs, känner en servlet bara till den relativa sökvägen till dess egenskapsfiler, inte dess absoluta sökväg, eftersom servlet war-filer kan lagras var som helst.
Så vi måste ta reda på sökvägen där vår servlet är lagrad (servleten är redan initierad) och lägga till en relativ sökväg till den :)
Det ser ut ungefär så här:
String path = absoluteServletParh + "relative path";
Och som alltid har en sådan elementär uppgift ofta sitt eget lilla "men". Din servlet och dess egenskapsfil lagras i arkivet :) Inte nödvändigtvis såklart, men det händer. egenskapsfilen lagras ofta i jar- eller war-filer.
Det vill säga, din fil kanske inte har en fysisk sökväg på disken. Men eftersom behållaren kunde ladda din servlet, kommer den med största sannolikhet att kunna ladda din egenskapsfil också.
För att göra detta måste du hämta klassladdningsobjektet (ClassLoader) och be honom ladda upp din fil. Så här kommer det att se ut:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");
Properties prop = new Properties();
prop.load(stream);
getConfig() metod
Förresten, inte alla parametrar kan skickas till servleten i egenskapsfiler. Till exempel kommunicerar din servlet med andra servlets i en distribuerad webbapplikation.
Sedan måste du se till att behållaren skickar all nödvändig information till din servlet när den anropar sin init()- metod . Dessutom gör han just det.
Din servlet (kom ihåg att den ärvs från klassen HttpServlet ) har en getServletConfig()- metod . som returnerar ett objektServletConfig, skapad och initierad av behållaren. Detta objekt har följande metoder:
getInitParameterNames() | Returnerar en lista med servletparameternamn |
getInitParameter(strängnamn) | Returnerar en servletparameter med dess namn |
getServletName() | Returnerar servletens eget namn |
getServletContext() | Returnerar ett objektServletContext |
Låt oss skriva en servlet som returnerar en lista över dess parametrar frånServletConfig'A. Om du lägger dem där kommer att gå via web.xml-filen:
<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>
En servlet kan få sina parametrar med koden:
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));
}
}
}
GO TO FULL VERSION