JSP: Difference between revisions
| Line 114: | Line 114: | ||
===Tag-Bibliotheken=== | ===Tag-Bibliotheken=== | ||
Mit JSP 1.1 wurde die Möglichkeit eingeführt eigene JSP-Tags zu definieren. Mit Hilfe von Tag-Libraries ist es möglich, JSP-Seiten zu entwickeln, die nur noch wenig bis gar keinen Java-Code beinhalten. Solche JSP-Seiten bieten dann die Schnittstelle zwischen dem Web-Designer, der kein Java versteht, und dem Web-Entwickler, der die dynamischen Teile einer Seite entwickelt. | Mit JSP 1.1 wurde die Möglichkeit eingeführt eigene JSP-Tags zu definieren. Mit Hilfe von Tag-Libraries ist es möglich, JSP-Seiten zu entwickeln, die nur noch wenig bis gar keinen Java-Code beinhalten. Solche JSP-Seiten bieten dann die Schnittstelle zwischen dem Web-Designer, der kein Java versteht, und dem Web-Entwickler, der die dynamischen Teile einer Seite entwickelt. Sobald die Abarbeitung einer JSP-Seite das Start- bzw. End-Tag eines Tags erreicht, ruft die Servlet-Engine bei der Tag-Klasse bestimmte Methoden auf. Die Tag-Klasse kann dann im Java-Code Berechnungen durchführen, Daten von einer Persistenzschicht lesen oder schreiben oder auch zusätzlichen HTML-Code in die Antwortseite schreiben. | ||
Eine Tag-Library besteht aus: | |||
*Tag-Handler Klasse | *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. | Eine Tag-Handler Klasse muß das Interface javax.servlet.jsp.tagext.Tag implementieren. Normalerweise geschieht dies durch die Klasse TagSupport oder BodyTagSupport. | ||
| Line 125: | Line 123: | ||
*Descriptor-Datei | *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. | 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. | ||
Vor der Benutzung eines Tags muss die [[JSP#taglib_Direktive|taglib-Direktive]] eingefügt werden. | Vor der Benutzung eines Tags muss die [[JSP#taglib_Direktive|taglib-Direktive]] eingefügt werden. | ||
Revision as of 11:38, 13 August 2008
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 (<%@ ...)
- Actions (<jsp:<action>)
Comments
JSP-Kommentare werden durch <%-- <Comment> --%> geklammert.
Scriptingelemente
Expression Scritingelement
<%= <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>
Scriptlet Scritingelement
<% <Code> %> <jsp:scriptlet> <Code> </jsp:scriptlet> // not TOMCAT 4.0
Sie werden in die von service() aufgerufene _jspService-Methode des Servlets eingefügt.
Declaration Scritingelement
<%! <Java code> %>
Direktiven
Die Struktur für die verschiedenen Direktiven:
<%@ [page|include|taglib] <Attribute> %>
Page Direktive
Mit der page Direktive können folgende Attribute definiert werden:
- autoflush
- buffer
- contentType
- errorPage
- extends
- import
- info
- isThreadSafe
- language
- pageEncoding
- session
- ...
import
Hiermit wird festgelegt, welche Pakete das aus der Übersetzung der JSP-Seite resultierende Servlet importieren soll.
<%@ page import=”<Package>.<Class>{,<Package>.<Class>}” %>
errorPage
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 (s.u) 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 />
Actions
Actions use constructs in XMS syntax.
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. Mit Hilfe von Tag-Libraries ist es möglich, JSP-Seiten zu entwickeln, die nur noch wenig bis gar keinen Java-Code beinhalten. Solche JSP-Seiten bieten dann die Schnittstelle zwischen dem Web-Designer, der kein Java versteht, und dem Web-Entwickler, der die dynamischen Teile einer Seite entwickelt. Sobald die Abarbeitung einer JSP-Seite das Start- bzw. End-Tag eines Tags erreicht, ruft die Servlet-Engine bei der Tag-Klasse bestimmte Methoden auf. Die Tag-Klasse kann dann im Java-Code Berechnungen durchführen, Daten von einer Persistenzschicht lesen oder schreiben oder auch zusätzlichen HTML-Code in die Antwortseite schreiben.
Eine Tag-Library besteht aus:
- 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.
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().
Parameter auslesen
String s = request.getParameter("<Parametername>");
Logging
Logging erfolgt wie bei einem normalen servlet mit log().