160 likes | 312 Views
Dynamische Webseiten. Java servlets. Browser. Webserver. Servlet- Engine. Servlet. Servlet. Servlet. Servlet. Browser. Servlet- Engine mit eingebautem Webserver. Servlet. Servlet. Servlet. Servlet. Architektur. Genauer. Quelle: http://www.research.ibm.com/journal/sj/373/bayeh1.gif.
E N D
Dynamische Webseiten Java servlets
Browser Webserver Servlet-Engine Servlet Servlet Servlet Servlet Browser Servlet-Engine miteingebautemWebserver Servlet Servlet Servlet Servlet Architektur
Genauer ... Quelle: http://www.research.ibm.com/journal/sj/373/bayeh1.gif
Servlet Engines • Java Webserver (SUN) • 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 • generisch • javax.servlet.http • http • Java Klasse • 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ötigHttpSession 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) count = new Integer(0); 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()); }