Dynamische Webseiten CGI & co CGI - Lösung für alle ? Ja Nein CGI kann alles tun, was man für Anwendungen braucht flexibel (beliebige Programmiersprache,...) einfach portabel Performance Ablauf Webserver erkennt, daß Programm aufgerufen werden soll erzeugt neuen Prozeß (ggf. mit Skript Interpreter) dieser läuft ab und terminiert © [email protected] Lösungen 1) Programme als Module in Webserver gelinkt 2) Webserver mit eingebautem Skript-Interpreter Apache modules, nsapi, IIS dll Performance sehr gut Portabilität/Flexibilität weg Aufwendige Programmierung (APIs,...) z.B. Perl, PHP, ASP, OWAS (?), ... Portabilität/Flexibilität eingeschränkt Performance gut einfache Programmierung 3) Servlets/JSP im Prinzip wie 1) kombiniert Vorteile von beiden © [email protected] Architektur Browser Webserver ServletEngine Servlet Servlet Servlet Servlet Browser ServletEngine mit eingebautem Webserver Servlet Servlet Servlet Servlet © [email protected] Servlet Engines Java Webserver (SUN) Websphere (IBM) Apache module + Servlet Engine Tomcat (Apache) Application Server komplex Load Balancing .... Jserv (Apache) Referenzimplementierung standalone oder Apache module einfach und schnell und viele andere © [email protected] Servlet javax.servlet javax.servlet.http generisch http Java Klasse abgeleitet von HttpServlet keine main() Methode Überschreiben von doGet() und/oder doPost() ServletRequest Parameter, input Stream ServletResponse Session, outputStream © [email protected] Lebenszyklus eines Servlets Servlet wird vom Anwender kompiliert beim ersten Aufruf von der engine geladen bei jedem weiteren Aufruf wird nur die entsprechende Methode ausgeführt Klasse wird dynamisch geladen genauer: ausgeführt wird service() die doHeader() ... ausführt und je nach Methode doGet() oder doPost() kaum Overhead © [email protected] Hello World mit GET import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Was liefern wir zurueck ? // Hier: ASCII Text, kein HTML response.setContentType("text/plain"); // Output liefern wir ueber "normale" Java IO PrintWriter pw = response.getWriter(); pw.println("Hello World"); pw.close(); } } © [email protected] Hello World mit POST import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Was liefern wir zurueck ? // Hier: ASCII Text, kein HTML response.setContentType("text/plain"); // Output liefern wir ueber "normale" Java IO PrintWriter pw = response.getWriter(); pw.println("Hello World"); pw.close(); } } © [email protected] Hello World beide ? import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Was liefern wir zurueck ? // Hier: ASCII Text, kein HTML response.setContentType("text/plain"); // Output liefern wir ueber "normale" Java IO PrintWriter pw = response.getWriter(); pw.println("Hello World"); pw.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } © [email protected] } Initialisierung Zur Initialisierung kann die init-Methode überschrieben werden public void init(ServletConfig conf) throws ServletException { super.init(conf); count = 0; } z.B. Verbindung zur DB herstellen evtl. schlechte Idee (Fehlerbehandlung) Verbindungen zu factories,... aufsetzen Konfigurationsinformationen lesen ... © [email protected] Parameter HttpServletRequest.getParameter(name) String par = request.getParameter("ID"); liefert den Wert des Parameters (hier ID) als String bei GET und POST Problem: Parameter mit Sonderzeichen Lösung: URL-encoding z.B. ' ' (blank) als + © [email protected] Session Wie werden Informationen von einer Seite zur anderen transportiert ? etwa Benutzername, DB Verbindung,... z.B. Cookies, URL-rewriting,... manuell oder automatisch: Session Objekt HttpServletRequest.getSession() liefert HttpSession Methoden getAttribute(name)/setAttribute(name,Wert) liefert/setzt beliebiges Object cast nötig HttpSession session = request.getSession(); count =(Integer)session.getAttribute("COUNT"); © [email protected]