Dokumentation J2SE C:\j2sdk1.4.1\docs\index.html Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4-1 Marc Domenig Was ist ein Servlet? Ein Servlet ist ein Java Programm, das in einem Webcontainer lebt. http://www.canoo.com/ Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4-2 1 Dokumentation J2EE C:\Programme\jwsdp1_0_01\docs\api\index.html Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4-3 Dynamische Konfiguration des Servletcontainers http://<host>:8080/manager/install? path=/mywebapp&war=file:/path/to/mywebapp.war! Auspacken der Servletklassen mywebapp.war Institut für Informatik Universität Basel jwsdp-1_0/work/ Standard Engine/localhost/ WEB-INF/classes/... Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4-4 2 2. Methode zur Installation eines Servlets WAR-File Eine Webanwendung kann auf einem Server installiert werden, indem das WAR-File in den webapps Ordner kopiert wird. Konfiguration server.xml <Host ... appBase="webapps“ ... liveDeploy="true" ... unpackWARs=“true" name="localhost"> htttp://jakarta.apache.org Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4-5 2.9 Filter neu seit Version 2.3 Vorbearbeiten von Requests und Nachbearbeiten von Responses Lebenszyklus ähnlich dem eines Servlets, – init(FilterConfig config) – doFilter(ServletRequest req, ServletResponse res, FilterChain chain) – destroy() Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4-6 3 Filter Einsatzmöglichkeiten: – Authentifizierung, Logging, BildKonvertierung, Kompression, Verschlüsselung, XSL/T Filter, etc. Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III import javax.servlet.*; import java.io.IOException; public class SimpleFilter implements Filter { private FilterConfig filterConfig; www.ifi.unibas.ch/studies Klassenvariable Zugriff auf Konfiguration (web.xml) public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) { try { System.out.print ("Within Simple Filter ... "); System.out.println ("Filtering the Request ..."); chain.doFilter (request, response); Java Apache XML (JAX) Lektion 4: Servlets III Vorbearbeitung Nächster Filter oder Servlet System.out.print ("Within Simple Filter ... "); System.out.println ("Filtering the Response ..."); Institut für Informatik Universität Basel 4-7 Nachbearbeitung www.ifi.unibas.ch/studies 4-8 4 } catch (IOException io) { System.out.println ("IOException raised in SimpleFilter"); } catch (ServletException se) { System.out.println ("ServletException raised in SimpleFilter"); } } public FilterConfig getFilterConfig() { return this.filterConfig; } Return KonfigurationsObjekt public void setFilterConfig (FilterConfig filterConfig) { this.filterConfig = filterConfig; Schreibt die Konfiguration in } die Klassenvariable } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4-9 Verketten von Filter Reihenfolge wird in der web.xml Konfigurationsdatei definiert. Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 10 5 web.xml (Filter Tags) <filter> <filter-name>Logger</filter-name> <filter-class>filters.LoggerFilter</filter-class> </filter> <filter-mapping> <filter-name>Logger</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 11 LoggerFilter package filters; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public final class LoggerFilter implements Filter { private FilterConfig filterConfig = null; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { long startTime = System.currentTimeMillis(); String remoteAddress = request.getRemoteAddr(); String remoteHost = request.getRemoteHost(); String reqURI = request.getRequestURI(); String browserUsed = request.getHeader("User-Agent").toLowerCase(); Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 12 6 LoggerFilter chain.doFilter(request, response); filterConfig.getServletContext().log("Request Originated from IP " + remoteAddress + "(" + remoteHost + "), using browser (" + browserUsed + ") and accessed resource " + reqURI + " and used " + (System.currentTimeMillis() - startTime) + " ms" ); } public void destroy() { this.filterConfig = null;} public void init(FilterConfig filterConfig) { this.filterConfig = filterConfig;} } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 13 LoggerFilter 2002-11-14 14:46:53 Request Originated from IP 127.0.0.1(localhost), using browser (mozilla/5.0 (macintosh; u; ppc mac os x; en-us; rv:1.1) gecko/20020826) and accessed resource /lekt3/randomforward and used 6 ms 2002-11-14 14:46:55 Request Originated from IP 127.0.0.1(localhost), using browser (mozilla/5.0 (macintosh; u; ppc mac os x; en-us; rv:1.1) gecko/20020826) and accessed resource /lekt3/html/regenschauer.gif and used 1 ms 2002-11-14 14:50:44 Request Originated from IP 127.0.0.1(localhost), using browser (mozilla/5.0 (macintosh; u; ppc mac os x; en-us; rv:1.1) gecko/20020826) and accessed resource /lekt3/prime and used 3 ms Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 14 7 Was ist ein Cookie? 4Ein Cokie sind kleine Textinformation 4vom Server zum Client gesendet 4Jedes Mal, wenn der Browser die Seite wieder besucht wird das Cookie geschickt. 4HTTP Verbindungen sind zustandslos. 4Cookies können Daten über mehrere HTTP Verbindungen speichern. 4RFC 2109 Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 15 2.10 Cookies • Zur Verwaltung von Cookies gibt die spezielle Cookieklasse. • Damit ein Cookie Informationen speichern kann, muss das Cookie erstellt werden und bei der Antwort dem Header angehängt werden. • Alle Informationen in Cookies müssen Textdaten sein • Einsatz: 4 Identifizierung eine Users 4 Personifizierte Homepages, Portale, User Profiles 4 Automatisches login Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 16 8 Servlet Cookie API Erzeugen mit: c = new Cookie(name, value) Attribute: public String getComment() public void setComment(String comment) public String getDomain() public void setDomain(String domainPattern) c.setDomain(.unibas.ch) Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 17 Servlet Cookie API public String getMaxAge() public void setMaxAge(int lifetime in Sekunden) lifetime < 0 das Cookie nicht speichern lifetime = 0 das Cookie von der Disk löschen public String getPath() public void setPath(String path) path =“/ “ Alle Seiten des Servers erhalten das Cookie path = “/ifi/user “ Bei allen Seiten unterhalb dieses Pfades schickt der User-Agent das Cookie Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 18 9 Bsp: Private static final String SUM_KEY = “” … Int sum=…; Cookie sumCookie = new Colkie (SUM_KEY, Integer.toString(sum)); response.setContentType(“text/html”); response.addCookie(sumCookie); • Falls keine Lebensdauer angegeben wird (setMaxAge(intervall)) lebt das Cookie während einer Browser Session. • Falls das intervall negativ ist, wird das Cookie nach verlassen des Browser zerstört. • Falls der Wert 0 ist, wird das Cookie sofort wieder zerstört. Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 19 Beispiel SetCookies package cookies; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SetCookies extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { for(int i=0; i<3; i++) { // Default maxAge is -1, indicating cookie // applies only to current browsing session. Cookie cookie = new Cookie("Session-Cookie-" + i, "Cookie-Value-S" + i); response.addCookie(cookie); Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 20 10 Beispiel SetCookies cookie = new Cookie("Persistent-Cookie-" + i, "Cookie-Value-P" + i); // Cookie is valid for an hour, regardless of whether // user quits browser, reboots computer, or whatever. cookie.setMaxAge(3600); response.addCookie(cookie); } response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Setting Cookies"; Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 21 Beispiel SetCookies out.println (ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + "There are six cookies associated with this page.\n" + "To see them, visit the\n" + "<A HREF=\"/servlet/cookies.ShowCookies\">\n" + "<CODE>ShowCookies</CODE> servlet</A>.\n" +"<P>\n" + "Three of the cookies are associated only with the\n" + "current session, while three are persistent.\n" + "Quit the browser, restart, and return to the\n" + "<CODE>ShowCookies</CODE> servlet to verify that\n" + "the three long-lived ones persist across sessions.\n" + "</BODY></HTML>"); } } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 22 11 2.11 Session Tracking • Identifizierung und Speicherung persönlicher Daten A RnEm Q eE+ld ID R SIuDn g ID: ETWEFDR234ewdw • Warenkorb Lösung: • Session mit ID ID: JKLMGHNB45kdse43k Institut für Informatik Universität Basel www.ifi.unibas.ch/studies Java Apache XML (JAX) ID: JEWTSDTRWE45rrtt Lektion 4: Servlets III 4 - 23 HTTP ist zustandslos Es gibt bei HTTP keine Möglichkeit Daten zwischen den einzelnen Anfrage auszutauschen. Der Server hat keine Information über Vorgeschichte oder Zugehörigkeit der verschiedenen eintreffenden Anfragen Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 24 12 Session Tracking Techniken Grundtechniken: • Cookies Amzon.com http://lw10fd.law10.hotmail.msn.com/ cgi-bin/HoTMaiL?curmbox=F000000001 <INPUT TYPE="hidden" &a=4f15a3f4b9e618bb68727d60fcba29 NAME="p_sess_id" d1 • URL-Rewriting hotmail.com VALUE="1BE12318ECCE2571214 F630AF7D941"> • Versteckte Formulare yellownet.ch Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 25 Cookies String sessionID = makeUniqueString(); Cokie sessionCookie = new Cokie(“jsession“, sessionID); sessionCookie.setPath(“/ “); response.addCookie(sessionCookie); Server: Generierung einer eindeutigen ID Client: Verwaltet Cookies Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 26 13 URL-Rewriting String originalURL = “http://host/path/index.html“ String info = “jsession=1234“ out.println(“<A HREF=\““ + originalURL + “;“ + info + “\“> …. </A>“); Server: Generierung einer eindeutigen ID Client: URL enthält mit zusätzliche Information. Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 27 Hidden Form Fields <FORM ACTION="onl_kdl_kto.buch_list_get" METHOD="POST" NAME=Bewegungen> ... <TD>Lastkonto</TD> <TD>40-143413-5 CHF Guggisberg Martin <INPUT TYPE="hidden" NAME="p_lkto_nr" VALUE="401434135"> ... <INPUT TYPE="hidden" NAME="p_sess_id" VALUE="1BE12318ECCE2571214F630AF7D941"> <INPUT TYPE="hidden" NAME="p_aufsetz_buch_id" VALUE=""> <INPUT TYPE="hidden" NAME="p_aufsetz_datzeit" VALUE=""> </FORM> Server: Generierung einer eindeutigen ID Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 28 14 HTTPSession bei Servlets http://..Session_Tomcat Webserver Servlet Container Id keine ! neue Id kgwx Session name:wert http://..Session_Tomcat Id kgwx Institut für Informatik Universität Basel Id aus Cookie oder URL Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 29 Methoden von HttpSession public Object getAttribute(String name) [2.2] public void setAttribute(String name,Object value);[2.2] public void removeAttribute(String name);[2.2] public Enumeration getAttributeNames() [2.2] Alle Attribute einer Session werden zurückgegeben. public String getId(); Eindeutige Session Id public boolean isNew(); true, falls der Browser die Session noch nie gesehen hat. Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 30 15 Methoden von HttpSession public long getCreationTime() Zeit in Millisekunden von Januar 1970 public int getMaxInactiveInterval(); public void setMaxInactiveInterval(int seconds) Maximale inaktive Zeit, die eine Session überleben soll. seconds < 0 ; die Session soll immer aktiv bleiben public void invalidate(); Session wird mit allen assoziierten Objekten gelöscht. Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 31 Automatische URL-rewriting Das Servlet stellt automatisch auf URL-rewriting um, falls Cookies nicht erlaubt sind. Für lokale Links: String originalURL = someRelativeorAbsoluteURL; String encodedURL = response.encodeURL(originalURL); out.println(“<A HREF=\““ + encodedURL + “\“> ….</A>“); Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 32 16 Session package session; import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class Session_Tomcat extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body bgcolor=\"white\"><head>"); String title = "Praxis der Internet Programmierung"; out.println("<title>" + title + "</title></head><body>"); www.ifi.unibas.ch/studies Institut fürout.println("<h3>" Informatik Java+Apache XML (JAX) + title "</h3>"); Universität Basel Lektion 4: Servlets III 4 - 33 Session HttpSession session = request.getSession(); out.println("SessionId " + session.getId()); out.println("<br>Erzeugungszeit: "); out.println(new Date(session.getCreationTime()) + "<br>"); out.println("Letztmals benutzt: "); out.println(new Date(session.getLastAccessedTime())); String dataName = request.getParameter("dataname"); String dataValue = request.getParameter("datavalue"); if (dataName != null && dataValue != null) { session.setAttribute(dataName, dataValue); } out.println("<P>Session Data <br>"); Enumeration names = session.getAttributeNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); String value = session.getAttribute(name).toString(); out.println(name + " = " + value + "<br>"); } www.ifi.unibas.ch/studies Institut für Informatik Java Apache XML (JAX) Universität Basel Lektion 4: Servlets III 4 - 34 17 Session out.print("<P><form action=\""); out.print(response.encodeURL("Session_Tomcat")); out.print("\" "); out.println("method=POST>"); out.println("Name: <input type=text size=20 name=dataname>"); out.println("<br>Wert:"); out.println("<input type=text size=20 name=datavalue>"); out.println("<br><input type=submit>"); out.println("</form>"); out.println("<P>GET based form:<br>"); out.print("<form action=\""); out.print(response.encodeURL("Session_Tomcat")); out.print("\" "); Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 35 Session out.println("method=GET>"); out.println("Name:<input type=text size=20 name=dataname>"); out.println("<br>Wert:"); out.println("<input type=text size=20 name=datavalue>"); out.println("<br><input type=submit>"); out.println("</form>"); out.print("<p><a href=\""); out.print(response.encodeURL("Session_Tomcat?dataname=foo& datavalue=bar")); out.println("\" >URL encoded </a>"); out.println("</body></html>"); } public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException { doGet(request, response); } } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 36 18 Warenkorb Bestellung 1 Katalog Institut für Informatik Universität Basel 2 Bestellung Java Apache XML (JAX) Lektion 4: Servlets III 3 Bestätigung www.ifi.unibas.ch/studies 4 - 37 Modellierung Katalog CatalogPage ItemOrder Item KidsBookPage KidsBookPage init() init() Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III Catalog Repräsentation Daten www.ifi.unibas.ch/studies 4 - 38 19 Modellierung Bestellung, Bestätigung OrderPage ShoppingCart addItem() getItem() CheckOut Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 39 Warenkorbsystem: CatalogPage public abstract class CatalogPage extends HttpServlet { private Item[ ] items; private String[ ] itemIDs; CatalogPage private String title; /** cut some lines **/ public void doGet(HttpServletRequest request, HttpServletResponse response) KidsBookPage throws ServletException, IOException { init() response.setContentType("text/html"); if (items == null) { response.sendError(response.SC_NOT_FOUND, "Missing Items."); return; } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III ItemOrder Item KidsBookPage init() www.ifi.unibas.ch/studies 4 - 40 20 Warenkorbsystem: CatalogPage PrintWriter out = response.getWriter(); out.println(“<HTML><HEAD><TITLE>“+ title +“</TITLE></HEAD>“ "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>"); Item item; for(int i=0; i<items.length; i++) { out.println("<HR>"); item = items[i]; if (item == null) { out.println("<FONT COLOR=\"RED\">" + "Unknown item ID " + itemIDs[i] + "</FONT>"); } else { Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 41 Warenkorbsystem: CatalogPage out.println(); String formURL ="/servlet/onlinestore.OrderPage"; formURL = response.encodeURL(formURL); out.println ("<FORM ACTION=\"" + formURL + "\">\n" + "<INPUT TYPE=\"HIDDEN\" NAME=\"itemID\" " + " VALUE=\"" + item.getItemID() + "\">\n" + "<H2>" + item.getShortDescription() + " ($" + item.getCost() + ")</H2>\n" + item.getLongDescription() + "\n" + "<P>\n<CENTER>\n" + "<INPUT TYPE=\"SUBMIT\" " + "VALUE=\"Add to Shopping Cart\">\n" + "</CENTER>\n<P>\n</FORM>"); …. Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 42 21 Warenkorbsystem: OrderPage HttpSession session = request.getSession(true); ShoppingCart cart; synchronized(session) { cart = (ShoppingCart)session.getValue("shoppingCart"); // New visitors get a fresh shopping cart. // Previous visitors keep using their existing cart. if (cart == null) { cart = new ShoppingCart(); session.putValue("shoppingCart", cart); } OrderPage ShoppingCart addItem() getItem() Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 43 Warenkorbsystem: OrderPage String itemID = request.getParameter("itemID"); if (itemID != null) { String numItemsString = request.getParameter("numItems"); if (numItemsString == null) { // If request specified an ID but no number, then customers //came here via an "Add Item to Cart" button on a catalog page. cart.addItem(itemID); } else { OrderPage ShoppingCart addItem() getItem() Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 44 22 Warenkorbsystem: OrderPage // If request specified an ID and number, then // customers came here via an "Update Order" button // after changing the number of items in order. // Note that specifying a number of 0 results // in item being deleted from cart. int numItems; try { numItems = Integer.parseInt(numItemsString); } catch(NumberFormatException nfe) { numItems = 1; } cart.setNumOrdered(itemID, numItems); } } } OrderPage ShoppingCart addItem() getItem() Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 45 Warenkorbsystem: OrderPage // Whether or not the customer changed the order, show order status. response.setContentType("text/html"); PrintWriter out = response.getWriter(); String title = "Status of Your Order"; out.println(“<HTML><HEAD><TITLE>“+ title +“</TITLE></HEAD>“ + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>"); synchronized(session) { Vector itemsOrdered = cart.getItemsOrdered(); if (itemsOrdered.size() == 0) { out.println("<H2><I>No items in your cart...</I></H2>"); OrderPage ShoppingCart addItem() getItem() Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 46 23 Warenkorbsystem: OrderPage for(int i=0; i<itemsOrdered.size(); i++) { order = (ItemOrder)itemsOrdered.elementAt(i); out.println ("<TR>\n" + " <TD>" + order.getItemID() + "\n" + " <TD>" + order.getShortDescription() + "\n" + " <TD>" + formatter.format(order.getUnitCost()) + "\n" + " <TD>" + "<FORM ACTION=\"" + formURL + "\">\n" + "<INPUT TYPE=\"HIDDEN\" NAME=\"itemID\"\n" + " VALUE=\"" + order.getItemID() + "\">\n" + "<INPUT TYPE=\"TEXT\" NAME=\"numItems\"\n" + " SIZE=3 VALUE=\"" + order.getNumItems() + "\">\n" + Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 47 Warenkorbsystem: OrderPage } else { // If there is at least one item in cart, show table // of items ordered. out.println ("<TABLE BORDER=1 ALIGN=\"CENTER\">\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + " <TH>Item ID<TH>Description\n" + " <TH>Unit Cost<TH>Number<TH>Total Cost"); ItemOrder order; NumberFormat formatter = NumberFormat.getCurrencyInstance(); String formURL = "OrderPage"; formURL = response.encodeURL(formURL); Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 48 24 Warenkorbsystem: OrderPage "<SMALL>\n" + "<INPUT TYPE=\"SUBMIT\"\n "+ " VALUE=\"Update Order\">\n" + "</SMALL>\n" + "</FORM>\n" + " <TD>" + formatter.format(order.getTotalCost())); } String checkoutURL = response.encodeURL("Checkout"); OrderPage ShoppingCart addItem() getItem() Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 49 Warenkorbsystem: OrderPage // "Proceed to Checkout" button below table out.println ("</TABLE>\n" + "<FORM ACTION=\"" + checkoutURL + "\">\n" + "<BIG><CENTER>\n" + "<INPUT TYPE=\"SUBMIT\"\n" + " VALUE=\"Proceed to Checkout\">\n" + "</CENTER></BIG></FORM>"); } out.println("</BODY></HTML>"); } /** synchronized ** } OrderPage ShoppingCart addItem() getItem() Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 4: Servlets III www.ifi.unibas.ch/studies 4 - 50 25