vierseitig

Werbung
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
Zugehörige Unterlagen
Herunterladen