Generierter Java−Quellcode

Werbung
Generierter Java−Quellcode
// begin
[file="/export/home/klute/tomcat/webapps/ROOT/Kontostand.j
sp";from=(12,5);to=(15,2)]
float kaufsumme = 123.46f;
float saldoAlt = 100.00f;
float saldoNeu;
// end
// begin [file="/export/home/klute/tomcat/webapps/RO...
String format(float f)
{
String s = Float.toString(f);
return f >= 0 ? s :
"<span style=’color: red’>" + s + "</span>";
}
// end
Web−Anwendungen mit Java
151
Generierter Java−Quellcode
static {
}
public _0002fKontostand_0002ejspKontostand_jsp_0( ) {
}
private static boolean _jspx_inited = false;
public final void _jspx_init() throws JasperException {
}
public void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
Web−Anwendungen mit Java
152
Generierter Java−Quellcode
String
try {
_value = null;
if (_jspx_inited == false) {
_jspx_init();
_jspx_inited = true;
}
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=8859_1");
pageContext = _jspxFactory.getPageContext(this,
request, response,
"", true, 8192, true);
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
Web−Anwendungen mit Java
153
Generierter Java−Quellcode
// HTML // begin [file="/export/home/klute/t...
out.write("<!doctype html public \"−
//W3C//DTD HTML 4.0//EN//\">\r\n<html>\r\n <head>\r\n
<title>Ihr Kontostand</title>\r\n </head>\r\n\r\n <body
style=\"background: #ffffff\">\r\n <h1>Ihr
Kontostand</h1>\r\n\r\n ");
// end
// HTML // begin [file="/export/home/klute/t...
out.write("\r\n <!−− HTML−Kommentar: wird
in generiertes Servlet eingefügt. −−>\r\n\r\n ");
// end
// HTML // begin [file="/export/home/klute/t...
out.write("\r\n\r\n <table
border=\"1\">\r\n
<tr>\r\n
<td>Alter Saldo:</td>\r\n
<td>");
// end
// begin [file="/export/home/klute/t...
out.print( saldoAlt );
// end
Web−Anwendungen mit Java
154
Generierter Java−Quellcode
// HTML // begin [file="/export/home/klute/t...
out.write(" EUR</td>\r\n
</tr>\r\n
<tr>\r\n
<td>Kaufsumme:</td>\r\n
<td>");
// end
// begin [file="/export/home/klute/tomcat/we...
out.print( kaufsumme );
// end
// HTML // begin [file="/export/home/klute/t...
out.write(" EUR</td>\r\n
</tr>\r\n\r\n");
// end
// begin [file="/export/home/klute/tomcat/we...
saldoNeu = saldoAlt − kaufsumme;
// end
// HTML // begin [file="/export/home/klute/t...
out.write("\r\n\r\n
<tr>\r\n
<td>Neuer Saldo:</td>\r\n
");
// end
// HTML // begin [file="/export/home/klute/t...
out.write("\r\n
<td>");
// end
Web−Anwendungen mit Java
155
Generierter Java−Quellcode
// begin [file="/export/home/klute/tomcat/we...
out.print( format(saldoNeu) );
// end
// HTML // begin [file="/export/home/klute/t...
out.write(" EUR</td>\r\n
</tr>\r\n
</table>\r\n\r\n ");
// end
// HTML // begin [file="/export/home/klute/t...
out.write("\r\n\r\n <p>\r\n
");
// end
// begin [file="/export/home/klute/tomcat/we...
if (saldoNeu >= 0) {
// end
// HTML // begin [file="/export/home/klute/t...
out.write("\r\n
Sie haben ein Guthaben
von ");
// end
// begin [file="/export/home/klute/tomcat/we...
out.print( saldoNeu );
// end
Web−Anwendungen mit Java
156
Generierter Java−Quellcode
// HTML // begin [file="/export/home/klute/t
out.write(" EUR.\r\n
");
// end
// begin [file="/export/home/klute/tomcat/w...
} else {
// end
// HTML // begin [file="/export/home/klute/t...
out.write("\r\n
Ihr Konto ist um ");
// end
// begin [file="/export/home/klute/tomcat/w...
out.print( −saldoNeu );
// end
// HTML // begin [file="/export/home/klute/t...
out.write(" EUR überzogen.\r\n
");
// end
// begin [file="/export/home/klute/tomcat/w...
}
// end
Web−Anwendungen mit Java
157
Generierter Java−Quellcode
// HTML // begin [file="/export/home/klute/t...
out.write("\r\n </p>\r\n\r\n
</body>\r\n</html>\r\n");
// end
}
}
} catch (Exception ex) {
if (out.getBufferSize() != 0)
out.clearBuffer();
pageContext.handlePageException(ex);
} finally {
out.flush();
_jspxFactory.releasePageContext(pageContext);
}
Web−Anwendungen mit Java
158
JSP−Seite als XML−Dokument
•
•
Skripting−Anweisungen sind nicht SGML− bzw. XML−
konform.
–
Syntaxgesteuertes Editieren der JSP−Seiten mit SGML−
oder XML−Editor nicht möglich.
–
Schnellschuß der ersten JSP−Version
JSP 1.2 ermöglicht XML−Darstellung
–
Alternativ zum JSP−Skripting
–
<jsp:expression>i + 27</jsp:expression>
Web−Anwendungen mit Java
159
Java−Bean nutzen
•
MVC: JSP−Seite visualisiert Controller (Java−Bean).
•
Java−Bean (vereinfacht): Exemplar einer Java−
Klasse, deren Attribute foo sich mit Methoden wie
getFoo() und setFoo(value) abfragen und ändern
lassen
•
Java−Bean repräsentiert ein Business −Objekt.
–
•
•
Beispiel: Produkt
JSP−Seite präsentiert die Bean:
–
Aufruf der entsprechenden getFoo()−Methoden und
–
Integration der Ergebniswerte in die HTML−Seite.
JSP−Seite benötigt Zugriff auf die Java−Bean.
Web−Anwendungen mit Java
160
Beispiel: Java−Bean nutzen
<html>
<jsp:useBean id="product"
class="eshop.Product"/>
<% product.setId
(request.getParameter("productId")); %>
<ul>
<li>
<p>Produkt: <%= product.getName() %></p>
</li>
<li>
<p>Preis:
<%= product.getPrice() %></p>
</li>
</ul>
</html>
Web−Anwendungen mit Java
161
Beispiel: Java−Bean nutzen
•
Elemente wie <jsp:xxx>...</jsp:xxx> oder
<jsp:xxx/> heißen Aktionen.
•
Element <jsp:useBean ...> erzeugt Instanz der
Klasse eshop.Product mit dem Namen product.
Das Objekt product steht anschließend in der JSP−
Seite zur Verfügung.
•
<% product.setId
(request.getParameter("productId")); %>
übermittelt den Wert des Request−Parameters
productId zur Initialisierung an das Objekt.
•
<%= product.getPrice() %> ermittelt den
Preis und schreibt ihn in den Ausgabestrom out.
Web−Anwendungen mit Java
162
Ressourcen einbetten
•
•
•
Ziel: Weitere Ressource der Anwendung in den
Ausgabestrom einbetten
–
Datei in Ausgabe einbetten, z.B. standardisierten
Seitenkopf oder −fuß
–
JSP−Seite, −Fragment oder Servlet in Ausgabe
integrieren
Weg: PageContext−Methode
include(String relativeUriPath)
–
pageContext.include("header.html");
–
pageContext.include("/ad/finance.jsp");
Einbetten von Ressourcen anderer Web−Server
nicht möglich
Web−Anwendungen mit Java
163
Ressourcen einbetten
•
URI ohne /: relativ zur Adresse der JSP−Seite
–
•
URI mit /: relativ zur Wurzel des Web−Servers
–
•
pageContext.include("header.jsp");
pageContext.include("/copyright.html");
Der HttpServletRequest bleibt in allen beteiligten
Seiten derselbe.
HttpServletRequest
Web−Anwendungen mit Java
Seite 1:
164
Seite 2:
Ressourcen einbetten
•
JSP−Fragment
–
Wird dynamisch in eine JSP−Seite eingebettet
–
Selbst keine syntaktisch korrekte JSP−Seite
–
Übersetzung nicht möglich
–
JSP−1.2−Spezifikation schlägt Namenskonvention vor.
–
Endung .jspf oder .jsf
Web−Anwendungen mit Java
165
Request weiterleiten
•
Ziel: Request nicht durch die aktuelle JSP−Seite
bearbeiten, sondern durch eine andere aktive
Komponente der Anwendung (Servlet, JSP−Seite).
•
Typische Anwendungsfälle:
•
–
Aktuelle JSP−Seite dient als Verteiler und verzweigt
parameterabhängig zur eigentlichen Zielseite.
–
Ausnahmebehandlung, z.B. weil Rechte fehlen
Weg: PageContext−Methode
forward(String relativeUrlPath)
Web−Anwendungen mit Java
166
Request weiterleiten
•
Beispiel:
if (!request.isUserInRole("webmaster"))
{
pageContext.forward("wm−login.jsp");
return;
}
•
Nach Aufruf von forward() darf der aufrufende
Thread keine Ausgaben nach out schreiben (siehe
Beispiel).
Web−Anwendungen mit Java
167
Implizite Objekte
•
Implizite Objekte stehen in jeder JSP−Seite
automatisch zur Verfügung.
•
Gültigkeitsbereiche:
–
Page: Objekt ist nur in dieser JSP−Seite gültig.
–
Request: Objekt ist in allen JSP−Seiten gültig, die
denselben Request bearbeiten − siehe include() und
forward().
–
Session: Objekt ist in allen JSP−Seiten und Requests
gültig, die zu derselben Sitzung gehören.
–
Application: Objekt ist in allen JSP−Seiten und
Requests einer Anwendung gültig, auch in Seiten
ohne Session−Kontext und in anderen Sessions.
Web−Anwendungen mit Java
168
Implizite Objekte
Name
Klasse
Bedeutung
request
Unterklasse von
ServletRequest, z.B.
HttpServletRequest
response
Response
Unterklasse von
ServletResponse, z.B.
HttpServletResponse
pageContext PageContext
session
HttpSession
Web−Anwendungen mit Java
Request
Gültig in
Request
Page
Kontext dieser JSP−
Seite. Bietet Zugriff
auf alle impliziten
Page
Session, falls
vorhanden.
Session
169
Implizite Objekte
Name
Klasse
Bedeutung
Gültig in
application
ServletContext
Servlet−Kontext
Application
out
JspWriter
Schreiben von
Ausgabedaten
Page
config
ServletConfig
Servlet−Konfiguration Page
page
Object
Diese JSP−Seite
(„this“)
exception
Throwable
Ursache des Aufrufs Page
der Fehlerseite (nur
definiert, falls die JSP−
Seite eine Error−Seite
ist)
Web−Anwendungen mit Java
170
Page
Direktiven an den JSP−Container
•
•
•
page
–
Definiert Eigenschaften der JSP−Seite.
–
<%@ page session="false" buffer="15kb" %>
include
–
Integriert Datei in JSP−Seite
–
<%@ include file="copyright.html" %>
taglib
–
Erlaubt selbstdefinierte Tags
–
<super:foo>...</super:foo>
–
<%@ taglib uri="http://www.foo.bar/tags"
prefix="super" %>
Web−Anwendungen mit Java
171
Direktive »page«: Attribute
•
language="scriptingLanguage"
–
•
Sprache der Skripting−Anweisungen. Derzeit einziger
möglicher Wert: "java".
extends="className"
–
Generiertes JSP−Servlet besitzt die angegebene
Oberklasse.
–
Vorsicht: Dieses Attribut überschreibt die Voreinstellung
des JSP−Containers. Tomcat:
org.apache.jasper.runtime.HttpJspBase (erbt
von HttpServlet, implementiert HttpJspPage).
Web−Anwendungen mit Java
172
Direktive »page«: Attribute
•
import="importList"
–
Liste importierter Klassen bzw. Pakete. Beispiel:
<%@page import="java.util.*, java.io.File"%>
–
•
Voreingestellt: java.lang.*, javax.servlet.*, javax.servlet.jsp.*,
javax.servlet.http.*
session="true|false"
–
Gibt an, ob diese Seite zu einer Session gehört. Definiert
implizites Objekt HttpSession session. Falls
session="false", ist dieses Objekt undefiniert.
Web−Anwendungen mit Java
173
Direktive »page«: Attribute
•
•
buffer="none|sizekb"
–
Mindestgröße des Puffers für den Ausgabestrom out.
–
buffer="none": Ausgaben gehen ohne Pufferung an
den PrintWriter der ServletResponse.
–
Voreinstellung für size ist implementationsabhängig, aber
mindestens 8kb.
autoFlush="true | false"
–
Gibt an, ob voller Puffer automatisch zum Empfänger
geschickt wird (true) oder eine Exception erzeugt (false).
Web−Anwendungen mit Java
174
Direktive »page«: Attribute
•
•
isThreadSafe="true | false"
–
Gibt an, ob JSP−Seite thread−sicher ist.
–
Eine thread−sichere JSP−Seite kann von mehreren
parallelen Requests gleichzeitig ausgeführt werden.
–
Eine nicht thread−sichere Seite wird von mehreren
parallelen Requests nacheinander ausgeführt.
info="infoText"
–
Beliebiger Text, läßt sich mit
Servlet.getServletInfo() abfragen.
Web−Anwendungen mit Java
175
Direktive »page«: Attribute
•
errorPage="errorUrl"
–
•
isErrorPage="true | false"
–
•
Diese Seite führt eine Fehlerbearbeitung durch. Hier ist
die Variable Throwable exception definiert, die auf
das nicht abgefangene Throwable verweist.
contentType="contentType"
–
•
Bei einem nicht abgefangenen Throwable bearbeitet die
angegebene JSP−Seite den Request weiter.
Voreinstellung: text/html;charset=ISO−8859−1
pageEncoding="encoding"
–
Voreinstellung: Zeichensatz aus contentType
oder ISO−8859−1
Web−Anwendungen mit Java
176
Direktive »include«
•
Dateien in die Ausgabe integrieren
•
Direktive »include«
•
–
Beispiel: <%@ include file="header.html" %>
–
Bindet Datei zur Übersetzungszeit ein.
–
Eingebundene Datei wird dynamisch ausgewertet.
Alternative: Aktion <jsp:include>
–
Beispiel: <jsp:include page="/copyright.html"
flush="true"/>
–
Adressierung relativ zur Wurzel der Web−Anwendung
–
Bindet Datei zur Laufzeit ein.
–
Übernahme des Dateiinhalts ohne Veränderungen
Web−Anwendungen mit Java
177
Direktive »taglib«
•
Stellt eigene Elemente (»Tags«) zur Verfügung
•
Beispiel: <%@ taglib
uri="http://www.foo.bar/taglib"
prefix="form" %>
•
<form:questionnaire foo="bar">
...
</form:questionnaire>
•
uri="taglibURI"
•
–
Identifizierung eines Tag library descriptors (TLD)
–
Zuordnung zum TLD im Deployment descriptor
prefix="prefix"
–
Präfix der Tag−Namen in dieser Seite
Web−Anwendungen mit Java
178
Tag Library: Beispiel
<html>
<%@ taglib uri="http://acme.com/taglibs/simpleDB.tld"
prefix="x" %>
<x:queryBlock connData="some connection data">
<x:queryStatement>
SELECT ACCOUNT, BALANCE FROM ...
</x:queryStatement>
<p>The top 10 accounts and balances are:</p>
<table>
<tr><th>ACCOUNT</th><th>BALANCE</th></tr>
<x:queryCreateRows from="1" to="10">
<td><x:queryDisplay field="ACCOUNT"/></td>
<td><x:queryDisplay field="BALANCE"/></td>
</x:queryCreateRows>
</table>
</x:queryBlock>
</html>
Web−Anwendungen mit Java
179
Tag Library
•
•
Definiert neue Elemente für HTML−Seite.
–
Im Beispiel: <x:queryBlock>, <x:queryStatement>,
<x:queryCreateRows>
–
Kein gültiges HTML mehr, aber XML−konform
Definiert zur Laufzeit eine spezifische Umgebung
–
Innerhalb von queryBlock steht eine
Datenbankverbindung zur Verfügung.
–
queryStatement führt SQL−Anweisung über die
Datenbankverbindung aus.
–
queryCreateRows iteriert über Ergebnis und erzeugt
Ausgabezeilen.
–
queryDisplay gibt Tabellenfeld aus.
Web−Anwendungen mit Java
180
Aktionen
•
Können in den Ausgabestrom out schreiben.
•
Können Objekte erzeugen oder verändern
•
Selbstdefinierte Aktionen (Tag libraries)
•
Standardaktionen
•
–
Reservierter Namensraum <jsp:...>
–
Andere reservierte Namensräume: _jsp, java, sun
XML−Syntax
–
<action attr="foo">bar</action>
–
<action attr="foo"/>
–
<action attr="foo"></action>
Web−Anwendungen mit Java
181
Standardaktion <jsp:useBean>
•
Java−Objekt in der JSP−Seite nutzen.
•
Zwei Hauptvarianten:
•
–
Neues Java−Objekt erzeugen und Namen vergeben
–
Bereits vorhandenes Objekt suchen und nutzen
Wählbarer Gültigkeitsbereich
–
page, request, session, application
•
Sucht spezifiziertes Objekt. Falls nicht vorhanden,
erzeugt <jsp:useBean> das Objekt.
•
Genaues Verhalten hängt ab von
–
den jeweiligen Attributkombinationen und
–
den bereits existierenden Java−Objekten
Web−Anwendungen mit Java
182
Standardaktion <jsp:useBean>
•
Beispiel:
–
•
•
<jsp:useBean id="foo" scope="session"
class="de.rainer_klute.eshop.Product"/>
id: Zwei Bedeutungen:
–
Name des Java−Objekts
–
Name der Skripting−Variablen, die auf das Java−Objekt
verweist
scope: Gültigkeitsbereich der Skripting−Variablen
–
Mögliche Werte: page, request, session, application
Web−Anwendungen mit Java
183
Standardaktion <jsp:useBean>
•
class: Vollqualifizierter Klassenname des Java−
Objekts.
–
•
Beispiel: de.rainer_klute.eshop.Product
type: Typ der Skripting−Variable
–
–
–
Skripting−Variable wird Referenz des Java−Objekts
zugewiesen.
Mögliche Werte für type:
–
dieselbe Klasse wie class,
–
eine Oberklasse von class,
–
ein Interface, das class implementiert.
Beispiel: de.rainer_klute.AbstractProduct
Web−Anwendungen mit Java
184
Standardaktion <jsp:useBean>
•
beanName: Name einer Java−Bean (serialisiertes
Objekt)
–
Beispiel: beanName="foo.bar.Product"
–
Serialisiertes Objekt wird aus Datei foo/bar/Product.ser
deserialisiert.
–
Bei Mißerfolg wird neues Objekt der Klasse
foo.bar.Product erzeugt.
Web−Anwendungen mit Java
185
Standardaktion <jsp:useBean>
Variable id definieren: type id (falls type spezifiziert)
class id (falls type nicht spezifiziert)
Objekt id in scope suchen → ref
Objekt vorhanden
id = (type) ref;
Body enthält
typischerweise Skriptlets
oder <jsp:setProperty>.
Objekt nicht vorhanden,
beanName nicht spezifiziert
id = new class();
scope.add(id);
id = Beans.instantiate
(beanName);
scope.add(id);
Body von <jsp:useBean>
ausführen, falls vorhanden
Web−Anwendungen mit Java
186
Objekt nicht vorhanden,
beanName spezifiziert
Standardaktion <jsp:setProperty>
•
Setzt Properties in einer Bean (siehe <jsp:useBean>).
•
Einfacher Zugriff auf Servlet−Parameter
•
Beispiele:
–
Property row in Bean results Wert zuweisen:
<jsp:setProperty name="results"
property="row" value="<%= i+1 %>"/>
–
Alle Servlet−Parameter in gleichnamige Properties
übertragen, soweit vorhanden (Introspection):
<jsp:setProperty name="request"
property="*"/>
Standardaktion <jsp:setProperty>
•
Zum Setzen der Property »foo« benötigt Bean die
Methode void setFoo(type).
•
Servlet−Parameter sind immer Strings.
•
Automatische Konvertierung von Strings in diverse
Zieltypen
•
–
boolean, byte, char, double, int, float, long
–
Boolean, Byte, Character, Double, Integer, Float, Long
Beim Zuweisungen des Typs <jsp:setProperty
value="value" .../> darf value auch ein Objekt
oder Array sein.
–
Entsprechende set−Methode notwendig
Web−Anwendungen mit Java
188
Standardaktion <jsp:getProperty>
•
Property aus Bean nach out schreiben
•
Konvertierung in String
•
Beispiel:
–
<jsp:getProperty name="user"
property="username"/>
Web−Anwendungen mit Java
189
Standardaktion <jsp:include>
•
Bindet Ressource (statische Datei, Servlet,
JSP−Seite) zur Laufzeit unverändert ein.
•
Siehe pageContext.include(...)
•
Beispiele:
–
<jsp:include page="copyright.html"
flush="true"/>
–
Adressierung ohne /: relativ zur anfordernden JSP−Seite
"
–
Kein Zugriff auf andere Server, da »http://...« nicht mit »/« beginnt
<jsp:include page="/eshop/product?id=4711"
flush="true"/>
–
Adressierung mit /: relativ zur Wurzel des Web−Servers
"
Zugriff auf Ressourcen in anderen Web−Anwendungen
möglich
Web−Anwendungen mit Java
190
Standardaktion <jsp:include>
•
Eingebundene JSP−Seite bzw. Servlet erhält
dasselbe Request−Objekt wie der Aufrufer von
<jsp:include>.
•
Servlet−Parameter lassen sich mittels <jsp:param>
modifizieren oder ergänzen.
•
Beispiel für Parameterübergabe:
–
<jsp:include page="foo.jsp" flush="true">
<jsp:param name="bar1" value="1111"/>
<jsp:param name="bar2" value="2222"/>
</jsp:include>
Standardaktion <jsp:forward>
•
Veranlaßt Bearbeitung des Requests durch eine
andere Ressource (statische Datei, Servlet, JSP−
Seite)
•
Siehe pageContext.forward(...)
•
Beispiel:
<%! String goTo()
{
Calendar c = new GregorianCalendar();
if (c.get(c.AM_PM) == c.AM)
return "GoodMorning.jsp";
else
return "GoodAfternoon.jsp";
}
%>
<jsp:forward page=’<%="/dayTime/" + goTo()%>’/>
Web−Anwendungen mit Java
192
Standardaktion <jsp:forward>
•
Falls schon Ausgaben erzeugt wurden:
–
Ausgabe vollständig im Puffer bzw. noch nichts an Client
geschickt: Puffer leeren, dann Request zur neuen Seite
weiterleiten.
–
Ungepufferte Ausgabe bzw. bereits Daten an Client
geschickt: IllegalStateException.
•
Eingebundene JSP−Seite bzw. Servlet erhält
dasselbe Request−Objekt wie der Aufrufer von
<jsp:forward>, aber entsprechend modifiziert.
•
Servlet−Parameter lassen sich mittels <jsp:param>
modifizieren oder ergänzen. Beispiele für
Parameterübergabe siehe oben (<jsp:include>).
Web−Anwendungen mit Java
193
Standardaktion <jsp:plugin>
•
Erzeugt HTML−Code für den jeweiligen Browser
zur Integration des Java−Plugins von Sun
Microsystems.
–
OBJECT− oder EMBED−Element
•
Java−Applets oder Java−Beans im Browser ablaufen
lassen
•
Details siehe JSP−Spezifikation
Web−Anwendungen mit Java
194
Standardaktion <jsp:param>
•
Parameter an <jsp:include>, <jsp:forward> und
<jsp:plugin>
•
Name−/Wert−Paare
•
Beispiele siehe oben
•
Bei <jsp:include> und <jsp:forward> gilt:
–
Durch <jsp:param> spezifzierte Parameter überschreiben
oder ergänzen die bereits vorhandenen Servlet−
Parameter.
–
Nur innerhalb der durch <jsp:include> bzw. <jsp:forward>
adressierten Seite
Web−Anwendungen mit Java
195
Übungsaufgabe 6: E−Shop mit JSP
Dies ist die angekündigte harmlose Aufgabe: Stellen Sie die Web−Anwendung
aus Übungsaufgabe 5 (E−Shop) auf Java Server Pages um!
Darüber hinaus sollten Sie die evtl. noch nicht fertiggestellten Teile der
Übungsaufgabe 5 komplettieren.
Web−Anwendungen mit Java
196
Compile−Fehler
•
Ursache 1: fehlerhafte JSP−Direktiven oder JSP−
Aktionen
•
Ursache 2: fehlerhafte Java−Anweisungen in der JSP−
Seite
•
Wird vom Entwickler beim ersten Zugriff auf die neue
oder modifizierte Seite bemerkt.
•
Behandlung von Übersetzungsfehlern
implementationsspezifisch
–
•
Von JSP 1.2 nicht spezifiziert
Beispiel:
–
<%= new java.util.Datei() %>
Web−Anwendungen mit Java
197
Compile−Fehler
Web−Anwendungen mit Java
198
Compile−Fehler
Web−Anwendungen mit Java
199
Laufzeitfehler
•
JSP−Seite wird korrekt in ein Servlet übersetzt.
•
Fehler tritt erst bei einem Request auf, also beim
Ablauf des Servlets.
•
Was ist ein Fehler?
–
•
Instanz einer Unterklasse von Throwable, die nicht
abgefangen wird.
Maßnahmen:
–
Fehler explizit abfangen und geeignet behandeln
–
Fehlermeldung ausgeben
Web−Anwendungen mit Java
200
Herunterladen