180 likes | 363 Views
Java 2 Enterprise Edition (J2EE). Sascha Baumeister Software Architect Specification Lead JSR086 IBM Deutschland Entwicklung GmbH sbaumei@de.ibm.com. Teil IV – JSP / JSTL / ViewBeans. Java ServerPages (JSP) JSP Standard Tag Library (JSTL) ViewBeans. JSP.
E N D
Java 2 Enterprise Edition (J2EE) Sascha Baumeister Software Architect Specification Lead JSR086 IBM Deutschland Entwicklung GmbH sbaumei@de.ibm.com
Teil IV – JSP / JSTL / ViewBeans • Java ServerPages (JSP) • JSP Standard Tag Library (JSTL) • ViewBeans
JSP • Java ServerPages (JSP) ist eine Erweiterung von HTML für das Design von dynamischen Web-Seiten View • JSP-Seiten bestehen aus standard HTML, JSP Direktiven, JSP Scrips, und JSP Aktionen • JSPs werden mittels eines JSP-Compilers in Java Servlets übersetzt „verkehrte“ Servlets
Wichtigste JSP Direktiven • JSP Direktiven teilen dem JSP-Compiler für die Übersetzungsphase relevante Information mit. • Syntax: <%@ Direktive %> • Eine Page-Direktive teilt dem JSP-Compiler Meta-Information über die JSP-Seite mit: Threadsicherheit, Servlet-Superklasse, etc. • Eine TagLib-Direktive erlaubt die Verwendung von benutzerdefinierten Tags in einer JSP-Seite • Eine Include-Direktive weist den JSP-Compiler an den Inhalt eines Files in das zu generierende Servlet aufzunehmen.
JSP Direktiven - Beispiel <HTML> <HEAD> <TITLE>JSP Direktiven</TITLE> <%@ page buffer=”none” isThreadSafe=”no” errorPage=”/fehler.jsp” %> </HEAD> <BODY> <%@ taglib uri=”http://www.myserver.com/customtags” prefix=”custom” /> <%@ include file=”Seiteninhalt.html” %> </BODY> </HTML>
JSP Scripting • JSP Scripting erlaubt die direkte Verbindung von Java Code mit HTML • Deklarationen deklarieren Methoden und Variablen für das zu generierende Servlet Syntax: <%! Deklaration %> • Scriptlets sind Java-Codefragmente, die der JSP Compiler in die Service-Methode des zu generierenden Servlets einbauen soll Syntax: <% Scriptlet %> • Expressions sind Java-Ausdrücke, deren Evaluierungs-Ergebnis der JSP Compiler in das zu generierenden Servlet einbauen soll Syntax: <%= Expression %>
JSP Scripting - Beispiel <HTML> <HEAD> <TITLE>JSP Scripting</TITLE> </HEAD> <BODY> Millisekunden seit 1970: <%= System.currentTimeMillis() %> <P> <%! private int timesThree(int multiplier) { return multiplier * 3; } %> Vielfache von 3: <P> <% for (int index =0; index < 10; index++) { %> <%= index %>.Vielfaches: <%= this.timesThree(index) %> <P> <% } %> </BODY> </HTML> zur Laufzeit Evaluierungs- Ergebnis in HTML einfügen Definition einer Servlet-Methode Iteration Aufruf der neuen Servlet-Methode
JSP Scripting - Übersetzung package de.ba; import javax.servlet.*;import javax.servlet.http.*;import java.io.*; public class GeneratedJSPServlet extends HttpServlet { private int timesThree(int multiplier) { return multiplier * 3; } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.getWriter().println("<HTML><HEAD><TITLE>JSP Scripting</TITLE></HEAD><BODY>"); response.getWriter().println("Millisekunden seit 1970: „ + Integer.toString(System.currentTimeMillis())); response.getWriter().println(„Vielfache von 3:"); for (int index =0; index < 10; index++) { response.getWriter().println(Integer.toString(index) + „.Vielfaches: „ + Integer.toString(this.timesThree(index))); } response.getWriter().println(„</BODY></HTML>“); } } Einfügen der Methoden-Deklaration Einfügen der Expression Einfügen der Iteration
JSP Aktionen • JSP Aktionen sind Tags, die in Java-Code übersetzt werden und ähnlich wie Scriptlets/Expressions in die Service-Methode des zu generierenden Servlets einfließen • 6 Standard Aktionen werden von jedem JSP Compiler ünterstützt, benutzerdefinierte Aktionen sind über die Include-Direktive einbindbar • JSR 052 definiert zusätzlich eine umfangreiche Standard Tag Library für JSPs (JSTL). Die Spezifikation ist zur Zeit beim JCP als Proposed Final Draft verfügbar, Jakarta beheimatet die bisher einzige JSTL-Implementierung.
Wichtigste JSP Standard- Aktionen • Die <jsp:useBean> Aktion assoziiert ein neues oder übergebenes Java-Objekt mit einem Namen • Die <jsp:getProperty> Aktion liest ein Property aus einem Java-Objekt per Java Introspection aus, konvertiert den Wert in einen String und fügt das Ergebnis in die HTML-Ausgabe ein • Die <jsp:setProperty> Aktion modifiziert ein Property aus einem Java-Objekt aus, indem es den gegebenen String in den passenden Java-Typ konvertiert
JSP Aktionen - Beispiel <HTML> <HEAD> <TITLE>JSP Aktionen</TITLE> </HEAD> <BODY> <jsp:useBean id=„datum“ class=„java.util.Date“ scope=„session“ /> Stunde: <jsp:getProperty name=„datum“ property=„hours“ /> <P> Minute: <jsp:getProperty name=„datum“ property=„minutes“ /> <P> Sekunde: <jsp:getProperty name=„datum“ property=„seconds“ /> <P> </BODY> </HTML> der Tagidentifikator für JSP Standard-Aktionen
JSP Standard Tag Library (JSTL) • Die Verwendung von Java-Scripts in JSPs führt zu unlesbarem Code Tag-Libs verwenden! • Die Erstellung von Custom-Taglibs ist aufwendig und führt ebenfalls zu schwer wartbarem Code! • JSTL bietet einen umfangreichen Satz von vielfältig einsetzbaren Tags • JSTL bietet ebenso Tags zur Einbindung von XML, SQL und Expressions • JSTL ist in JSR 052 definiert worden
JSTL Beispiel <HTML><HEAD><TITLE>JSTL Sample</TITLE></HEAD> <BODY> <%-- JSTL Core Tags --%> <%@ taglib uri="/WEB-INF/tld/c-rt.tld" prefix="c_rt" %> <%-- JSTL I18N Formatting Tags--%> <%@ taglib uri="/WEB-INF/tld/fmt-rt.tld" prefix="fmt_rt" %> <%-- JSTL SQL Tags --%> <%@ taglib uri="/WEB-INF/tld/sql-rt.tld" prefix="sql_rt" %> <%-- JSTL XML Tags --%> <%@ taglib uri="/WEB-INF/tld/x-rt.tld" prefix="x_rt" %> <c_rt:if test='<%= request.getParameter("param") != null%>'> Parameter Value: <%= request.getParameter("param") %> </c_rt:if> </body> </html> Tagidentifikator definiert für JSTL Core-Tags
ViewBeans • ViewBeans sind benutzerdefinierte Java-Klassen, die dem JavaBean Layout entsprechen • ViewBeans sollten nur Properties besitzen, die Java Basis-Typen oder Strings sind leichte Konvertierbarkeit für JSP Aktionen! • ViewBeans werden aus Modell-Daten erzeugt, Exceptions beim Konvertieren werden in Servlets bearbeitet • ViewBeans werden JSPs zur Darstellung/Modifikation übergeben Komponenten-Vertrag zwischen Servlets und JSPs
Applikations-Architektur Datenbank-Modellierer J2EE-Entwickler JNDI rufe Model Servlet JDBC erzeuge ViewBeans rufe View, übergebe ViewBeans JSP Web-Designer Model - View - Controller
Beispiel - JSP <HTML> <HEAD> <TITLE>Artikel-Details</TITLE> </HEAD> <BODY> <jsp:useBean id="artikel" class=„de.ba.ArtikelViewBean" scope="session" /> Name: <jsp:getProperty name="artikel" property="name" /> <P> Bestand: <jsp:getProperty name="artikel" property="quantity" /> <P> </BODY> </HTML> wichtig bei Übergabe von ViewBeans an JSPs unter diesem Namen muß ein Servlet das ViewBean übergeben File: jsp/ArtikelView.jsp
Beispiel - ViewBean package de.ba; public class ArtikelViewBean { private final String name; private final int quantity; public ArtikelViewBean(String name, int quantity) { this.name = name; this.quantity = quantity; } public String getName() { return this.name; } public int getQuantity() { return this.quantity; } }
Beispiel - Servlet package com.ibm.ba; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class ArtikelAbfrageServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { try { String name = request.getParameter("name"); int quantity = String.parseInt(request.getParameter("name")); ArtikelViewBean artikel = new ArtikelViewBean(name, quantity); request.getSession(true).setAttribute("artikel", artikel); this.getServletConfig().getServletContext().getRequestDispatcher("jsp/ArtikelView.jsp").forward(request, response); } catch (Throwable exception) { exception.printStackTrace(response.getWriter()); } } } im JSP definierter Name das Servlet übergibt das ViewBean im Session-Context, daher scope=session im JSP!