Praktikum aus Softwareentwicklung 2 JSP - Java Server Pages Praktikum aus Softwareentwicklung 2 Java Praktikum – SS 2010 – [email protected] 1 Praktikum aus Softwareentwicklung 2 Java Server Pages • • • Grundlagen – Syntax, Lebenszyklus, … Java Beans – Formularverarbeitung, benutzerdef. Tags, … Sonstiges – Alternativen zu JSPs, Zusammenfassung, Links, … Java Praktikum – SS 2010 – [email protected] 2 Praktikum aus Softwareentwicklung 2 Java Server Pages Grundlagen • Servlets – – • GUI mit Servlets – – – • Dynamische Erzeugung von Web Inhalten (HTML, JPEG...) Implementierung von Web Diensten (Wetter, Flugpläne, Börsen...) Unübersichtlich ... out.print("<HTML>"); ... HTML Design Tools können nicht direkt verwendet werden Wartung von Servlet-Seiten durch Java-Programmierung GUI mit Java Server Pages (JSP) – – – – JSPs sind Text-Dokumente .jsp Direkte Verwendung von HTML für GUI Java in HTML eingebettet Basierend auf der Servlet-Technologie Java Praktikum – SS 2010 – [email protected] 3 Praktikum aus Softwareentwicklung 2 Java Server Pages Beispiel Clock.jsp <%@ page import="java.util.*" %> <% GregorianCalendar clock = GregorianCalendar.getInstance(); %> <html> <head> <title>Clock</title> </head> <body> Die aktuelle Zeit ist: <%= clock.getTime() %> <br> Der Server steht in Zeitzone <%= clock.getTimeZone() %> </body> </html> Hilfe zu HTML, JavaScript… siehe http://de.selfhtml.org/ Freier HTML Editor: http://www.pagebreeze.com Java Praktikum – SS 2010 – [email protected] 4 Praktikum aus Softwareentwicklung 2 Java Server Pages Lebenszyklus • Transparente Übersetzung in Servlets <%@ page ... %> <html> ... JSP-Seite: Clock.jsp Übersetzung class Clock_jsp extends HttpServlet {…} <html> ... Ausführung Servlet HTML-Seite Siehe generierte JSP Servlets (Windows Eclipse 3.4.1 Tomcat 6): MY_WORKSPACE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\Beispiele06\org\ apache\jsp\Clock_jsp.java Java Praktikum – SS 2010 – [email protected] 5 Praktikum aus Softwareentwicklung 2 Java Server Pages Servlet generiert aus Clock.jsp import java.util.GregorianCalendar; public final class Clock_jsp extends org.apache.jasper.runtime.HttpJspBase { … public void _jspService(HttpServletRequest request, HttpServletResponse response) { out.write("\n"); out.write("<!DOCTYPE html PUBLIC…"); out.write("\r\n"); out.write("<html>\n"); out.write("<head>\n"); out.write("<meta http-equiv=\"Content-Type\"…"); out.write("<title>Clock</title>\n"); out.write("</head>\n"); out.write("<body>\n"); out.write("Die Zeit ist: <b>"); out.print( GregorianCalendar.getInstance().getTime() ); out.write("</b>\r\n"); … } … Java Praktikum – SS 2010 – [email protected] 6 Praktikum aus Softwareentwicklung 2 Java Server Pages Webapplikation • • • • • • JSP Container (konform zu Servlet Container) Tomcat, WebSphere, JBoss… Java Development Kit am Server – Compiler! JSP Seiten, die Requests abarbeiten und dynamische Inhalt generieren Servlets, die Requests abarbeiten und dynamische Inhalt generieren Serverseitige JavaBeans Komponenten die Verhalten und Zustand kapseln Statische Resourcen HTML, DHTML, XHTML, XML, Images… Java Praktikum – SS 2010 – [email protected] 7 Praktikum aus Softwareentwicklung 2 Java Server Pages Eingebetter Java-Code • 1/3 Deklarationen <%! ... %> – • An beliebiger Stelle der JSP Instanzvariablen des Servlet <%! int k = 0; %> • Methoden des Servlet <%! String methode1(int i) { if ( i % 2 == 0 ) return "gerade"; else return "ungerade"; } %> • Innere Klassen des Servlet <%! class A extends Object { ... } %> Java Praktikum – SS 2010 – [email protected] 8 Praktikum aus Softwareentwicklung 2 Java Server Pages Eingebetter Java-Code • 2/3 Anweisungsfragmente (Scriptlets) <% ... %> – In HTML eingebetteter Java-Code, an beliebiger Stelle, z.B. <% if(Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) { %> Guten Morgen <% } else { %> Guten Tag <% } %> • • Exceptions mit try/catch, oder an Error-JSP weiterleiten Lokale Variablen <% int i; %> • Direkte Ausgabe in die HTML-Seite: mit Variable "out" <% if(Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM) { out.print("Guten Morgen"); } else { out.print("Guten Tag"); } %> Java Praktikum – SS 2010 – [email protected] 9 Praktikum aus Softwareentwicklung 2 Java Server Pages Eingebetter Java-Code • 3/3 Ausdrücke <%= ... %> – Der Ergebnis wird in die HTML-Seite eingefügt, z.B. <FORM> <INPUT NAME="uid" VALUE="<%= user.getId() %>"> ... – • entspricht ...<% out.print( user.getId() ); %>... Kommentare <%-- ... --%> – Im JSP: <%-- ... --%> – In Scriptlets: <% /* ... */ %> – HTML-Kommentare (<!-- ... -->) werden in die HTML-Seite übernommen! Java Praktikum – SS 2010 – [email protected] 10 Praktikum aus Softwareentwicklung 2 Java Server Pages Implizite Objekte Name Typ request HttpServletRequest response pageContext HttpServletResponse javax.servlet.jsp.PageContext session HttpSession application ServletContext out javax.servlet.jsp.JspWriter config ServletConfig page exception javax.servlet.jsp.JspPage (this) Throwable Java Praktikum – SS 2010 – [email protected] 11 Praktikum aus Softwareentwicklung 2 Java Server Pages Fehlerbehandlung • • • Übersetzungsfehler – Ausgabe der Übersetzungsfehler Nicht behandelte Exceptions – Ausgabe der Exception und des Ausführungsstack Explizite Fehlerseite – Ausgangsseite: <%@ page errorPage="fehler.jsp" %> ... – Im Ausnahmefall automatisches forward an die Fehlerseite, z.B. an fehler.jsp: <%@ page isErrorPage="true" %> <% log("Es ist ein Fehler aufgetreten!", exception); %> <H1>Ein Fehler ist aufgetreten</H1> <%= exception.getMessage() %> ... Java Praktikum – SS 2010 – [email protected] 12 Praktikum aus Softwareentwicklung 2 Java Server Pages Direktiven bei JSP-Übersetzung • Direktive page – Legt die globalen Eigenschaften einer JSP-Seite fest, z.B. <%@ page info="Meine ServerPage" errorPage="fehler.jsp" session="true" import="java.util.*"%> – Weitere Attribute siehe: http://java.sun.com/products/jsp/syntax/2.0/syntaxref20.html • Direktive include – Einbinden von Seitenteilen (auch JSPs) zur Übersetzungszeit, z.B. für Menüs oder Zugriffsberechtigungsprüfung: <%@ include file="secure.jsp" %> Java Praktikum – SS 2010 – [email protected] 13 Praktikum aus Softwareentwicklung 2 Java Server Pages Dyn. Einbinden von Seitenteilen • Aktion include – z.B.: <jsp:include page="menu.jsp" flush="true" /> – Pfad relativ oder absolut zum Root-Verzeichnis der WebApplikation JSP-Server GET doc.jsp doc.jsp ... <jsp:include doc2.jsp page="doc2.jsp" /> ... Java Praktikum – SS 2010 – [email protected] 14 Praktikum aus Softwareentwicklung 2 Java Server Pages Dynamisches Weiterleiten • Aktion forward – z.B.: <jsp:forward page="special.jsp" /> – – Die bisherige Ausgabe wird gelöscht IllegalStateException, falls der Ausgabepuffer schon voll war JSP-Server doc.jsp doc2.jsp GET doc.jsp ... <jsp:forward page="doc2.jsp" /> ... Java Praktikum – SS 2010 – [email protected] 15 Praktikum aus Softwareentwicklung 2 Java Server Pages Parameter • Weitergabe von Parametern – Attribute des request-Objektes, z.B. <% request.setAttribute("counter", "1"); %> – Alternative Schreibweise: Aktion param, z.B.: <jsp:forward page="step2.jsp"> <jsp:param counter="1"/> </jsp:forward> • Abfragen der Parameter <% String i = request.getAttribute("counter"); %> Java Praktikum – SS 2010 – [email protected] 16 Praktikum aus Softwareentwicklung 2 Java Server Pages • • • Grundlagen – Syntax, Lebenszyklus, … Java Beans – Formularverarbeitung, benutzerdef. Tags, … Sonstiges – Alternativen zu JSPs, Zusammenfassung, Links, … Java Praktikum – SS 2010 – [email protected] 17 Praktikum aus Softwareentwicklung 2 Java Server Pages Java Beans • Einfache Datenobjekte ohne Programmlogik ● Transferobjekte im DAO Pattern ● Datenobjekte zum Anzeigen/Bearbeiten in GUI... • Konventionen – Konstruktor ohne Argumente – Eigenschaften (Properties) -> get/set-Methoden – Ereignisse (Events und EventListener) – Methoden • Unterstützung durch JSP-Tags – <jsp:useBean> – <jsp:getProperty> – <jsp:setProperty> Java Praktikum – SS 2010 – [email protected] 18 Praktikum aus Softwareentwicklung 2 Java Server Pages Deklaration/Scope von Java Beans • Deklaration – <jsp:useBean id="database" class="mybeans.MySQL_DB" scope="application" /> – – • Eine lokale Variable "database" wird definiert und initialisiert Bean-Klasse: praktikum/WEB-INF/classes/mybeans/MySQL_DB.class Gültikeitsbereiche (scope) – page - lokale Variable in _jspService (default) – request - Attribut des HttpServletRequest – session - Attribut der HttpSession – application - Attribut des ServletContext Java Praktikum – SS 2010 – [email protected] 19 Praktikum aus Softwareentwicklung 2 Java Server Pages Datenaustausch Servlets/JSPs • Zugriff auf Java Beans – Beans mit scope = "page": sind privat in der JSP – Beans mit scope = "request": doGet(HttpServletRequest request, HttpServletResponse response) { ... bean = (BeanType)request.getAttribute("beanName"); – Beans mit scope = "session": HttpSession session = request.getSession(); bean = (BeanType)session.getAttribute("beanName"); – Beans mit scope = "application": bean = (BeanType)getServletContext().getAttribute("beanName"); Java Praktikum – SS 2010 – [email protected] 20 Praktikum aus Softwareentwicklung 2 Java Server Pages Initialisierun von Java Beans • Initialisierung beim erstmaligen Zugriff auf eine Bean: <jsp:useBean id="db" class="beans.MySQL_DB" scope="application"> <% db.setURL("jdbc:mysql://server:3306/db"); db.connect(); %> </jsp:useBean> • Vorkonfigurierte Beans – Design Time: Bean erzeugen, konfigurieren, und speichern (serialisieren), z.B.: ... MySQL_DB mydb=new MySQL_DB("jdbc:mysql://server:3306/db"); ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("mydb.ser")); os.writeObject(mydb); – Run Time: Bean laden (deserialisieren), z.B.: <jsp:useBean id="db" beanName="mydb.ser" type="beans.DB" /> Java Praktikum – SS 2010 – [email protected] 21 Praktikum aus Softwareentwicklung 2 Java Server Pages Verwendung von Java Beans • Verwenden eines Beans in Skripten – • Ausgabe einer Eigenschaft – • ... <%= bean.getDescription() %> ... <jsp:getProperty name="bean" property="description"/> Setzen von Eigenschaften – <jsp:setProperty name="bean" property="description" value="Ich bin ein Beaner" /> – Beliebige Objekt-Werte: <jsp:setProperty name="bean" property="date" value="<%= new java.util.Date() %>" /> – Eigenschaften von Request-Parametern übernehmen: • <jsp:setProperty name="bean" property="name" param="n"/> • <jsp:setProperty name="bean" property="name" /> • <jsp:setProperty name="bean" property="*" /> Java Praktikum – SS 2010 – [email protected] 22 Praktikum aus Softwareentwicklung 2 Java Server Pages Formularverarbeitung • Klassisches MVC-Konzept View steuert liest aus userAction modelChanged Controler Model verändert Java Praktikum – SS 2010 – [email protected] 23 Praktikum aus Softwareentwicklung 2 Java Server Pages Formularverarbeitung • Typische Schritte (1) Präsentation des Formulars (2) Überprüfung der Eingabe (Vollständigkeit, Plausibilität) (3) Verarbeitung der Daten durch den Server (4) Rückmeldung (Erfolg oder Misserfolg) • • MVC-Pattern mit Servlets und JSPs ● Model enthält Formulardaten --> Java Bean, z.B. User.java ● View zeigt die Model-Daten an --> JSP, z.B. UserEditor.jsp ● Controller verarbeitet die Eingaben --> Servlet oder JSP, z.B. UserUpdate.jsp Vereinfachtes Modell: – Controller und View sind in einem JSP vereint Java Praktikum – SS 2010 – [email protected] 24 Praktikum aus Softwareentwicklung 2 Java Server Pages Formularverarbeitung :UserUpdate.jsp (2) Eingaben verarbeiten <jsp:useBean id="user" class="beans.User" scope="request" /> ... <jsp:setProperty name="user" property="*" /> Controller ... (1) Eingabeformular erzeugen :UserEditor.jsp (3) Zustand anpassen <jsp:useBean id="user" class="beans.User" scope="request" /> Zustand abfragen ... <jsp:getProperty name="user" property="name" /> ... user:User nr=1 name="Hugo" pass="zzz" ... View Java Praktikum – SS 2010 – [email protected] Model 25 Praktikum aus Softwareentwicklung 2 Java Server Pages Benutzerdefinierte Tags • • • Vordefinierte Tags – <jsp:useBean>, <jsp:getProperty>, <jsp:setProperty>, <jsp:include> – Komplexere Funktionen nur mit Java-Skripten Erweiterte Funktionalität durch benutzerdefinierte Tags – z.B. Datenbankzugriff, Berechtigungsprüfung, ... – Tag kann ohne Programmierkenntnisse verwendet werden Java Beans zur Implementierung von Tags – Interface javax.servlet.jsp.tagext.Tag, etc. – Tag-Attribut => Bean-Property – Einfache Tags können auf Beans zugreifen, HTML ausgeben, etc. – Komplexe Tags realisieren Schleifen, deklarieren Variablen, ... Java Praktikum – SS 2010 – [email protected] 26 Praktikum aus Softwareentwicklung 2 Java Server Pages Custom Tags • • Verwendung in JSP: ● <currenttime timeZone="Pacific/Fiji"/> Implementierung: public class CurrentTime extends SimpleTagSupport { private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MMMMM.dd - hh:mm aaa"); private String timeZone; @Override public void doTag() throws JspException, IOException { PageContext pageContext = (PageContext) getJspContext(); JspWriter out = pageContext.getOut(); ... dateFormat.setTimeZone(tz); out.print(dateFormat.format(new Date())); } public void setTimeZone(String timeZone) {this.timeZone = timeZone;} public String getTimeZone() {return timeZone;} } Java Praktikum – SS 2010 – [email protected] 27 Praktikum aus Softwareentwicklung 2 Java Server Pages Tag-Bibliotheken • Deklaration der verwendete Tag Libraries ● • <%@ taglib uri="/WEB-INF/mytaglib.tld" prefix="t" %> Definition im Tag Library Descriptor, z.B.: security.tld <?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" <tlib-version>1.0</tlib-version> <short-name>demo</short-name> <uri>DemoTags</uri> <tag> <name>currenttime</name> <tag-class>bsp.tags.CurrentTime</tag-class> <body-content>empty</body-content> <attribute> <name>timeZone</name> <!-- runtime expression values allowed: "${param['timeZone']}" --> <rtexprvalue>true</rtexprvalue> <required>false</required> </attribute> </tag> </taglib> Java Praktikum – SS 2010 – [email protected] 28 Praktikum aus Softwareentwicklung 2 Java Server Pages • • • Grundlagen – Syntax, Lebenszyklus, … Java Beans – Formularverarbeitung, benutzerdef. Tags, … Sonstiges – Alternativen zu JSPs, Zusammenfassung, Links, … Java Praktikum – SS 2010 – [email protected] 29 Praktikum aus Softwareentwicklung 2 Java Server Pages Alternativen zu JSP • • • Einfachere Skript-Sprachen als Java – Servlet-basierte Skriptsprachen: WebMacro, Tea, Velocity, ... siehe http://www.servlets.com/tools/index.html – PHP: http://www.php.net/ – Ruby: http://www.ruby-lang.org/de/ Java Web-Application Frameworks – Struts: http://struts.apache.org/ – Cocoon „XML publishing framework“: http://cocoon.apache.org/ – Java Server Faces: http://java.sun.com/javaee/javaserverfaces/ – Grails: http://grails.codehaus.org/ ASP mit .NET (Microsoft) Java Praktikum – SS 2010 – [email protected] 30 Praktikum aus Softwareentwicklung 2 Java Server Pages Zusammenfassung und Links • Java Server Pages – – – – – – • HTML-Dokumente (statische Fragmente) Eingebettete Java-Skripte (dynamische Fragmente) Automatische Übersetzung in Servlets Verwendung von Java-Beans MVC-Pattern Syntax Reference http://java.sun.com/products/jsp/syntax/2.0/syntaxref20.html Links – – – – http://www.jsptutorial.org/ http://www.servlets.com/index.tea http://www.jsp-develop.de/ http://de.wikipedia.org/wiki/Model_View_Controller Java Praktikum – SS 2010 – [email protected] 31 Praktikum aus Softwareentwicklung 2 Ende der 6. Übung Java Praktikum – SS 2010 – [email protected] 32