Java Enterprise: GUI JSP

Java Server Pages, abgekürzt JSP, ist eine von Sun Microsystems entwickelte Technologie, die im Wesentlichen zur einfachen dynamischen Erzeugung von HTML- und XML-Ausgaben eines Webservers dient. Sie erlaubt es, Java-Code und spezielle JSP-Aktionen in statischen Inhalt einzubetten. Dies hat den Vorteil, dass die Logik unabhängig vom Design implementiert werden kann.

Die JSP-Syntax erlaubt es, mittels spezieller XML-Tags (JSP-Aktionen) vordefinierte Funktionalität einzubinden. Diese JSP-Aktionen werden in sogenannten Tag-Bibliotheken (Tag Libaries) als Erweiterung der HTML bzw. XML Tags definiert.

Java Server Pages werden unter Verwendung eines speziellen JSP-Compilers in Java-Servlet-Quellcode umgewandelt. Dieser Quellcode wird im Anschluss durch den Java-Compiler in Bytecode umgewandelt. Die so erzeugten Java-Klassen können dann von einer Servlet-Engine ausgeführt werden.

Grundsätzlich lassen sich JSP als eine Art HTML- oder XML-Seite mit zusätzlichen JSP-spezifischen Tags und Java-Code beschreiben. Eine JSP kann grob in die folgenden Elemente aufgeteilt werden:

  • statischer Inhalt wie HTML
  • JSP-Direktiven
  • JSP-Skriptelemente
  • JSP-Aktionen
  • JSP Tag-Bibliotheken (Tag Libraries)

Statischer Inhalt

Bearbeiten

Der statische Inhalt sind alle jenen Elemente, die vom Webserver in die HTTP-Response (Antwort) ohne Veränderung übernommen werden (z. B. HTML-Tags). So wäre ein normales HTML-Dokument gänzlich ohne JSP-Elemente, wie eingebetteten Java-Code oder JSP-Aktionen, eine gültige JSP. Denn eine JSP erlaubt es zwar dynamische Daten in statischen Inhalt einzufügen, setzt es aber nicht voraus.

Ein großer Vorteil der JSP-Technologie ist, dass der Ersteller des statischen Inhalts (also des Designs) über keine Java-Kenntnisse verfügen muss.

Da es sich bei einer JavaServer Page um eine dynamische Komponente handelt, kann diese aber auch gänzlich ohne statische Elemente auskommen. Auf diese Weise ist es möglich, über ein JSP-Dokument auch Binärdaten wie Bilder zu erzeugen und an den Client zu senden.

Direktiven

Bearbeiten

Eine Direktive dient zum Übermitteln von speziellen Seiteninformationen an den JSP-Compiler; dadurch kann man angeben, ob die JSP eine Taglib einbindet oder wie im Fehlerfall weiter zu verfahren ist.

Die allgemeine Syntax für eine Direktive ist <%@ ... %>. Folgende Direktiven sind vorhanden:

  • include, diese Direktive weist den JSP-Compiler an, den vollständigen Inhalt einer externen Datei in die Originaldatei zu kopieren.
<%@ include file="BeispielDatei.ext" %>
  • page
    • import, ein Java-Import-Statement wird in der Datei generiert
    • contentType, gibt die Art des Datei-Inhaltes an. Sollte dann eingesetzt werden, wenn man kein HTML benutzt oder den Default-Zeichensatz nicht verwendet
    • errorPage, gibt die Seite an, die im Fehlerfall angezeigt werden soll
    • isErrorPage, gibt an ob diese Seite eine Error-Page ist oder nicht, wenn ja ist das exception Objekt verfügbar
    • isThreadSafe, gibt an ob das aus der JSP generierte Servlet threadsicher ist oder nicht
<%@ page import="java.util.*" %> //import
<%@ page contentType="text/html" %> //contentType
<%@ page isErrorPage=false %> //die Seite ist keine Error-Page
<%@ page isThreadSave=true %> //eine threadsichere JSP
  • tagLib, diese Direktive gibt an, dass eine Taglib verwendet werden soll. Es muss ein Prefix und eine URI für die Taglib vergeben werden.
<%@ taglib prefix="MeinPrefix" uri="taglib/MeineTagLib.tld" %>

Skriptelemente

Bearbeiten

Standardvariablen

Bearbeiten

Die folgenden Variablen können in jeder JSP verwendet werden.

  • 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 HTTP-Request-Objekt
  • response, das HTTP-Response-Objekt
  • session, das HTTP-Session-Objekt. Es kann dazu benutzt werden, Information über den Benutzer von einem Request zum nächsten weiterzureichen.

Scriptelemente

Bearbeiten

Es gibt drei grundlegende Skriptelemente, die es erlauben, Java-Code direkt in das Servlet einzufügen.

  • Ein Tag, der es erlaubt, Code in die Klasse einzufügen. Dieser Tag kann dazu verwendet werden, Daten der Klasse festzulegen.
    <%! int serverInstanceVariable = 1;%>
  • Ein Tag, der es erlaubt, Code in die _jspService() Methode des resultierenden Servlets einzufügen.
    <% int localStackBasedVariable = 1; %>
  • Ein Tag, der es erlaubt, Code zu expandieren und direkt in die HTTP-Antwort zu schreiben. Das Semikolon wird hier nicht benutzt, da der Code als Ausdruck ausgewertet wird.
    <%= "expanded inline data " + 1 %>

Deklarationen

Bearbeiten

Deklarationen dienen zur Definition von Variablen und Methoden, die von anderen Elementen in der JSP verwendet werden können. Deklarationen erzeugen keine Ausgabe innerhalb der JSP.

<%! int variableMeinerKlasse = 0; %>

Dies definiert eine „static“ Variable, die nur einmal im Arbeitsspeicher abgelegt wird! Zeitgleiche Aufrufe aus verschiedenen Instanzen greifen also auf dieselben Daten zu. Möchte man aber eine „VariableMeinerKlasse“ haben, dessen Wert in jeder Instanz meiner Klasse einen eigenen Wert hat, dann muß man eine Variable wie gewohnt in den normalen <% %>-Tags definieren:

<% String meinName; meinName=theResult.getString("name"); ... %>

Ausdrücke

Bearbeiten

Ausdrücke ('expressions') werden dazu verwendet, Variablen oder Methoden direkt in den HTML- oder XML-Ausgabestrom zu integrieren.

Die Klassenvariable ist <%= variableMeinerKlasse %>

Skriptlets

Bearbeiten

JSP-Skriptlets können zur Implementierung der Ablauflogik sowie der Erzeugung der HTML- oder XML-Ausgabe eingesetzt werden. Der Skriptlet-Code wird innerhalb der _jspService() Methode des generierten Servlets eingefügt.

<% int variable = 0; out.println("Der Wert der Variable ist : " + variable); %>

Kommentare

Bearbeiten

Kommentare sind nur innerhalb der originalen JSP sichtbar, sie werden nicht in den Ausgabestrom geschrieben.

<%-- Kommentar innerhalb einer JSP --%>

Aktionen

Bearbeiten

JSP-Aktionen sind XML-Tags die die eingebaute Funktionalität von Webservern einbinden. Die folgenden Aktionen sind verfügbar:

  • jsp:include, die angegebene JSP wird vom Java-Servlet aufgerufen, dabei wird der Request und der Response übergeben. Ist die angegeben JSP abgearbeitet, kommt die Steuerung zur gegenwärtigen JSP zurück. Diese JSP-Aktion bewirkt, dass JSP-Code zwischen zwei JSPs geteilt anstatt kopiert wird.
<jsp:include page="mycommon.jsp">
    <jsp:param name="extraparam" value="myvalue"/>
</jsp:include>
  • jsp:param, definiert einen Parameter, der zu den Request-Parametern hinzugefügt wird. Diese Aktion kann innherhalb eines jsp: include oder jsp: forward Blocks verwendet werden.
  • jsp:forward, der Request und der Response wird an eine andere JSP oder ein Servlets übergeben. Die Steuerung kommt nicht zur gegenwärtigen JSP zurück.
<jsp:forward page="subpage.jsp">
    <jsp:param name="forwardedFrom" value="this.jsp"/>
</jsp:forward>
  • jsp:plugin, diese Aktion generiert je nach verwendetem Browser einen Tag zum Einbinden eines Java-Applets. Dies wird benötigt, da in den älteren Versionen der Browser von Netscape (Navigator) und Microsoft (Internet Explorer) verschiedene Tags zum Einbinden eines Applets verwendet werden.
<jsp:plugin type="applet" height="100%" width="100%"
  archive="myjarfile.jar,myotherjar.jar"
  codebase="/applets"
  code="com.foo.MyApplet">
    <jsp:params>
        <jsp:param name="enableDebug" value="true"/>
    </jsp:params>
    <jsp:fallback>
        Your browser does not support applets.
    </jsp:fallback>
</jsp:plugin>
  • jsp:fallback, definiert den Inhalt der angezeigt wird, falls der Browser keine Applets unterstützt.
  • jsp:setProperty, diese Aktion setzt ein Property in der definierten Java-Bean.
<jsp:setProperty name="myBean" property="lastChanged" value="<%= new Date()%>" />
  • jsp:getProperty, diese Aktion holt sich ein Property von der definierten Java-Bean.
<jsp:getProperty name="myBean" property="lastChanged" />
  • jsp:useBean, diese Aktion erstellt oder verwendet eine Java-Bean wieder. Das Attribut scope gibt an wie lange Attribute zur Verfügung stehen. Folgende Werte können definiert werden:
    • request – Attribute sind nur solange verfügbar, wie der Request existiert.
    • page – Attribute sind nur für die gegenwärtige JSP verfügbar
    • session – Attribute sind nur solange verfügbar, wie die Benutzer-Session existiert
    • application – Attribute sind immer verfügbar
<jsp:useBean id="myBean" class="com.foo.MyBean" scope="request"/>

Tag-Bibliotheken

Bearbeiten

Zusätzlich zu den vordefinierten JSP-Aktionen gibt es die Möglichkeit, benutzerdefinierte JSP-Aktionen zu verwenden. Dazu muss eine eigene JSP-Tag-Bibliothek zur Verfügung gestellt werden. Eine Tag-Bibliothek wird über eine XML-Beschreibungsdatei, den so genannten Tag Library Descriptor (TLD), definiert, der Elemente (Tags) zu einer Bibliothek (Library) zusammenfasst und mit serverseitigen Java-Klassen assoziert, die die funktionale Logik eines oder mehrerer Tags implementieren.

Im Rahmen des Java Comunity Process wurde die JavaServer Pages Standard Tag Library (JSTL) erstellt. Diese standardisiert die wichtigsten Customtags in verschiedenen Bibliotheken.

Model-View-Controller

Bearbeiten

Sun Microsystems empfiehlt die Verwendung des Model 2 Entwurfsmusters (ähnlich dem „Model View Controller Pattern“) beim Benutzen von JSPs. Für sehr kleine Projekte kann das Model 1 benutzt werden. Das Pattern hat den Sinn die Darstellung von der Request-Verarbeitung und Datenspeicherung zu trennen. Es sollten eigene Servlets für die Request Verarbeitung verwendet werden. Nach der Request-Verarbeitung sollte eine eigene JSP nur für die Erstellung des Ausgabestroms vorhanden sein. Diese JSP sollte nur HTML oder XML und vordefinierte oder benutzerdefinierte JSP-Aktionen enthalten. Zum Einbinden der Daten sollten Java-Beans verwendet werden.

Model View Controller Pattern
 

Siehe dazu auch: Model View Controller Muster

Mit Einführung der Servlet API 2.4 und der Verabschiedung von JSP 2.0 ist es möglich, komplett auf JSP-Skriptelemente zu verzichten. JSPX-Dokumente entsprechen wohlgeformten XML-Dokumenten, deren Tag-Elemente durch eindeutige Namensräume definiert sind. So ist es beispielsweise möglich, XHTML-konforme Ausgaben zu erzeugen, ohne dass Tag-Bezeichner kollidieren.

Das folgende Beispiel zeigt das Gerüst eines wohlgeformten JSPX-Dokumentes zur Erzeugung von XHTML-Code. Über das XML-Wurzelelement „<jsp:root>“ werden ein Standardnamensraum für XHTML-Elemente definiert (xmlns) und ein Namensraum für JSP-Elemente (xmlns:jsp). Durch das Voranstellen des jeweiligen Namensraums (z. B. <jsp: ...) kann ein Tag auf diese Weise eindeutig referenziert werden. Auch Java Tag Libraries werden auf diese Weise als Namensraum eingebunden; eine entsprechende Direktive gibt es nicht mehr. Die Namensraumdefinition wird an Kindelemente vererbt.

Im Beispiel wird, aus Kompatibilitätsgründen zu aktuellen Browsern, über die JSP-Direktive „page“ als Content-Type "text/html" anstatt "application/xhtml+xml" vereinbart, da viele gängige Browser XHTML-Dokumente sonst als XML-Quelltext interpretieren würden, anstatt die XHTML-Elemente zu interpretieren und darzustellen.

<?xml version="1.0" encoding="utf-8"?>
<jsp:root xmlns="http://www.w3.org/1999/xhtml" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
    <jsp:output doctype-root-element="html"
        doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
        doctype-system="http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />
    <jsp:directive.page contentType="text/html; charset=utf-8" language="java" />
    <html xmlns="http://www.w3.org/1999/xhtml">
       XHTML- und/oder JSP-Elemente
    </html>
</jsp:root>

Eine weitere Neuerung ist die so genannte „Expression Language“ (EL). Die Expression-Language besteht aus Skriptelementen, die an Skriptelemente interpretierter Skriptsprachen angelehnt ist. Jedes Skriptelement beginnt mit einem Dollar-Zeichen und schließt einen Ausdruck (engl. expression) in geschweiften Klammern ein.

${1+2}, ${PI/2}, ${person.name}

Der Ausdruck kann ein einfacher Platzhalter einer Variablen sein, eine Konstante oder ein Term. Auch eine Referenzierung innerhalb abstrakter Datenstrukturen ist über Introspektion möglich.

Eine spezielle Erweiterung des JSP-Compilers ersetzt vor dem Kompiliervorgang jedes Vorkommen der EL-Elemente durch den entsprechenden Java-Code.

Die EL-Elemente wurden so konzipiert, dass sie vollständig ohne geschützte XML-Entitäten auskommen. Somit wird der Einsatz in wohlgeformten XML-Dokumenten möglich.

Versionen

Bearbeiten
  • JSP 1.0
  • JSP 1.1
  • JSP 1.2
  • JSP 2.0 (JSPX, EL)

Siehe auch: JSF

Bearbeiten