Session Tracking Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I 5-1 4. Servlet – JSP Framework Struts 1. Grundlagen 4 4 4 4 1.1. 1.2. 1.3. 1.4. 4 4 1.5. 1.6. JAR Files TCP/IP, Sockels HTTP Java Web Service Developer Pack (WSDP) Ant JAVA Fehlermeldungen 4 4 4 4 4 4 4 4 4 4 4 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 2.7. 2.8. 2.9. 2.10. 2.11. Servlet Framework Tomcat Servlet Container Lebenszyklus Hello World Servlet Implizite Objekte Einfache Servlets Konfiguration (web.xml) Anfrage weiterleiten Filter Cookies Session Tracking 4 4 4 4 4 4 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. Architektur Syntax, Skripte, Direktiven Implizite Objekte Aktionen JavaBeans Custom Tags 2. Servlets 3. JSP Institut für Informatik Universität Basel www.ifi.unibas.ch/studies 4 4.1.Architektur 4.2.Planung einer Webanwendung 4.3.Implementierung 4 4 4 4 4 4 5.1.Grundlagen 5.2.DTD & Schemata 5.3.Parser (SAX, DOM) 5.4.XPath 5.5.XSLT 5.6.XSL-FO 4 4 5. XML 6. XML Framework Cocoon 4 4 4 4 6.1.Architektur 6.2.Cocoon Beispiel 6.3.Sitemap 6.4.XSP 7. JAVA Webservices 4 4 4 4 7.1.SOAP 7.2.UDDI / ebXML 7.3.WSDL 7.4.Implementierung eines Webservice Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5-2 1 JSP 1. 2. 3. 4. 5. 6. 7. Architektur Syntax Skripte Direktiven Implizite Objekte Aktionen JavaBeans Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5-3 Quellenangaben Offizielle Spezifikationen, Klassenbibliotheken & dokumentation 4http://java.sun.com/products/jsp/ 4http://jakarta.apache.org/ Tutorials 4http://java.sun.com/j2ee/tutorial/ 4http://java.sun.com/docs/books/tutorial/servlets/ 4http://www.intelinfo.com/it_training_materials_and _books/free_java_training_materials.html Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5-4 2 Wie sieht eine JSP-Seite aus <HTML> <%@ page language=="java" imports=="com.wombat.JSP.*" %> <H1>Welcome</H1> <P>Today is </P> <jsp:useBean id=="clock" class=="calendar.jspCalendar" /> <UL> <LI>Day: <%==clock.getDayOfMonth() %> <LI>Year: <%==clock.getYear() %> </UL> <% if (Calendar.getInstance().get(Calendar.AM_PM) ==== Calendar.AM) { %> Good Morning <% } else { %> Good Afternoon <% } %> <%@ include file=="copyright.html" %> </HTML> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5-5 Vergleich mit JSP,ASP,PHP -1JSP PHP Web Server IIS; PWS ASP Apache, IIS, PWS, Netzcape Server, iPlanet etc. Apache, IIS,PWS, Netscape Server Plattform Windows Unix(Solaris, Linux,AIX,IRIX), Windows, MacOS Unix(Solaris, Linux,AIX,IRIX), Windows KomponentenTechnologie COM JavaBeans, EJB COM, JavaBeans Selbst definierte Tagsyntax Offenheit Nicht möglich möglich Nicht möglich Nein Kooperiert von vielen großen Firmen( SUN,IBM,BEA) Opernressourcen Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5-6 3 Vergleich mit JSP,ASP,PHP -2ASP Script-Sprache PHP Java, ECMAScript PHP Geeignet für große Ja Webservice Ja Nein Ausführungsgeschwindigkeit Schnell Sehr schnell Sehr schnell Lernschwierigkeit Niedrig Relativ niedrig Niedrig Sessionverwaltung Ja Ja Ja Einheitliche DBVerbindung ADO,ODBC JDBC nein Datei-suffix asp jsp php,php3,phps Institut für Informatik Universität Basel VBScript, JScript JSP Java Apache XML (JAX) Lektion 5: JSP I Bis jetzt Servlets … www.ifi.unibas.ch/studies 5-7 Webserver (Tomcat) get start Servlet Container generiert HTML versendet via http Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5-8 4 HTTP Server CGI-Architektur Request CGI Process Start Process Gen. Data Receive CGI out Process starten kostet Zeit !! Send Response Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5-9 3.1 Architektur Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 10 5 HTTP Server Receive Request JSP Servlet current? Nein Ja Ja JSP Servlet loaded? Nein Load Servlet JSP Container Page Compiler Parse JSP Generate JSP Servlet Source Compile JSP Servlet JSP PAGE Servlet Generate Response Send Institut für Informatik Response Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 11 Potential von JSP • • • • • HTML + Java in spez. Tag Mischung von HTML / XML / Java-Code Einfachheit Trennung von Darstellung und Logik Definition eigener Tags Präsentation Darstellung Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I Implementierung Logik www.ifi.unibas.ch/studies 5 - 12 6 Ziel: Trennung von Aufgaben Client Web Layer Daten Quellen visuell HTML JSP Page XML JSP Page WML JSP Page Logik XML Bean Custom Tags DB Aufteilen in: •Präsentation •Logik •Daten Vereinfachung: •Scriptprogrammierung EBean Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 13 API javax.servlet.jsp.HttpJspPage <%@ <%@ page page %> %> Direktiven Direktiven <%@ <%@ taglib taglib %> %> <%! <%! declaration declaration %> %> JSP JSP Skripte Skripte <%@ <%@ include include %> %> <% <% scriptlet scriptlet %> %> <%= <%= expression expression %> %> Aktionen Aktionen Institut für Informatik Universität Basel <jsp:useBean> <jsp:useBean> <jsp:include> <jsp:include> <jsp:fallback> <jsp:fallback> <jsp:setProperty> <jsp:setProperty> <jsp:forward> <jsp:forward> <jsp:plugin> <jsp:plugin> <jsp:getProperty> <jsp:getProperty> <jsp:params> <jsp:params> <benutzerdef.> <benutzerdef.> Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 14 7 3.2 Syntax „Standard“-Syntax <% ... %> XML-Syntax <jsp:einJspTag>...</jsp:einJspTag> Skripte (scripts) / Programmierung Direktiven (directives) / Steuerung JSP Container Aktionen (actions) / Kontrollfluss Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 15 3.2 Skripte Deklaration: Definition Variablen, Methode für die aktuelle Seite <%! Scriptlets: Blöcke von Code <% Expressions: Einzelne Linien von Code automatisch in Seitenausgabe eingefügt. <%= Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 16 8 3.2 Deklarationen <%! privat int x=0,y=0; privat String unit=“hallo“;%> <%! Circle a = new Circle(2.0); %> <jsp:declaration> privat int x=0,y=0; privat String unit=“hallo“; </jsp:declaration> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 17 3.2 Lokale vs. Klassen Variablen Lokal, einmal pro Instanz, <%! private int z=0; %> Klassen Variable, sichtbar in allen Instanzen <%! static public int z=0; %> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 18 9 3.2 Ausdrücke (Expressions) <%= numguess.getHint() %> <jsp:expression> numguess.getHint() </jsp:expression> • direkte Ausgabe in den Outputstream • Stringkonvertierung über toString()oder String.valueOf() • äquivalent zu out.print(...); Spez. Ausdruck: test_expr ? true_exp : false_exp <%= (hours < 12) ? “AM“ : “PM“ %> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 19 Beispiel Script (Parameter einlesen) <% String name = null; if (request.getParameter("name") == null) { %> <%@ include file="error.html" %> <% } else { foo.setName(request.getParameter("name")); if (foo.getName().equalsIgnoreCase("integra")) name = "acura"; if (name.equalsIgnoreCase( "acura" )) { %> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 20 10 3.2 Direktiven Enthalten globale Informationen für den Pagecompiler und auch den JSP-Container Allgemeine Definitionen 4import Anweisungen 4Tag-Bibliotheken 4Anzeige von Fehler-Seiten Erzeugen keine Ausgabe Keine laufzeitrelevanten Inhalte Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 21 3.2 Direktive Syntax1: <%@ page attribute1=“value1” %> Syntax2: <jsp:directive.page attribute1=“value1” /> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 22 11 3.2 Direktive Page <%@ page [ language="java" ] [ extends="package .class" ] [ import="{package .class | package.*}, ..." ] [ session="true|false" ] [ buffer="none|8kb|sizekb" ] [ autoFlush="true|false" ] [ isThreadSafe="true|false" ] [ info="text" ] [ errorPage="relativeURL" ] [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] [ isErrorPage="true|false" ] %> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 23 Include include.jsp: <html> <head><title>An Include Test</title></head> <body bgcolor="white"> <font color="blue"> The current date and time are <%@ include file="date.jsp" %> </font> </body> </html> Institut für Informatik Universität Basel date.jsp: <%@ page import="java.util.*" %> <%= (new java.util.Date() ) .toLocaleString() %> Displays in the page: The current date and time are Aug 30, 1999 2:38:40 Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 24 12 3.3 Implizite Objekte stehen in jeder JSP zur Verfügung page (javax.servlet.jsp.HttpJspPage) config (javax.servlet.ServletConfig) request (javax.servlet.http.HttpRequest) response (javax.servlet.http.HttpResponse) out (javax.servlet.jsp.JspWriter) session (javax.servlet.http.HttpSession) application (javax.servlet.ServletContext) pageContext (javax.servlet.jsp.PageContext) exception (java.lang.Throwable) … Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 25 Request Object javax.servlet.http.HttpServletRequest Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 26 13 3.4 Aktionen <jsp:forward> <jsp:include> <jsp:param> Steuerung des Kontrollfluss zwischen den Seiten. <jsp:useBean> <jsp:setProperty> <jsp:getProperty> Zusammenspiel mit Beans <jsp:plugin> <jsp:fallback> Institut für Informatik Universität Basel Spezifikation für Applets. Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 27 Forward Request Original Page ----------------------------------------------------------- <jsp:forward page=“localURL“ /> ---Request --------------------- Forwarded Page Response <jsp:forward page=‘<%= “message“ + statusCode + “.html“ %> /> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 28 14 Anwendungen forward 1.Parameterübergabe <jsp:forward page=“localURL“> <jsp:param name=“parameterName1“ value=“parameterValue1“ /> </jsp:forward> 2. Kontrollfluss <% if (! Database.isAvailable()) { %> <%-- Informieren den User zur Wartung der DB --%> <jsp:forward page=“db-wartung.html“ /> <% } %> <%-- Datenbank ist verfügbar --%> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 29 Include Request ----------------------------------------------------------Response Original Page Institut für Informatik Universität Basel <jsp:include page=“localURL“ flush=„true“/> ---Request --------------------- Included Page Response Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 30 15 Action vs. Direktive Direktive <@ include …> Im Moment der Seitengenerierung wird der Inhalt eingefügt. Action <jsp:include …> Der Request wird direkt auf die neue Seite umgeleitet und der Response wird wieder zurückgeleitet. Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 31 Syntax von JSP 1 JSP Element Syntax Interpretation Notes <%= expression %> Expression is evaluated and placed in output. JSP Scriptlet <% code %> Code is inserted in service method. XML equivalent is JSP Declaration Code is inserted in body of servlet class, outside of service method. XML equivalent is <%! code %> XML equivalent is JSP Expression <jsp:expression> expression </jsp:expression> . Predefined variables are request , response , out , session , application , config , and pageContext (available in scriptlets also). <jsp:scriptlet> code</jsp:scriptlet>. <jsp:declaration> Code </jsp:declaration>. XML equivalent is <jsp:directive.page att="val"\>. Legal attributes, with JSP page Directive <%@ page att="val" %> Institut für Informatik Universität Basel Directions to the servlet engine about general setup. default values in bold, are: •import="package.class " •contentType=" MIME-Type " •isThreadSafe="true|false" •session="true|false" •buffer=" sizekb|none" •autoflush="true|false" •extends=" package.class " •info="message " •errorPage="url" •isErrorPage="true|false" •language="java" Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 32 16 Syntax von JSP 2 JSP include Directive <%@ include file="url"%> A file on the local system to be included when the JSP page is translated into a servlet. JSP Comment <%-- comment --%> Comment; ignored when JSP page is translated into servlet. If you want a comment in the resultant HTML, use regular HTML comment syntax of <-- comment -->. The jsp:include Action <jsp:include page=" relative URL" flush="true"/> Includes a file at the time the page is requested. If you want to include the file at the time the page is translated, use the page directive with the include attribute instead. Warning: on some servers, the included file must be an HTML file or JSP file, as determined by the server (usually based on the file extension). The jsp: useBean Action <jsp:useBean att=val*/> or <jsp:useBean att=val*> ... </jsp:useBean> Find or build a Java Bean. Set bean properties, either explicitly or by designating that value comes from a request parameter. The <jsp:setProperty jsp: setPropert att=val*/> Action Institut für Informatik Universität Basel XML equivalent is <jsp:directive.include file="url"\>. The URL must be a relative one. Use the jsp:include action to include a file at request time instead of translation time. Possible attributes are: •id="name" •scope="page|request|session|application" •class="package.class " •type=" package.class " •beanName=" package.class " Legal attributes are •name=" beanName" •property=" propertyName|*" •param="parameterName " •value=" val" Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 33 Syntax von JSP 3 The jsp:setPropert y Action The jsp:getPropert y Action The jsp:forward Action The jsp:plugin Action <jsp:setProperty att=val*/> Set bean properties, either explicitly or by designating that value comes from a request parameter. <jsp:getProperty name="propertyName" value="val"/> Retrieve and output bean properties. <jsp:forward page=" relative URL"/> Forwards request to another page. <jsp:plugin attribute="value"*> ... </jsp:plugin> Generates OBJECT or EMBED tags, as appropriate to the browser type, asking that an applet be run using the Java Plugin. Institut für Informatik Universität Basel Legal attributes are •name=" beanName" •property=" propertyName|*" •param="parameterName " •value=" val" Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 34 17 Servlets vs. JSP Servlets 4streng definiert 4„pure Java“ 4mit viel Dokument-Quellcode oft unübersichtlich 4100% objektorientierter Ansatz JSP 4Schwammige Spezifikationen, 4Durchmischung zweier Technologien 4Mit viel Java-Code oft unübersichtlich Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 35 Beispiele http://www.oreilly.com/catalog/javaserverpr/ http://www.moreservlets.com/ Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 36 18 3.5 JSP & Komponenten Java Entwickler Daten Präsentation Anwendungs Logik Daten Zugriff DB WEB Designer Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 37 Java Beans Institut für Informatik Universität Basel 5 - 38 19 Java Beans, (java.sun.com) Support for introspection allowing a builder tool to analyze how a bean works. Support for customization allowing a user to alter the appearance and behavior of a bean. Support for events allowing beans to fire events, and informing builder tools about both the events they can fire and the events they can handle. Support for properties allowing beans to be manipulated programatically, as well as to support the customization mentioned above. Support for persistence allowing beans that have been customized in an application builder to have their state saved and restored. Typically persistence is used with an application builder's save and load menu commands to restore any work that has gone into constructing an application. http://developer.java.sun.com/developer/onlineTraining/Beans Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 39 Hello World Bean package jspcr; import java.io.*; public class helloworldbean implements Serializable { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getCount10() { String s; s=""; for (int i=0;i < 10 ; i++ ) { s += i+" "; } return s; } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 40 20 Hello World bean jsp <html><head><title>helloworld</title></head><body> <h1>Helloworld JSP</h1> <jsp:useBean id="hello" class="jspcr.helloworldbean"> <jsp:setProperty name="hello" property="message" value="Guten Tach, wie lauefts ????"/> </jsp:useBean> hier kommt die Meldung:<br><br> <jsp:getProperty name="hello" property="message"/> <br>und nun auf 10:<br> <jsp:getProperty name="hello" property="count10"/> <br></body></html> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 41 com.ora.jsp.beans.shopping.CatalogBean package com.ora.jsp.beans.shopping; import java.io.*; import java.util.*; public class CatalogBean implements Serializable { private Map catalog = new HashMap(); /** * Constructor. Creates all ProductBean objects and adds them * to the catalog. */ public CatalogBean() { ProductBean prod = new ProductBean(); prod.setId("1000"); prod.setName("JavaServer Pages"); prod.setDescr("Learn how to develop a JSP based web application."); prod.setPrice(32.95f); catalog.put("1000", prod); Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 42 21 com.ora.jsp.beans.shopping.CatalogBean prod = new ProductBean(); prod.setId("2000"); prod.setName("Java Servlet Programming"); prod.setDescr("Learn how to develop a servlet based web application."); prod.setPrice(32.95f); catalog.put("2000", prod); prod = new ProductBean(); prod.setId("3000"); prod.setName("Java In a Nutshell"); prod.setDescr("Learn the Java programming language."); prod.setPrice(32.95f); catalog.put("3000", prod); } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 43 com.ora.jsp.beans.shopping.CatalogBean /** * Returns all products as an Iterator, suitable for looping. * @return an Iterator for all ProductBean instances */ public ProductBean[] getProductList() { ProductBean[] products = new ProductBean[catalog.size()]; catalog.values().toArray(products); return products; } /** * Returns a Map with all ProductBean instances, keyed by ID. * @return an Map of all ProductBean instances */ public Map getProductsById() { return catalog; } } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 44 22 com.ora.jsp.beans.shopping.ProductBean package com.ora.jsp.beans.shopping; import java.io.*; public class ProductBean implements Serializable { private String id; private String name; private String descr; private float price; /** * Returns the product id. * @return the product id */ public String getId() { return id; } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 45 com.ora.jsp.beans.shopping.ProductBean /** * Returns the product name. */ public String getName() { return name; } /** * Returns the product description. */ public String getDescr() { return descr; } /** * Returns the product price. */ public float getPrice() { return price; } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 46 23 com.ora.jsp.beans.shopping.ProductBean /** * Sets the product id. */ void setId(String id) { this.id = id; } /** * Sets the product name. */ void setName(String name) { this.name = name; } /** * Sets the product description. */ void setDescr(String descr) { this.descr = descr; } /** * Sets the product price. */ void setPrice(float price) { this.price = price; } } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 47 Webanwendung: Flugwetter 1. Aktuelle Daten 2. Web Architektur 3. Logik (Business Objekt) 4. Implementierung • • Bean Präsentation (JSP, CSS, HTML) Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 48 24 Daten aus dem WEB Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I Architektur sendRedirect www.ifi.unibas.ch/studies 5 - 49 SetAirportCode.jsp style.css portal.jsp Cookie? AirportSelection.html weather observation Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 50 25 Business Logic Hilfsmethoden getAirportCode() setAirportCode(String airportCode) getLocation() getTemperature() getTime() getURL() Institut für Informatik Universität Basel load(InputStream stream) loadFromURL(URL url) load(InputStream stream) parseLocation(String line) parseTime(String line) parseTemperature (String line) Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 51 Bean: Weather package jspcr.beans.weather; import java.io.*; import java.net.*; import java.text.*; import java.util.*; public class Observation implements Serializable { private static final String BASEURL = "http://weather.noaa.gov/weather/current"; private static final SimpleDateFormat DATEFMT = new SimpleDateFormat("MMM dd, yyyy - hh:mm aa zzz"); private String airportCode; private String location; private Date time; private Double temperature; Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 52 26 Bean Methoden // Bean accessor methods public String getAirportCode() { return airportCode; } public void setAirportCode(String airportCode) throws IOException { this.airportCode = airportCode; loadFromURL(getURL()); } public String getLocation() { return location; } protected void setLocation(String location) { this.location = location; } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 53 Load public URL getURL() throws MalformedURLException { StringBuffer sb = new StringBuffer(); sb.append(BASEURL); sb.append("/K"); sb.append(airportCode.toUpperCase()); sb.append(".html"); protected void load(InputStream stream) throws IOException { location = null; time = null; temperature = null; BufferedReader in = new BufferedReader( new InputStreamReader(stream)); return new URL(sb.toString()); } for (;;) { // while(true) String line = in.readLine(); if (line == null) break; protected void loadFromURL(URL url) throws IOException { load(url.openStream()); } if (location == null) parseLocation(line); if (time == null) parseTime(line); if (temperature == null) parseTemperature(line); } in.close(); } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 54 27 Parse Temperature protected void parseTemperature(String line) { final String TOKEN1 = "("; final String TOKEN2 = "C)"; int q = line.lastIndexOf(TOKEN2); if (q != -1) { int p = line.lastIndexOf(TOKEN1); if (p != -1) { p += TOKEN1.length(); String token = line.substring(p, q).trim(); try { setTemperature(Double.parseDouble(token)); } catch (NumberFormatException e) { e.printStackTrace(); } } } } Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 55 statische Dateien AirportSelection.html style.css .whiteOnBlue, .blueOnWhite { font-family: Verdana; font-size: 9pt; text-decoration: none; } .whiteOnBlue { background-color: #005A9C; color: #FFFFFF; } .blueOnWhite { background-color: #FFFFFF; color: #005A9C; } Institut für Informatik Universität Basel <HTML> <HEAD> <TITLE>Airport Selection</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="SetAirportCode.jsp"> Select airport: <INPUT TYPE="SUBMIT" VALUE="Set Airport Code"> <P> <SELECT NAME="airportCode" SIZE=10> <OPTION VALUE="CLT">Charlotte Douglas International Airport <OPTION VALUE="DFW">Dallas Fort Worth International Airport <OPTION VALUE="DEN">Denver International Airport <OPTION VALUE="JFK">Kennedy International Airport <OPTION VALUE="LMT">Klamath Falls International Airport <OPTION VALUE="LGA">La Guardia Airport <OPTION VALUE="TVL">Lake Tahoe Airport <OPTION VALUE="LAX">Los Angeles International Airport <OPTION VALUE="EWR">Newark International Airport <OPTION VALUE="SWF">Newburgh Stewart Airport <OPTION VALUE="ROW">Roswell Industrial Air Center Airport <OPTION VALUE="SAF">Santa Fe County Municpal Airport <OPTION VALUE="SLC">Salt Lake City International Airport <OPTION VALUE="SFO">San Francisco International Airport <OPTION VALUE="SEA">Seattle Tacoma International Airport <OPTION VALUE="EAT">Wenatchee Pangborn Memorial Airport <OPTION VALUE="YKM">Yakima Air Terminal </SELECT> </FORM> </BODY> www.ifi.unibas.ch/studies XML (JAX) </HTML> 5 - 56 Java Apache Lektion 5: JSP I 28 setAirPort Code.jsp <%@ page session="false" %> <% String airportCode = request.getParameter("airportCode"); if (airportCode != null) { Cookie cookie = new Cookie("airportCode", airportCode); final int ONE_YEAR = 60 * 60 * 24 * 365; cookie.setMaxAge(ONE_YEAR); response.addCookie(cookie); } response.sendRedirect("Portal.jsp"); %> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 57 Portal.jps <%@ page session="false" %> <HTML><HEAD><TITLE>LyricNote Portal</TITLE> <LINK REL="stylesheet" HREF="style.css"> </HEAD><BODY> <IMG SRC="images/lyric_note.png"> <HR COLOR="#000000"> <%-- Get weather cookie --%> <% String airportCode = "RDU"; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals("airportCode")) { airportCode = cookie.getValue(); break; } } } %> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 58 29 Portal.jps (II) <%-- Get the weather observation bean for that location --%> <jsp:useBean id="wobs" class="jspcr.beans.weather.Observation"> <jsp:setProperty name="wobs" property="airportCode" value="<%= airportCode %>"/> </jsp:useBean> <%-- Show weather information --%> <SPAN CLASS="whiteOnBlue">&nbsp;Weather&nbsp;</SPAN> <SPAN CLASS="blueOnWhite"> <jsp:getProperty name="wobs" property="location"/> <jsp:getProperty name="wobs" property="time"/> <jsp:getProperty name="wobs" property="temperature"/> C&deg; </SPAN> <A CLASS="whiteOnBlue" HREF="AirportSelection.html">&nbsp;Select City&nbsp;</A> <HR COLOR="#000000"> <%-- Show the rest of the web page --%> </BODY> </HTML> Institut für Informatik Universität Basel Java Apache XML (JAX) Lektion 5: JSP I www.ifi.unibas.ch/studies 5 - 59 30