einseitig

Werbung
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
Herunterladen