Nutzung von Beans (1/2) • Generell können in Servlets und JSPs selbst entwickelte JavaKlassen (POJO, Plain Old Java Objects) direkt genutzt werden • Um möglichst wenig Java in JSPs zu haben, existieren sogenannte Aktionselemente (Action Elements) • Idee, z. B. XML-artige Erzeugung und Nutzung von Beans • Beanerzeugung oder Suche einer Bean <jsp:useBean id="kunde id="kunde" " class="entities.Kunde" class="entities.Kunde" scope="request"/> scope="request"/> wenn Attribut kunde nicht im Gültigkeitsbereich request, dann kunde = new entities.Kunde(); entities.Kunde(); sonst kunde=(Kunde)request.getAttribute("kunde"); kunde=(Kunde)request.getAttribute("kunde"); id: (Variablen-)Name, dann auch kunde.getAdresse() kunde.getAdresse() möglich class: voll qualifizierter Klassenname scope: page, request, session, application type: Typ der Variablen kunde Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 194 Nutzung von Beans (2/2) • Set-Methode (auch für Attribute und Properties aus request) <jsp:setProperty name="kunde" name="kunde" property="adresse" property="adresse" value=“ value=“Xstr. Xstr. 42" /> entspricht kunde.setAdresse("XStr. kunde.setAdresse("XStr. 42"); name: name vergebene id property: property Name der zu ändernden Eigenschaft value: value Wert (wird konvertiert, wenn möglich) param: param Alternativ Parameter aus request nutzbar • Get-Methode (auch für Attribute und Properties aus request) <jsp:getProperty name="kunde" name="kunde" property="adresse" property="adresse" /> entspricht kunde.getAdresse(); kunde.getAdresse(); name s.o; property: property zu lesende Eigenschaft • weitere vereinfachte Möglichkeiten mit JavaBeans zu arbeiten hier nicht betrachtet (param param="*" param="*") ="*" Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 195 Basis-Design-Pattern für Web-Applikationen • Ansatz heißt Model-View-Controller 2 (MVC2) Servlet request liest als Controller schreibt übergibt Kontrolle (und request) request) JSP response JavaBean als Model liest als View Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 196 Kombination von HTML, Servlets und JSP (1/6) package entities; entities; public class Kunde { private String name; name; private int alter; private String adresse; adresse; public Kunde(){} public Kunde(String name, name, int alter, String Adresse) { this.name = name; name; this.alter = alter; this.adresse = adresse; adresse; } // getget- und setset-Methoden für die Attribute Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 197 Kombination von HTML, Servlets und JSP (2/6) <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"> Transitional//EN"> <html> html> <!-<!-- index.html --> --> <head> head> <title>Detailanfrage</title> title>Detailanfrage</title> <meta httphttp-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"> </head </head> head> <body> body> <form name="suche" name="suche" action="Suche"> action="Suche"> Name: <input type="text" type="text" name="name" name="name" value="" value="" size="15" /> <input type="submit" type="submit" value="Abschicken" value="Abschicken" name="send" name="send" /> </form> </body </body> body> </html </html> html> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 198 Kombination von HTML, Servlets und JSP (3/6) public class Suche extends HttpServlet { private Set<Kunde> Set<Kunde> kunden = new HashSet<Kunde>(); HashSet<Kunde>(); @Override public void init(){ init(){ kunden.add(new Kunde("Ute",42,"XStr. 3")); kunden.add(new Kunde("Urs",43,"YStr. 9")); kunden.add(new Kunde("Ulf",44,"YStr. 3")); } protected void processRequest(HttpServletRequest request, request, HttpServletResponse response) response) throws ServletException, ServletException, IOException { String name= name= request.getParameter("name"); request.getParameter("name"); Kunde ergebnis= ergebnis= new Kunde(name,Kunde(name,-1,"fehlt"); for(Kunde k:kunden) k:kunden) if(k.getName().equals(name)) if(k.getName().equals(name)) ergebnis=k; ergebnis=k; request.setAttribute("erg", request.setAttribute("erg", ergebnis); ergebnis); RequestDispatcher view = request.getRequestDispatcher("ergebnis.jsp"); request.getRequestDispatcher("ergebnis.jsp"); view.forward(request, view.forward(request, response); response); }... Komponentenbasierte SoftwareProf. Dr. Entwicklung Stephan Kleuker 199 Kombination von HTML, Servlets und JSP (4/6) <%@page <%@page contentType="text/html" contentType="text/html" pageEncoding="UTFpageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN" Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> html> <head> head> <meta httphttp-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"> <title>Suchergebnis</title> title>Suchergebnis</title> </head </head> head> <body> body> <jsp:useBean id="ergebnis" id="ergebnis" class="entities.Kunde" class="entities.Kunde" scope="request"/> scope="request"/> Name: <jsp:getProperty <jsp:getProperty name="erg" name="erg" property="name"/> property="name"/> <br <br> br> Alter: <jsp:getProperty <jsp:getProperty name="erg" name="erg" property="alter"/> property="alter"/> <br <br> br> Adresse: <jsp:getProperty <jsp:getProperty name="erg" name="erg" property="adresse"/> property="adresse"/> </body </body> body> </html </html> html> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 200 Kombination von HTML, Servlets und JSP (5/6) <?xml <?xml version="1.0" encoding="UTFencoding="UTF-8"?> <webweb-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> servlet> <servletservlet-name>Suche</servletname>Suche</servlet-name> name> <servletservlet-class>servlets.Suche</servletclass>servlets.Suche</servlet-class> class> </servlet </servlet> servlet> <servletservlet-mapping> mapping> <servletservlet-name>Suche</servletname>Suche</servlet-name> name> <urlurl-pattern>/Suche</urlpattern>/Suche</url-pattern> pattern> </servlet </servletservlet-mapping> mapping> <welcomewelcome-filefile-list> list> <welcomewelcome-file>index.html</welcomefile>index.html</welcome-file> file> </welcome </welcomewelcome-filefile-list> list> </web </webweb-app> app> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 201 Kombination von HTML, Servlets und JSP (6/6) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 202 Variante <jsp:useBean> zur Objekt-Erstellung (1/2) • im Java-Programm: String name name= = request.getParameter("name"); request.getParameter("name"); //Kunde ergebnis= ergebnis= new Kunde(name,Kunde(name,-1,"fehlt"); for(Kunde k:kunden) k:kunden) if(k.getName().equals(name)) if(k.getName().equals(name)) //ergebnis=k //ergebnis=k; ergebnis=k; request.setAttribute("ergebnis", request.setAttribute("ergebnis", k); • in der JSP-Seite <jsp:useBean id="ergebnis id="ergebnis" " class="entities.Kunde" class="entities.Kunde" scope="request"> scope="request"> <jsp:setProperty name="ergebnis" name="ergebnis" property="name" property="name" value="nicht gefunden"/> <jsp:setProperty name="ergebnis" name="ergebnis" property="alter" property="alter" value="value="-1"/> </jsp:useBean </jsp:useBean> jsp:useBean> Name: <jsp:getProperty <jsp:getProperty name="ergebnis" name="ergebnis" property="name"/> property="name"/> <br <br> br> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 203 Variante <jsp:useBean> zur Objekt-Erstellung (2/2) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 204 Kommentare • HTML-Kommentare in JSPs werden ins Ergebnis übertragen, also nicht <!-<!-- Jetzt krisch isch das Passwort von die Deppe --> --> <input type="password" type="password" name="passwort" name="passwort" value="" value="" size="15" /> • JSP-Kommentare in <%-<%-- und --%> --%>, korrekt <%-<%-- Jetzt krisch isch das Passwort von die Deppe --%> --%> <!-<!-- Systemrelevantes Passwort erfragen --> --> <input type="password" type="password" name="passwort" name="passwort" value="" value="" size="15" /> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 205 Beispiel: application-Sichtbarkeitsbereich (1/3) • ermöglicht Datenhaltung für alle Nutzer dieser Applikation • entspricht auf Servlet-Ebene context request.getSession().getServletContext() request.getSession().getServletContext() • gültig solange Applikation läuft (evtl. über Event-Listener Inhalte persistieren) • Aufgabe: alle Nutzer haben einen Basisbetrag, von dem Sie eine Summe in gemeinsamen Spendentopf zahlen können <%@page <%@page contentType="text/html" contentType="text/html" pageEncoding="UTFpageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> html> <head> head> <meta httphttp-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"> <title>Spenden</title> title>Spenden</title> </head </head> head> <body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 206 Beispiel: application-Sichtbarkeitsbereich (2/3) <% // default: default: Session angelegt in JSP, hier isNew() isNew() kritisch if (session.getAttribute("betrag") session.getAttribute("betrag") == null) session.setAttribute("betrag", session.setAttribute("betrag", 50); if (application.getAttribute("summe") application.getAttribute("summe") == null) application.setAttribute("summe", application.setAttribute("summe", 0); if (request.getParameter("spende") request.getParameter("spende") != null) { int zahlen = Integer.parseInt( Integer.parseInt( (String) request.getParameter("spende")); request.getParameter("spende")); int vorhanden = (Integer) session.getAttribute("betrag"); session.getAttribute("betrag"); int spende = (Integer) application.getAttribute("summe"); application.getAttribute("summe"); application.setAttribute("summe", application.setAttribute("summe", spende + zahlen); session.setAttribute("betrag", session.setAttribute("betrag", vorhanden - zahlen); } %> Bisher gespendet: <%=application.getAttribute("summe")%><br <%=application.getAttribute("summe")%><br> application.getAttribute("summe")%><br> Sie haben: <%=session.getAttribute("betrag <%=session.getAttribute("betrag")%> session.getAttribute("betrag")%> <form name="f1" action="index.jsp" action="index.jsp" method="POST"> method="POST"> was spenden?<input type="text" type="text" name="spende" name="spende" value=""size="4"/> <input type="submit" type="submit" value="Abschicken" value="Abschicken" name="b" name="b" /> </form> </body </body> body> </html </html> html> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 207 Beispiel: application-Sichtbarkeitsbereich (3/3) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 208 Lebensdauer (scope) page request session application nur nur für einen aktuelle Aufruf Seite (auch für Weiterleitung) für eine NutzerSitzung solange Zeit aktuelles Deployment läuft • Anmerkung: Obwohl es verlockend ist, viele Informationen in session oder application zu legen, ist dies verboten (wird gespeichert, evtl. passiviert, hat wilde Referenzen, Zugriff muss ggfls. synchronisiert werden) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 209 Fehlerbehandlung (1/3) - index.jsp <%@page contentType="text/html" " pageEncoding="UTF<%@page contentType="text/html pageEncoding="UTF-8" errorPage="/WEBerrorPage="/WEB-INF/fehler.jsp"%> INF/fehler.jsp"%> <!-<!-- ... --> --> <% int zahlen = Integer.parseInt((String) Integer.parseInt((String) request.getParameter("spende")); request.getParameter("spende")); int vorhanden = (Integer) session.getAttribute("betrag"); session.getAttribute("betrag"); int spende = (Integer) application. application. getAttribute("summe"); getAttribute("summe"); if (zahlen==42) throw new MyEx(); MyEx(); <!-<!-- ... --> --> package excep; excep; public class MyEx extends Exception{} Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 210 Fehlerbehandlung (2/3) - fehler.jsp <%@page contentType="text/html" " pageEncoding="UTF<%@page contentType="text/html pageEncoding="UTF-8" isErrorPage="true" isErrorPage="true" import="java.io.PrintWriter"%> import="java.io.PrintWriter"%> <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN" Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> html> <head> head> <meta httphttp-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"> <title>Zeich Fehler</title> </head </head> head> <body> body> Fehlerinfos: <%=exception.getMessage <%=exception.getMessage()%> exception.getMessage()%> <br <br> br> evtl. Hintergrund: <%=exception.getCause()%><br <%=exception.getCause()%><br> exception.getCause()%><br> Details:<br> Details:<br> <% exception.printStackTrace(new PrintWriter(out));%> PrintWriter(out));%> </body </body> body> <%-<%-- mindesten 512 Byte fuer IE --%> --%> </html </html> html> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 211 Fehlerbehandlung (3/3) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 212 Weitere Fehlerbehandlungsmöglichkeiten • im Deployment-Descriptor (web.xml) <welcomewelcome-filefile-list> list> <welcomewelcome-file>/index.jsp</welcomefile>/index.jsp</welcome-file> file> </welcome </welcomewelcome-filefile-list> list> <errorerror-page> page> <exceptionexception-type>java.lang.Throwable</exceptiontype>java.lang.Throwable</exception-type> type> <location>/JSPSpielerei5/WEB<location>/JSPSpielerei5/WEB-INF/fehler.jsp</location> </error </errorerror-page> page> <errorerror-page> page> <error<error-code>500</errorcode>500</error-code> <location>/JSPSpielerei5/WEB<location>/JSPSpielerei5/WEB-INF/fehler1.jsp</location> </error </errorerror-page> page> • es gilt JSP-Einstellung vor web.xml • typisch auch Möglichkeiten für alle Teile der Applikation Fehlerseite für Server einzustellen (sun-web.xml) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 213 Projektstruktur • Wichtig: Alle Informationen in WEB-INF sind nicht für Nutzer zugängig, d.h. nicht aufrufbar • Informationen auf gleicher Baumhöhe wie WEB-INF können von außen gelesen werden • (nicht hier) Variante: LoginFilter, so dass nur bestimmte Nutzergruppe auch Dateien außerhalb von WEB-INF sieht Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 214 Wiederverwendung • generell: klassische Java-Entwicklung • Strukturierung durch Auslagerung von Fragmenten möglich • <%@include <%@include file="Titel.jsp"%> file="Titel.jsp"%> – In file benannte Datei wird direkt an dieser Stelle hinein kopiert – Einbettung zur Übersetzungszeit (schnell) • <jsp:include page="Titel.jsp" page="Titel.jsp" /> – Hiermit wird die Antwort von Titel.jsp direkt an diese Stelle kopiert – Einbettung zur Laufzeit (langsamer) – übergebene Daten nutzbar, aber keine(!) Rückgabewerte • generell: genutzte Dateien sollten in sich abgeschlossen sein • bei Endungen verschiedene Konventionen, z. B. .jspf Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 215 Direktes Laden (1/3) - titel.jspf <%@ page pageEncoding="UTFpageEncoding="UTF-8" %> <img src="Kohle.jpg" src="Kohle.jpg" alt="Logo" alt="Logo" > <br <br> br> Hallo, <%if(request.getParameter("name")!=null <%if(request.getParameter("name")!=null) if(request.getParameter("name")!=null) out.println(request.getParameter("name")+ out.println(request.getParameter("name")+ ", Du kannst"); else out.println("Sie koennen"); koennen"); %> uns vetrauen. vetrauen. Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 216 Direktes Laden (2/3) - index.jsp <%@page <%@page contentType="text/html" contentType="text/html" pageEncoding="UTFpageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN" Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> html> <head> head> <meta http http-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"> <title>Trust Bank</title> </head </head> head> <%@include <%@include file="/WEBfile="/WEB-INF/jspf/titel.jspf"%> INF/jspf/titel.jspf"%> <body> body> <h1>Trust Bank</h1> </body </body> body> </html </html> html> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 217 Direktes Laden (3/3) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 218 Dynamisches Laden (1/3) - titel.jsp <%@page <%@page contentType="text/html" contentType="text/html" pageEncoding="UTFpageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN" Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> html> <head> head> <meta httphttp-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"> <title>JSP Page</title> </head </head> head> <body> body> <img src="Kohle.jpg" src="Kohle.jpg" alt="Logo" alt="Logo" > <br <br> br> Hallo, <% if (request.getParameter("name") request.getParameter("name") != null) out.println(request.getParameter("name")+", out.println(request.getParameter("name")+", Du kannst"); else out.println("Sie koennen"); koennen"); %> uns vetrauen. vetrauen. </body </body> body> </html </html> html> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 219 Dynamisches Laden (2/3) - index.jsp • inkludierte JSP muss vollständig sein; keine Rückgabewerte <%@page <%@page contentType="text/html" contentType="text/html" pageEncoding="UTFpageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN" Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> html> <head> head> <meta httphttp-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"> <title>Trust Bank</title> </head </head> head> <jsp:include page="/WEBpage="/WEB-INF/jspf/titel.jsp"> INF/jspf/titel.jsp"> <jsp:param name="name" name="name" value="geldwerter Kunde" /> </jsp:include </jsp:include> jsp:include> <body> body> <h1>Trust Bank</h1> </body </body> body> </html </html> html> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 220 Dynamisches Laden (3/3) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 221 Expression Language (EL) • Idee: Zugriff auf alle impliziten und selbstdefinierten Variablen ohne Nutzung von Java-Syntax • direkte Nutzung von Attributen statt request.getAttribute("kunde").getName() ).getName() [auch ok] ${kunde.name ${kunde.name} kunde.name} oder auch $kunde["name"] • (fast) alle impliziten Variablen stehen als leichte Varianten als Map zur Verfügung, also var: String Object Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 222 Beispielausschnitt (Nutzung EL) (1/2) <body> body> <%-<%-- Datenspielerei --%> --%> <% request.setAttribute("att","42");%> z1 ${att}<br ${att}<br> att}<br> <% request.setAttribute("kunde", request.setAttribute("kunde", new Kunde("ich",42,"XStr"));%> z2 ${kunde}<br ${kunde}<br> kunde}<br> z3 ${kunde.adresse}<br ${kunde.adresse}<br> kunde.adresse}<br> <% session.setAttribute("kunde2", new Kunde("du",43,"YStr"));%> z4 ${kunde2.name}<br> <% session.setAttribute("kunde", session.setAttribute("kunde", new Kunde("er",31,"ZStr"));%> z5 ${kunde.adresse}<br ${kunde.adresse}<br> kunde.adresse}<br> z6 ${kunde["name"]}<br ${kunde["name"]}<br> kunde["name"]}<br> </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 223 Beispielausschnitt (Nutzung EL) (2/2) <body> body> <%@page <%@page import="java.util.HashMap" import="java.util.HashMap" %> <% HashMap<String,Kunde> HashMap<String,Kunde> h= new HashMap<String,Kunde>(); HashMap<String,Kunde>(); h.put("super", h.put("super", new Kunde("A",1,"A")); h.put("1b", new Kunde("B",2,"B")); application.setAttribute("h",h); application.setAttribute("h",h); request.setAttribute("super","1b"); %> z1 ${h.super.name}<br ${h.super.name}<br> h.super.name}<br> <%-<%-- ${h.1b} ist verboten --%> --%> z2 ${h["1b"].name}<br> z3 ${h["1b"]["name"]}<br> <% Integer[] i={2,1,5}; application.setAttribute("i",i);%> application.setAttribute("i",i);%> z4 ${i[0]}<br> z5 ${i["2"]}<br> z6 ${i[42]}<br> z7 ${h[super].alter ${h[super].alter} h[super].alter} </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 224 EL-Zugriffe auf implizite Variablen • vom Typ Map: – pageScope Zugriff auf Seiten-Attribute – requestScope Zugriff auf Request-Attribute – sessionScope Zugriff auf Session-Attribute – applicationScope Zugriff auf Applikations-Attribute – param Zugriff auf Request-Parameter – paramValues Zugriff auf Request-Parameterfelder – header Zugriff auf Header [nicht betrachtet] – headerValues s.o. – cookie Zugriff auf Cookies – initParam Zugriff auf Context-Parameter aus DD • eine JavaBean (Zugriff auf PageContext) – pageContext Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 225 Parameter in EL <form name="f1" action="ZeichMal1.jsp"> ID: <input <input type="text" type="text" name="ID" name="ID" value="" value="" size="2" /> <br <br> br> Alt: <input <input type="text" type="text" name="Alt" name="Alt" value="" value="" size="2" /> <br <br> br> P1: <input <input type="text" type="text" name="P" name="P" value="" value="" size="5" /> <br <br> br> P2: <input <input type="text" type="text" name="P" name="P" value="" value="" size="5" /> <br <br> br> <input type="submit" type="submit" value="Abschicken" value="Abschicken" /> </form> <body> body> z1 ${param.ID}<br ${param.ID}<br> param.ID}<br> z2 ${param.Alt}<br ${param.Alt}<br> param.Alt}<br> z3 ${param.P}<br ${param.P}<br> param.P}<br> z4 ${paramValues.P[1]} </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 226 EL-Operatoren Mathematik • Addition: + • Subtraktion: • Multiplikation: * • Division: / und div • Restberechnung: % und mod Logik • UND: && und and • ODER: || und or • NICHT: ! und not Relation • Gleichheit: == und eq • Ungleichheit: != und ne • Kleiner als: < and lt • Größer als: > and gt • Kleiner-gleich: <= and le • Größer-Gleich: >= and ge Komponentenbasierte SoftwareEntwicklung ${groesse ${groesse * kilogramm} kilogramm} ${a[0] || a["1"] and true} ${wert > 42} ${wert ge 42} Prof. Dr. Stephan Kleuker 227 Konsequente EL-Nutzung • Statt <body> body> <jsp:useBean id="ergebnis" id="ergebnis" class="entities.Kunde" class="entities.Kunde" scope="request"/> scope="request"/> Name: <jsp:getProperty <jsp:getProperty name="ergebnis" name="ergebnis" property="name"/><br> property="name"/><br> Alter: <jsp:getProperty <jsp:getProperty name="ergebnis" name="ergebnis" property="alter"/><br> property="alter"/><br> Adresse: <jsp:getProperty <jsp:getProperty name="ergebnis" name="ergebnis" property="adresse"/> property="adresse"/> </body </body> body> • Alternativ <body> body> Name: ${requestScope.ergebnis.name ${requestScope.ergebnis.name} requestScope.ergebnis.name} <br <br> br> Alter: ${requestScope.ergebnis.alter ${requestScope.ergebnis.alter} <br> requestScope.ergebnis.alter} <br br> Adresse: ${requestScope.ergebnis.adresse ${requestScope.ergebnis.adresse} requestScope.ergebnis.adresse} </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 228 JavaServer Pages Standard Tag Library (JSTL) • EL ermöglicht einfachen Zugriff auf Variablen (Attribute und Parameter) • Eine Steuerung des Ablaufs der Seitenerstellung in JSPs ist mit EL nicht möglich (man kann Funktionen für die Expression Language schreiben als Klassenmethoden von Java-Klassen) • JSTL erlaubt die strukturierte Ablaufsteuerung bei der Seitenerstellung – z. B. Iterieren über Collections – z. B. alternative Abläufe • zunächst als reine Ergänzung zu JSPs konzipiert • EL kann in JSTL-Ausdrücken genutzt werden • JSTL 1.2 ist Teil von JEE 5 • http://java.sun.com/products/jsp/jstl/ Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 229 Einbindung von JSTL <%@taglib prefix= prefix=" "c" uri=" uri="http://java.sun.com http://java.sun.com/ java.sun.com/jsp/ jsp/jstl/core jstl/core" /core" %> • URI ist eindeutiger Name • mehrere JSTL-Bibliotheken; Ablaufsteuerung in core • Prefix-Angabe bezeichnet benutzten Namensraum; wird bei XML-Tag genutzt • c für core üblich • Nutzung: <c:out value="${param.info} value="${param.info} " escapeXml="true" escapeXml="true" /> • generell optionale und Pflichtparameter • wieder zwei Varianten von Anführungsstrichen "so" und 'so' möglich (sinnvoll beim Schachteln) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 230 c:out (1/2) <form name="f1" action="zeige.jsp"> action="zeige.jsp"> Info: <input <input type="text" type="text" name="Info" name="Info" value="" value="" size="20" /> <input type="submit" type="submit" value="Abschicken" value="Abschicken" /> </form> <%@taglib <%@taglib prefix="c" prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> uri="http://java.sun.com/jsp/jstl/core"%> <%@page <%@page contentType="text/html" contentType="text/html" pageEncoding="UTFpageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN" Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> html> <head <head> head> <meta httphttp-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"> <title>Zeige</title> title>Zeige</title> </head </head> head> <body> body> z1: <c:out <c:out value="${param.Info}"/> value="${param.Info}"/> <br <br> br> z2: <c:out <c:out value="${param.Info}" value="${param.Info}" escapeXml="false"/><br> escapeXml="false"/><br> z3: <c:out <c:out value="${param.nichda}" value="${param.nichda}" default="Ich"/> default="Ich"/> </body </body> body> </html </html> html> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 231 c:out (2/2) • c:out damit zentrales Hilfsmittel gegen Code-Injection Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 232 c:if • hier kein allgemeines else machbar <body> body> <c:if test="${param.Info eq 'Hai'}"> z1: Fisch <br <br> br> </c:if </c:if> c:if> <c:if test="${param.Info eq 'Hai'}" var="b" var="b" scope="request"> scope="request"> z2: ${requestScope.b ${requestScope.b} requestScope.b} <br <br> br> </c:if </c:if> c:if> <c:if test="${param.Nichda}" test="${param.Nichda}" var="b2" scope="request"> scope="request"> z3: ${b2} <br <br> br> </c:if </c:if> c:if> z4: ${b}${b2} </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 233 c:choose (1/2) <body> <c:choose> c:choose> <c:when test="${param.Info test="${param.Info < 'C'}"> Fall 1 </c:when </c:when> c:when> <c:when test="${param.Info test="${param.Info < 'E'}"> Fall 2 </c:when </c:when> c:when> <c:when test="${param.Info test="${param.Info < 'G'}"> Fall 3 </c:when </c:when> c:when> <c:otherwise> c:otherwise> Fall 4 </c:otherwise </c:otherwise> c:otherwise> </c:choose </c:choose> c:choose> </body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 234 c:choose (2/2) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 235 c:foreach (1/4) <body> body> <% String[] vl = {"OOAD", "DB", "KbSE "KbSE"}; KbSE"}; request.setAttribute("VL", request.setAttribute("VL", vl); vl); %> <ul> ul> <c:forEach var="v" var="v" items="${VL}"> items="${VL}"> <li> li> ${v} </li </li> li> </c:forEach </c:forEach> c:forEach> </ul </ul> ul> </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 236 c:foreach (2/4) <body> body> <% String[] v = {"OOAD", "DB", "KbSE "KbSE"}; KbSE"}; List<String> List<String> vl= vl= new ArrayList<String>(); ArrayList<String>(); for(int i=0;i<v.length;i++) vl.add(v[i]); vl.add(v[i]); request.setAttribute("VL", request.setAttribute("VL", vl); vl); %> <ul> ul> <c:forEach var="v" var="v" items="${VL}" items="${VL}" varStatus="vc"> varStatus="vc"> <li> li> ${vc.count ${vc.count}: vc.count}: ${v} </li </li> li> </c:forEach </c:forEach> c:forEach> </ul </ul> ul> </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 237 c:foreach (3/4) <body> body> <% String[][] vl ={{"OOAD", "DB", "KbSE"},{"C","C "KbSE"},{"C","C++"}}; KbSE"},{"C","C++"}}; request.setAttribute("VL", request.setAttribute("VL", vl); vl); %> <ul> ul> <c:forEach var="v1" items="${VL}" items="${VL}" varStatus="v1c"> <c:forEach var="v2" items="${v1}" varStatus="v2c"> <li> li> ${v1c.count}:${v2c.count} ${v2} </li </li> li> </c:forEach </c:forEach> c:forEach> </c:forEach </c:forEach> c:forEach> </ul </ul> ul> </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 238 c:foreach (4/4) <body> body> <% String[] vl ={"OOAD", "DB", "KbSE "KbSE", KbSE", "BA"}; request.setAttribute("VL", request.setAttribute("VL", vl); vl); %> <ul> ul> <c:forEach var="v1" items="${VL}" items="${VL}" varStatus="v1c" begin="2" end="3"> <c:forEach var="v2" items="${v1}" varStatus="v2c"> <li> li> ${v1c.count}:${v2c.count} ${v2} </li </li> li> </c:forEach </c:forEach> c:forEach> </c:forEach </c:forEach> c:forEach> </ul </ul> ul> </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 239 c:set (1/2) <body> body> <c:set var="s1" value="WHV" value="WHV" scope="session"/> scope="session"/> <c:set var="s2" value="${param.Info}"/> value="${param.Info}"/> <c:set var="s3"> OL, PI, WI, OS </c:set </c:set> c:set> ${s1} : ${s2} <br <br> br> <c:forEach var="s" var="s" items="${s3}" varStatus="vs"> varStatus="vs"> ${s} <c:if test="${!vs.last}"> test="${!vs.last}"> :: </c:if </c:if> c:if> </c:forEach </c:forEach> c:forEach> </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 240 c:set (2/2) <bean> bean> <jsp:useBean id="b" id="b" class="entities.Kunde" class="entities.Kunde" scope="page"/> scope="page"/> z1: ${b.name ${b.name} b.name} <br <br> br> <c:set target="${b}" target="${b}" property="name" property="name" value="Eva"/> value="Eva"/> z2: ${b.name ${b.name} b.name} <br <br> br> <c:set var="v" var="v" value="Egon" value="Egon" scope="session"/> scope="session"/> z3: ${v} <br <br> br> <c:set var="v" var="v" value="${param.nichda}"/> value="${param.nichda}"/> z4: ${v} <br <br> br> <c:if test="${v == null}"> weg </c:if </c:if> c:if> </bean </bean> bean> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 241 c:url (1/2) • erlaubt URL-Rewriting <body> body> <a href="<c:url value='/ende.jsp'/>">Schluss</a> value='/ende.jsp'/>">Schluss</a> <br <br> br> <c:url var="pfad" var="pfad" value="index.jsp"/> value="index.jsp"/> ${pfad ${pfad} pfad} </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 242 c:url (2/2) • Parameter werden auch aufbereitet (hier + für Leerzeichen) <body> body> <c:set var="par1" value="K & O" /> <c:set var="par2" value="2 / 4"/> <c:set var="pfad" var="pfad" value="/index.jsp"/> value="/index.jsp"/> <c:url value="${pfad}?p1=${par1}&p2=${par2}" var="purl"/> var="purl"/> z1 ${purl ${purl} purl} <br <br> br> <c:url value="${pfad}" value="${pfad}" var="purl2"> <c:param name="p1" value="${par1}"/> <c:param name="p2" value="${par2}"/> </c:url </c:url> c:url> z2 ${purl2} </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 243 c:catch <body> body> <c:catch var="exep"> var="exep"> Dim Dim <br> br> <c:catch var="exep2"> <% String[] hai={"H","A","I"}; hai={"H","A","I"}; hai[3].length(); %> Dim Dim <br> br> </c:catch </c:catch> c:catch> <c:if test="${exep2 != null}"> ${exep2.message} <br <br> br> </c:if </c:if> c:if> </c:catch </c:catch> c:catch> <c:if test="${exep2 != null}"> ${exep2} <br <br> br> </c:if </c:if> c:if> <c:if test="${exep1 == null}"> Dim Dim <br> br> </c:if </c:if> c:if> </body </body> body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 244