Nutzung von Beans (1/2) Nutzung von Beans (2/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 Basis-Design-Pattern für Web-Applikationen request Controller JSP response JavaBean 195 public Kunde(){} schreibt übergibt Kontrolle (und request) request) Prof. Dr. Stephan Kleuker package entities; entities; public class Kunde { private String name; name; private int alter; private String adresse; adresse; Servlet liest Komponentenbasierte SoftwareEntwicklung Kombination von HTML, Servlets und JSP (1/6) • Ansatz heißt Model-View-Controller 2 (MVC2) als • 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="*") ="*" public Kunde(String name, name, int alter, String Adresse) { this.name = name; name; this.alter = alter; this.adresse = adresse; adresse; } als Model liest // getget- und setset-Methoden für die Attribute als View Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 196 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 197 Kombination von HTML, Servlets und JSP (2/6) Kombination von HTML, Servlets und JSP (3/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 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 Kombination von HTML, Servlets und JSP (4/6) Kombination von HTML, Servlets und JSP (5/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> <?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 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 199 Stephan Kleuker 200 Prof. Dr. Stephan Kleuker 201 Kombination von HTML, Servlets und JSP (6/6) 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 202 Variante <jsp:useBean> zur Objekt-Erstellung (2/2) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 203 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 204 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 205 Beispiel: application-Sichtbarkeitsbereich (1/3) Beispiel: application-Sichtbarkeitsbereich (2/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 (3/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 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 208 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 209 Fehlerbehandlung (1/3) - index.jsp 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> <%@page <%@page contentType="text/html" contentType="text/html" pageEncoding="UTFpageEncoding="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 (3/3) Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 211 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 212 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 213 Projektstruktur 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 • 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 Direktes Laden (1/3) - titel.jspf Prof. Dr. Stephan Kleuker Prof. Dr. Stephan Kleuker 215 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"> <%@ 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 Komponentenbasierte SoftwareEntwicklung <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> 216 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 217 Direktes Laden (3/3) 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 218 Dynamisches Laden (2/3) - index.jsp Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 219 Dynamisches Laden (3/3) • 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 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 221 Expression Language (EL) 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> • 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) (2/2) Prof. Dr. Stephan Kleuker Prof. Dr. Stephan Kleuker 223 EL-Zugriffe auf implizite Variablen <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 Komponentenbasierte SoftwareEntwicklung • 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 224 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 225 Parameter in EL EL-Operatoren <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 Konsequente EL-Nutzung <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} requestScope.ergebnis.alter} <br <br> br> Adresse: ${requestScope.ergebnis.adresse ${requestScope.ergebnis.adresse} requestScope.ergebnis.adresse} </body </body> body> Prof. Dr. Stephan Kleuker Komponentenbasierte SoftwareEntwicklung ${groesse ${groesse * kilogramm} kilogramm} ${a[0] || a["1"] and true} ${wert > 42} ${wert ge 42} Prof. Dr. Stephan Kleuker 227 JavaServer Pages Standard Tag Library (JSTL) • Statt Komponentenbasierte SoftwareEntwicklung 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 228 • 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 c:out (1/2) <%@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 (2/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: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> • c:out damit zentrales Hilfsmittel gegen Code-Injection Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 232 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 233 c:choose (2/2) 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:foreach (1/4) Prof. Dr. Stephan Kleuker 235 c:foreach (2/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 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker <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> 236 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 237 c:foreach (3/4) c:foreach (4/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 <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> 238 c:set (1/2) Prof. Dr. Stephan Kleuker 239 c:set (2/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 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker <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> 240 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 241 c:url (1/2) c:url (2/2) • Parameter werden auch aufbereitet (hier + für Leerzeichen) • erlaubt URL-Rewriting <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> <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: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 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 243