Servlets und JSP U berblick Servlet Process Flow Request Client Response Servlet Servlet Servlet e.g. File DB, ... Resources Web Server & Servlet-Engine 2 Java Servlet API ä javax.servlet Package (generisch, protokollunabhangig) ü ü ü ü ü Servlet ServletRequest ServletResponse ServletContext ... ä javax.servlet.http Package (Erweiterung fu r HTTP) ü ü ü ü ü HttpServlet (Klasse) HttpServletRequest HttpServletResponse HttpSession ... 3 Einfaches Beispiel import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Servlet1 extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println( "<HTML><HEAD><TITLE>My Servlet</TITLE></HEAD><BODY>" + "<H2>Famous Example:</H2><HR>" + "<P>Hello World!</P>" + "</BODY></HTML>" ); out.close(); } } 4 Servlet Lebenszyklus ü Szenario (1) ä Engine ladt Servlet-Klasse und erzeugt ein Exemplar ü alle Variablen werden genau einmal initialisiert ü alle Variablen bleiben aktiv, solange das Servlet-Exemplar existiert ä Mehrere Web-Browser (=Clients) fordern das Servlet an ü Request wird vom Web-Server an Servlet-Engine und von dieser weiter zum entsprechenden Servlet gesandt ä Engine erzeugt pro Request einen Thread ü jeder Thread behandelt Request+Response des jeweiligen Clients ü jeder Thread hat Zugriff auf die Instanzvariablen des Servlets 5 Servlet Lebenszyklus - Szenario (2) 6 HttpServlet Lebenszyklus-Methoden ä init(ServletConfig) ü Variablen initialisieren, Ressourcen anfordern 1x ä service(HttpRequest, HttpResponse) oder doGet(HttpRequest, HttpResponse) oder doPost(HttpRequest, HttpResponse) , ... ü “Arbeitsß methoden ü pro Client Request einmal aufgerufen ä destroy() ü Ressourcen freigeben ü ev. Zustand speichern 1x 7 Client Request / Parameter – request.getParameter("name") liefert ü Wert (URL-decoded) des ersten Parameters mit Namen name oder ü null, falls nicht vorhanden – request.getParameterValues("name") liefert ü Array mit Werten (URL-decoded) fu r jedes Vorkommen des angegebenen Parameternamens – request.getParameterNames() liefert ü eine Aufzahlung (Enumeration) aller Parameternamen ð funktioniert gleich bei HTML POST und GET Requests 8 Beispiel: Formulare (HTML) <FORM ACTION="/servlet/ThreeParamsServlet" METHOD="GET"> First Parameter: <INPUT TYPE="TEXT" NAME="param1"></BR> Second Parameter: <INPUT TYPE="TEXT" NAME="param2"></BR> Third Parameter: <INPUT TYPE="TEXT" NAME="param3"></BR> <CENTER><INPUT TYPE="SUBMIT"></CENTER> </FORM> 9 Beispiel: Formulare (Servlet) public class ThreeParamsServlet extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); String title = "Reading Three Request Parameters"; out.println( "<HTML>\n<HEAD>\n<TITLE>" + title + "</HEAD></TITLE>\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + "<UL>\n" + " <LI><B>param1</B>: "+req.getParameter("param1")+"</LI>\n" + " <LI><B>param2</B>: "+req.getParameter("param2")+"</LI>\n" + " <LI><B>param3</B>: "+req.getParameter("param3")+"</LI>\n" + "</UL>\n" + "</BODY>\n</HTML>" ); Parameter out.close(); aus dem Formular } } 10 Beispiel: Formulare (Ergebnis) 11 response A.html Response Redirection ä "Antwort umleiten" zu andere Ressourcen ü JSP, HTML, Servlet, .... ä Browser fu hrt Umleitung durch ä Request wird NEU erstellt ü Ressource hat keinen Zugriff auf original Request + Parameter ä Standard response.sendRedirect("myHtml.html") "geht mich nichts an, nimm myHtml.html Seite!" 12 request Request Dispatching ä "Anfrage" weiterleiten an aktive Ressourcen ü Servlet, JSP ü aber KEINE HTML Seiten! ä Request bleibt erhalten ä RequestDispatcher Objekt RequestDispatcher dispatcher = getServletContext(). getRequestDispatcher("/servlet/Servlet2"); ü Servlet2 muss im gleichen Kontext sein – dispatcher.forward(request, response) ü Servlet1 darf noch keine Antwort zuru ckgesendet haben – dispatcher.include(request, response) ü "inkludieren" der Antwort von Servlet2 13 Sitzungen (Session Tracking) ä Wozu? ü HTTP ist ein nicht sitzungsorientiertes Protokoll ü Wenn der eBusiness-Kunde einen Artikel in den Einkaufskorb legt, woher weiö der Server, was schon im Einkaufskorb ist? ü Wenn der Kunde seine Online-Einkaufstour beendet, woher weiö der Server, welcher Einkaufskorb zu welchem Kunden geho rt? ä Wie bisher? ü Cookies ü URL mit Parameter ü Versteckte HTML-Form Felder ä Servlets bieten ein “Higher Level APIß 14 javax.servlet.http.HTTPSession ä HttpSession-Objekte existieren am Server request.getSession() liefert neues/existierendes Objekt ä Automatische Assoziation mit Client u ber Cookies oder URL-Rewriting ü falls Client-Browser Cookies nicht unterstu tzt: URL + Parameter ü URL + Parameter muss codiert werden: response.encodeURL ü hangt von ServletüServer ab! ä beliebige Objekte ko nnen gespeichert werden ü Hashtable-artige Schnittstelle (Schlu ssel ü Wert Paare) sessionObject.getAttribute (bzw. getValue vor V2.2) sessionObject.setAttribute 15 Session Beispiel protected void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // session variables HttpSession session = request.getSession(); shopbeans.Cart cart = null; synchronized (session) { cart = (shopbeans.Cart) session.getAttribute("cart"); if ( cart == null ) { cart = new shopbeans.Cart(); session.setAttribute("cart", cart); } } cart.placeOrder(); // ... other code ... } 16 Was sind Java Server Pages (JSP) ? ä Webseiten mit statischem und dynamischem Inhalt ü statisch: reines HTML ü dynamisch: spezielle JSP-Tags und Java Skripten ä JSP wird in ein Servlet konvertiert, wobei ü HTML in Java Quelltext (out.print) konvertiert wird, ü JSP Tags in Java Quelltext konvertiert werden und ü Java Quelltext direkt u bernommen wird ä A nderung der JSP hat automatische U bersetzung zur Folge ä Vergleiche ASP.NET (Active Server Pages) von Microsoft ä Erweiterung der Java Servlet API => alle Vorteile von Servlets 17 Warum JSP und nicht Servlets ? ä Striktere Trennung zwischen ü Erscheinungsbild (HTML) und ü Logik (JavaBeans) ä HTML Code kann wie gewohnt verwendet werden ä Veranderung des Aussehens ohne A nderung des dynamischen Inhalts. ä Kaum Programmierarbeit ?! ä Einfachere Handhabung ?! 18 JSP ü Aufbau einer Seite <%@ page import="java.util.*, java.text.DateFormat" %> <HTML><HEAD><TITLE>JSP Test</TITLE></HEAD> <BODY> <% int max = 100; %> <P>JSP Test - Za hler bis <%=max%> </P> 1. Eigenschafts Tags 2. Deklarationen 3. <% String dateString = DateFormat.getDateInstance(DateFormat.SHORT, <% for (int i = 0; i < max; i++) {%> <%=i%> <% }%> HTML gemischt mit Ausdru cke, Includes Scriptlets Tags implizite Objekte ... Locale.GERMAN).format(new Date()); %> <P>Datum: <%=dateString%> </P> </BODY></HTML> 19 Implizite Objekte ä Innerhalb einer JSP gibt es implizit einige Objekte ü ü ü ü request (javax.servlet.ServletRequest) out (javax.servlet.jsp.JspWriter) response (javax.servlet.ServletResponse) pageContext (javax.servlet.jsp.PageContext) ä Beno tigt wird meist nur “requestß und “outß ü <%=request.getParameter("id")%> ü <% ... out.println(”testⓨ ); %> 20 Deklaration, Ausdru cke, Include ä Deklaration (Variablen, Methoden, Funktionen) <%! int i = 0, j = 0; %> <%! Circle c = new Circle(2.0); %> <%! String M() {} %> Application scope !! (= Klassenvariablen bzw. Methoden und Funktionen) ä Ausdru cke <%=i%> <%=new Date()%> <%=M()%> Ausdruck wird in einen String konvertiert. ACHTUNG: kein abschlieöendes Semikolon. ä Include ü Bettet eine Datei statisch ein (zur U bersetzungszeit) ü JSP Dateien werden geparst <%@ include file="relativeURL" %> 21 Scriptlet ä Ein Tag mit beliebigem Java Quelltext ü Anweisungen ü Variablendeklarationen ä nur Java Quelltext, keine Tags! <% if(request.getParameter("name") == null) {%> <B>Der Parameter "name" fehlt.</B> <% } else { %> <B>Der Wert f&uuml;r "name" ist <%=request.getParameter("name")%></B> <% } %> 22 JSP Tag: forward ä leitet Request auf eine andere relative URL um ü Request Parameter mittels Param Tag mo glich <jsp:forward page="Relative URL"/> <jsp:forward page="<%=Ausdruck%>"/> leite Request auf XY <jsp:forward page="XY"> um und verwende die Parameter "username" und "passwort" <jsp:param name="user" value="jsmith"/> <jsp:param name="passwort" value="<%=Ausdruck%>"/> </jsp:forward> 23 JSP Tag: useBean ä Bean Instanz wird aus einer Klasse oder einem serialisiertem Template erzeugt ä Bean besitzt bestimmte Lebensdauer (page, request, session, application) <jsp:useBean id="myBool" class="ssw.util.BoolBean" scope="session"/> Lokalisiert oder erzeugt ein Exemplar von ssw.util.BoolBean und legt eine Referenz in myBool ab. <jsp:useBean id="myBool" class="ssw.util.BoolBean" scope="session"> <jsp:setProperty name="myBool" property="value" value="true"/> </jsp:useBean> property wird nur bei Instanzierung gesetzt 24 JSP Tag: setProperty ä Setzen einer oder mehrerer Eigenschaften eines Beans ä Verwendet JavaBean setter Methoden <jsp:setProperty name="Bean-Name" property="*" /> Setzt alle Eigenschaften, die einem Request Parameter entsprechen. <jsp:setProperty name="Bean-Name" property="Eigenschaftsname" /> Setzt die Eigenschaft entsprechend dem gleichnamigen Request Parameter. <jsp:setProperty name="Bean-Name" property="Eigenschaftsname" param="Parametername"/> Setzt die Eigenschaft entsprechend dem gegebenen Request Parameter. <jsp:setProperty name="Bean-Name" property="Eigenschaftsname" value="Wert" /> Setzt Eigenschaft auf entsprechenden Wert. <jsp:setProperty name="Bean-Name" property=" Eigenschaftsname" value="<%=Ausdruck%>" /> Setzt Eigenschaft auf entsprechenden Wert den der Ausdruck liefert. 25 JSP Tag: getProperty ä Ausgabe einer bestimmten Eigenschaft eines Beans ä Bean muö vorher mit jsp:useBean erzeugt werden ä Verwendet JavaBean getter Methode ä Indexed properties sind nicht mo glich ä Enterprise Beans ko nnen nicht angesprochen werden <jsp:getProperty name="Bean-Name" property="Name"/> 26 Beispiel: JSP => Servlet JSP <%@ page import="java.util.Date"%> <HTML> <HEAD><TITLE>Date Example</TITLE></HEAD> <BODY> <B><%=new Date()%></B> </BODY> </HTML> generiertes Servlet import java.util.Date; public class DateSample extends XXX implements javax.servlet.jsp.HttpJspPage { public void _jspService(HttpServletRequest request, HttpServletResponse response) { out.print("<HTML>\r\n<HEAD><TITLE>Date Example</TITLE></HEAD>\r\n<BODY>\r\n<B>ⓨ ); out.print(new Date()); out.print("</B>\r\n</BODY>\r\n</HTML>\r\n"); } } 27