 
                                Dynamische Webseiten Java servlets Architektur Browser Webserver ServletEngine Servlet Servlet Servlet Servlet Browser ServletEngine mit eingebautem Webserver Servlet Servlet Servlet Servlet © [email protected] Genauer ... Quelle: http://www.research.ibm.com/journal/sj/373/bayeh1.gif © [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  Ggf. Konvertierung, z.B. int value = Integer.parseInt(par) double value = Double.parseDouble(par)  bei GET und POST  Problem: Parameter mit Sonderzeichen  Lösung: URL-encoding  z.B. ' ' (blank) als + © [email protected] Beispiel: Parameter public class HelloWorldPar 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"); String par = request.getParameter("ID"); // Output liefern wir ueber "normale" Java IO PrintWriter pw = response.getWriter(); pw.println("Hello World"); pw.println(par); pw.close(); } © [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] Beispiel: Session public class HelloWorldSession extends HttpServlet { private Integer count; public void init(ServletConfig conf) throws ServletException { super.init(conf); count = new Integer(0); } .... pw.println("Hello World"); HttpSession session = request.getSession(); count = (Integer) session.getAttribute("COUNT"); if (count == null) count = new Integer(0); pw.println(count); count=new Integer(count.intValue()+1); session.setAttribute("COUNT",count); © [email protected] Header modifizieren public class Uhr extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Was liefern wir zurueck ? response.setHeader("Refresh","5"); response.setContentType("text/html"); // Output liefern wir ueber "normale" Java IO PrintWriter pw = response.getWriter(); Date D = new Date(); pw.println("<HTML><BODY><h1>"); pw.println(D); pw.println("</h1></BODY></HTML>"); pw.close(); } © [email protected] Zugriff auf Datenbank public class TestEmpServlet extends HttpServlet { ... out.println("<html><body>"); try { Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection conn = DriverManager.getConnection ("jdbc:mysql://localhost/ba","till","haenisch"); Statement stmt = conn.createStatement (); ResultSet rset = stmt.executeQuery ( "select empno,ename from EMP"); while (rset.next()) { out.println(rset.getInt(1) + " " + rset.getString(2) + "<br>"); } } catch (Exception e) { out.println(e.getMessage()); } © [email protected]