JSP
Konzepte[edit]
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[edit]
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[edit]
Es gibt drei wichtige JSP-Konstrukte:
- Scriptingelemente (<%...)
- Direktiven (<%@ ...)
- Actions (<jsp:<action>)
Comments[edit]
JSP-Kommentare werden durch <%-- <Comment> --%> geklammert.
Scriptingelemente[edit]
Expression Scritingelement[edit]
<%= <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[edit]
<% <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[edit]
<%! <Java code> %>
Direktiven[edit]
Die Struktur für die verschiedenen Direktiven:
<%@ [page|include|taglib] <Attribute> %>
Page Direktive[edit]
Mit der page Direktive können folgende Attribute definiert werden:
- autoflush
- buffer
- contentType
- errorPage
- extends
- import
- info
- isThreadSafe
- language
- pageEncoding
- session
- ...
import[edit]
Hiermit wird festgelegt, welche Pakete das aus der Übersetzung der JSP-Seite resultierende Servlet importieren soll.
<%@ page import=”<Package>.<Class>{,<Package>.<Class>}” %>
errorPage[edit]
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[edit]
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 (Compilezeit, nicht zur Laufzeit wie bei der include action). The content of the file given in the include directive is ‘pasted’ as it is, in the place where the JSP include directive is used.
<%@ include file=”<URL>”>
taglib Direktive[edit]
<%@ 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 />
Methods[edit]
jspInit()[edit]
The jspInit() method of the javax.servlet.jsp.JspPage interface is similar to the init() method of servlets. This method is invoked by the container only once when a JSP page is initialized. It can be overridden by a page author.
Actions[edit]
Actions add functionalities at runtime (not compile time). Actions use constructs in XMS syntax.
include[edit]
The jsp:include action element is like a function call. At runtime (not compile time), the included file will be ‘executed’ and the result content will be included with the soure JSP page. When the included JSP page is called, both the request and response objects are passed as parameters.
<jsp:include page="<Name>" />
Verwendung von Beans in JSP[edit]
<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[edit]
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[edit]
Zugriff auf den servlet context[edit]
Der Zugriff erfolgt wie bei einem normalen servlet mit getServletContext().
Parameter auslesen[edit]
String s = request.getParameter("<Parametername>");
Logging[edit]
Logging erfolgt wie bei einem normalen servlet mit log().