Dynamische Webseiten Java servlets
Servlet- Engine mit eingebautem Webserver Architektur Browser Webserver Servlet- Engine Servlet Browser Servlet- Engine mit eingebautem Webserver Servlet
Genauer ... Quelle: http://www.research.ibm.com/journal/sj/373/bayeh1.gif
Servlet Engines Java Webserver (SUN) Websphere (IBM) Jserv (Apache) Referenzimplementierung Websphere (IBM) Application Server komplex Load Balancing .... Jserv (Apache) Apache module + Servlet Engine Tomcat (Apache) standalone oder Apache module einfach und schnell und viele andere
Servlet javax.servlet javax.servlet.http Java Klasse generisch http abgeleitet von HttpServlet keine main() Methode Überschreiben von doGet() und/oder doPost() ServletRequest Parameter, input Stream ServletResponse Session, outputStream
Lebenszyklus eines Servlets Servlet wird vom Anwender kompiliert beim ersten Aufruf von der engine geladen Klasse wird dynamisch geladen bei jedem weiteren Aufruf wird nur die entsprechende Methode ausgeführt genauer: ausgeführt wird service() die doHeader() ... ausführt und je nach Methode doGet() oder doPost() kaum Overhead
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(); }
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(); }
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);
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 ...
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 +
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(); }
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");
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) pw.println(count); count=new Integer(count.intValue()+1); session.setAttribute("COUNT",count);
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(); }
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());