JSP
Konzepte
Die Technologie der JavaServer Pages (JSP) ermöglicht es reguläres statisches HTML mit dynamisch generierten Inhalten zu mischen. Der Web Application Server erzeugt aus einer JSP den Code eines Servlets und generiert dieses. Der statische HTML-Anteil wird Template-Text genannt.
Standardobjekte
Die folgenden Variablen können in jeder JSP verwendet werden. Sie werden auch als implizite Objekte bezeichnet.
- application Typ ServletContext, Anwendungsobjekt (s.
getServletContext()). Lebt solange, wie der Server läuft. - config, das ServletConfig-Objekt
- out, JSPWriter, der die Daten in den HTTP-Response-Stream schreibt
- page, das Servlet selber
- pageContext, eine Instanz des PageContext, welche die Daten der gesamten Seite enthält
- request, das HttpServletRequest-Objekt
- response, das HttpServletResponse-Objekt
- session, das HTTP-Session-Objekt. Es kann dazu benutzt werden, Information über den Benutzer von einem Request zum nächsten weiterzureichen.
- this, das HTTPServlet-Objekt
JSP-Konstrukte
Es gibt drei wichtige JSP-Konstrukte:
- Scriptingelemente (<%...)
- Direktiven (<%@ ...)
- Aktionen.
JSP-Kommentare werden durch <%-- <Comment> --%> geklammert.
Scriptingelemente
Expression
<%= <Expression> %> Die Expression wird direkt in einen String konvertiert und in die Seite eingefügt. Beispiel:
Current time: <%= new java.util.Date() %>
XML-Autoren verwenden folgende Syntax: <jsp:expression> <Expression> </jsp:expression>
Scriptlets
<% <Code> %>\\ <jsp:scriptlet> <nowiki><Code></nowiki> </jsp:scriptlet> // not TOMCAT 4.0
Sie werden in die von service() aufgerufene _jspService-Methode des Servlets eingefügt.
Declarations
<%
%>
Direktiven
Die Struktur für die verschiedenen Direktiven:
<%@ <Direktive> <Attribute> %>
<Direktive> := (page, include, taglib)
Page Direktive
Mit der page Direktive können folgende Attribute definiert werden:
<PageAttribut> := (import, contentType, isThreadSafe, session, buffer, autoflush, extends, info, errorPage, language)
- import Attribut
Hiermit wird festgelegt, welche Pakete das aus der Übersetzung der JSP-Seite resultierende Servlet importieren soll.
<%@ page import=”<Package>.<Class>{,<Package>.<Class>}” %>
- errorPage Attribut
Das Attribut spezifiziert eine JSP-Seite, die etwaige Ausnahmen (d.h. etwas vom Typ Throwable) verarbeiten soll.
<%@ page errorPage=”<URL>”>
Falls die Datei nicht da ist, passiert zumindest beim compilieren nichts.
Include Direktive
Mit der include Direktive bindet man eine Datei in das JSP Hauptdokument in dem Moment ein, in dem das Dokument in ein Servlet übersetzt wird.
<%@ include file=”<URL>”>
- taglib Direktive\\
<%@ taglib uri="<URI>" prefix="<Prefix>" %>
- uri-Attribut
Das uri-Attribut kann eine absolute oder relative URL sein, die auf eine Descriptor-Datei einer Tag-Bibliothek verweist.
- prefix-Attribut
Das prefix-Attribut spezifiziert ein Präfix, das vor jeden vom Descriptor der Tag-Bibliothek definierten Tag gesetzt wird. Wenn z.B. die TLD-Datei ein Tag namens tag1 definiert und das prefix-Attribut den Wert test hat wäre der tatsächliche Name:
<test:tag1>
...
</test:tag1>
bzw. ohne Body
<test:tag1 />
Verwendung von Beans in JSP
<jsp:useBean id="<Name>" class="<Package>.<Class>" 'type="<Type>"'
[scope="(page | application | session | request)"] />
Dies entspricht in etwa folgender Anweisung:
<%
if (<Name> == null || <Name>.<Scope>
= <Scope>)\\
{<Package>.<Class> <Name> = new <Package>.<Class>(); \\' return '(<Type>) <Name>;\\
}\\
else\\
{\\
return (<Package>.<Class>) <Name>; \\
}\\
%> \\
Mit anderen Worten: falls eine Bean mit dem gleichen Namen und Scope schon existiert, wird eine gecastete Referenz darauf zurückgegeben, ansonsten eine gecastete neue Referenz zurückgegeben. Der Zugriff auf Attribute einer Bean kann auf zwei Arten erfolgen:
<jsp:getProperty name="<BeanID>" property="<PropertyName>" /> bzw.
<%= <BeanID>.get<PropertyName>() %>
Tag-Bibliotheken
Mit JSP 1.1 wurde die Möglichkeit eingeführt eigene JSP-Tags zu definieren. Selbst-definierte JSP-Tags können im Gegensatz zu Beans JSP-Inhalte manipulieren, man kann sie in eine deutlich einfachere Fom bringen und sie definieren ein in sich geschlossenes Verhalten.
Um selbst definierte JSP-Tags benutzen zu können, müssen drei getrennte Komponenten definiert werden:
- die Tag-Handler Klasse, die das Verhalten definiert
- die Descriptor-Datei für die Tag-Bibliothek, die die Namen der XML-Elemente den Tag-Implementierungen zuordnet
- die JSP-Datei, die die Tags nutzt.
- Tag-Handler Klasse\\
Eine Tag-Handler Klasse muß das Interface javax.servlet.jsp.tagext.Tag implementieren. Normalerweise geschieht dies durch die Klasse TagSupport oder BodyTagSupport.
Tags, die entweder gar keinen Rumpf besitzen oder als Rumpf nur einen wörtlichen Inhalt haben, sollten die Klasse TagSupport erweitern. Für ein Tag ohne Attribute oder Rumpf muss lediglich die Methode doStartTag() überschrieben werden. Diese definiert den Code, der dort, wo das Tag auftaucht, zum Anfragezeitpunkt aufgerufen wird.
Wenn das Tag keinen Rumpf hat, sollte die doStartTag() Methode die Konstante SKIP_BODY zurückgeben. Dies veranlasst das System, jeglichen Inhalt zwischen dem Start- und Ende-Tag zu ignorieren.
- Descriptor-Datei\\
Um eine Tag-Handler Klasse beim Server zu identifizieren und es mit einem speziellen XML-Tag-Namen zu verbinden wird eine Descriptor-Datei (Tag Library Descriptor, TLD) für eine Tag-Bibliothek erstellt.
- JSP-Datei\\
Vor der Benutzung eines Tags muss die taglib-Direktive eingefügt werden.
Tips and Tricks
Zugriff auf den servlet context
Der Zugriff erfolgt wie bei einem normalen servlet mit getServletContext().
Logging
Logging erfolgt wie bei einem normalen servlet mit log().