Advanced Java Services | Servlet Basics II |
Webanwendungen werden unterhalb des Verzeichnisses webapps angelegt. Das Bild zeigt den Standardaufbau einer Webapplikation an Hand des Verzeichnisses mit dem Namen myWebapp. Die class-Dateien müssen in einem eigenen Verzeichnis mit dem Namen classes liegen. Ein Unterverzeichnis hierin ist automatisch ein Package. Es kann auch mehrere Packages geben. Es empfiehlt sich Packages einzurichten obwohl sie für Servlets nicht zwindend notwendig sind. Das Verzeichnis lib ist optional. Hier werden servletspezifische Javaarchive gelagert, hier ist es die Datei log4j-x.x.xx.jar mit der man zum Debuggen Meldungen in eine log-Datei schreiben kann. Dieses Tool wird von der Apache Software Foundation zur Verfügung gestellt. Im Verzeichnis WEB-INF liegt die Konfigurierungsdatei web.xml und hier die zu log4j gehörende properties-Datei, mit der man log4j konfiguriert.
Die web.xml dient zur Konfigurierung der einzelnen Servlets, die der Servletcontainer bei einer Anfrage startet. Jede Webapplication hat eine eigene web.xml-Datei. Mit Hilfe dieser Datei können Daten an das Servlet übermittelt werden. Dabei können context-Parameter von jedem Servlet ausgelesen werden, init-Parameter jedoch nur von einem speziellen Servlet, da sie im Servlettag selbst vereinbart werden.
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>HelloWorld-Servlet</display-name> <!-- init-Parameter stehen immerhalb eines servlet-tags --> <servlet> <servlet-name>MyFirstServlet</servlet-name> <servlet-class>HelloWorld</servlet-class> <init-param> <param-name>log4j-file</param-name> <param-value>WEB-INF/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MyFirstServlet</servlet-name> <url-pattern>/hello.php</url-pattern> </servlet-mapping> <!-- in context-param kann nur ein key value paar stehen --> <context-param> <param-name>key1</param-name> <param-value>max</param-value> </context-param> <context-param> <param-name>key2</param-name> <param-value>straub</param-value> </context-param> </web-app>
init-Parameter sind key-value Paare, die im Servlettag gesetzt werden. Sie können nur ausgelesen werden, ein Servlet kann sie nicht im Code setzen. In der oben stehenden web.xml werden sie dazu verwendet, die Propertiesdatei von log4j ausfindig zu machen.
out.println("<b>Alle init-Parameter aus der web.xml:<br/>"); ServletConfig config = this.getServletConfig(); Enumeration<String> initEnum = config.getInitParameterNames(); while(initEnum.hasMoreElements()) { String key = initEnum.nextElement(); String value = config.getInitParameter(key); out.println("key = " + key + "<br/>" ); out.println("value = " + value + "<br/>" ); } out.println("</b><br/>" );
context-Parameter stehen unabhängig von einem Servleteintrag in der web.xml. Man kan sie auch im Servletcode setzen, dann werden sie allerdings nicht in der web.xml gespeichert, sondern intern im Objekt ServletContext. Zum Auslesen holt man sich ein Objekt vom Typ ServletContext und verwendet dann die Methode getInitParameterNames(). Der Name ist etwas unglücklich gewählt, da man ihn leicht mit der gleichlautenden Methode von Servletconfig verwechseln kann.
out.println("<b>Alle context-Parameter über ServletContext aus der web.xml:<br/>"); ServletContext context = this.getServletContext(); // Setzen context.setInitParameter("mykey", "myvalue"); Enumeration<String> contextEnum = context.getInitParameterNames(); for(;contextEnum.hasMoreElements();) { String key = contextEnum.nextElement(); String value = context.getInitParameter(key); out.println("key = " + key + "<br/>" ); out.println("value = " + value + "<br/>" ); } out.println("</b><br/>" );
Attribute sind key-value Paare die man in einem Servlet über den ServletContext setzten kann. Sie werden intern im Objekt ServletContext gespeichert. Das besondere an Attributen ist, daß zwar die keys Strings sind, aber die Werte beliebige Objekte sein können. Beim Start eines Servlets durch den ServletContainer werden bereits Attribute durch diesen gesetzt.
out.println("<b>Alle Attribute über ServletContext:<br/>"); ServletContext context = this.getServletContext(); // Setzen context.setAttribute("att1", new Integer(44)); context.setAttribute("att2", new Integer(67)); Enumeration<String> attributeEnum = context.getAttributeNames(); for(;attributeEnum.hasMoreElements();) { String key = attributeEnum.nextElement(); Object value = context.getAttribute(key); out.println("key = " + key + "<br/>" ); out.println("value = " + value + "<br/><br/>" ); } out.println("</b><br/>" );
Hier die Attribute, die Tomcat beim Start eines Servlets setzt. Die Werte, die mit Hexziffern enden sind Javaobjekte!
key = org.apache.tomcat.InstanceManager value = org.apache.catalina.core.DefaultInstanceManager@1534d8c key = org.apache.catalina.jsp_classpath value = /C:/server/Tomcat/webapps/HelloWorld/WEB-INF/classes/;/C:/server/Tomcat/webapps/HelloWorld/WEB-INF/lib/log4j-1.2.17.jar;... key = org.apache.tomcat.util.scan.MergedWebXml value = Servlet-01-HelloWorld param1 max param2 straub Servlet_01_HelloWorld... key = javax.servlet.context.tempdir value = C:\server\Tomcat\work\Catalina\localhost\HelloWorld key = org.apache.catalina.resources value = org.apache.naming.resources.ProxyDirContext@1ee3472 key = org.apache.tomcat.JarScanner value = org.apache.tomcat.util.scan.StandardJarScanner@1b55ca5 key = org.apache.jasper.compiler.TldLocationsCache value = org.apache.jasper.compiler.TldLocationsCache@1d5930f