Beispiel: JSP-Grundlagen


Inhalt:

Beispiel 1: JSP-Grundlagen
Beispiel 2: Controller-Servlet
Beispiel 3: Tag Libraries
Beispiel 4: Custom Tag Libraries
Beispiel 5: Tag Files

Diverse JSP-Beispiele. Alle diese Beispiele arbeiten völlig ohne EJB-Zugriff. Deshalb wird als Projekttyp hier immer ein "Dynamic Web Project" verwendet. Beim Anlegen des Projekts ist wichtig dass wir jeweils die Checkbox "Add project to an EAR" zurücksetzen.
Dynamic Web Project
In Schritt 2 des Projekt-Erstellens müssen wir sicherstellen dass der XDoclet-Builder nicht aktiviert ist.
Dynamic Web Project
In Schritt 3 können wir alle Einstellungen bei den Default-Werten belassen.

Der Export und Re-Import des Projekts erfolgt diesmal nicht als "EAR file" sondern als "WAR file", ansonsten ist das Vorgehen identisch. Beim Import ist zu beachten dass das Projekt wiederum nicht zu einer Enterprise Application zugefügt wird.
In Beispiel 3 verwenden wir TagLibraries, deren JAR-Dateien stecken im Unterverzeichnis "WebContent/WEB-INF/lib". Beim Re-Import müssen wir beachten dass die JARs nicht als Utility-Projekte importiert werden sondern als JARs in Verzeichnis "WEB-INF/lib" gepackt werden (d.h. in Schritt 2 des Importers keine Haken setzen).
Import von JARs

Wichtige Info: Die im folgenden verwendeten Fehlerseiten scheinen bei einem standard-konfigurierten Internet Exploder nicht zu funktionieren. Wenn man z.B. im Beispiel "JSP1" eine negative Zahl eingibt dann kommt eventuell diese Anzeige:
Internet Explorer: Fehler 500
Problem hierbei: der JBoss-Server liefert den HTTP-Fehlercode 500 (Server-Fehler) sowie eine Seite mit der Fehlermeldung zurück. Der Internet Explorer ignoriert diese jedoch und zeigt seine eigene Seite an. Lösung des ganzen: In den Internetoptionen unter "Erweitert" in der Kategorie "Browsing" den Haken vor der Option "Kurze HTTP-Fehlermeldungen anzeigen" entfernen.
Internet Explorer: Fehler 500

Beispiel 1: JSP-Grundlagen

Dieses Beispiel enthält drei JSP-seiten ("index.jsp", "input.jsp" und "errorpage.jsp") und die Klassen de.fhw.swtvertiefung.knauf.jsp1.Historie und de.fhw.swtvertiefung.knauf.jsp1.Seitenlaengen.
Es führt die gleiche Logik aus wie das Beispiel der Stateful Session Bean: Es errechnet Oberfläche und Volumen eines Quaders.
Hier gibt es das Projekt als WAR-Export-Datei:
JSP1.war.

Das Beispiel soll folgende Grundelemente einer JSP zeigen:

Die Anwendung findet sich unter dieser URL: http://localhost:8080/JSP1/index.jsp.

Beispiel 2: Controller-Servlet

In diesem Beispiel wird ein großer Teil der Anwendungslogik in ein Servlet ausgelagert. Beim Absenden des Formulars ist nicht die JSP-Seite das Ziel, sondern ein Servlet. Dieses wertet die Request-Parameter aus, erzeugt die Bean mit den aktuellen Request-Werten, berechnet Volumen und Oberfläche.
Anschließend wird der Request an "index.jsp" weitergeleitet, diese Seite gibt die errechneten Werte aus.
Hier gibt es das Projekt als WAR-Export-Datei:
JSP2.war.

Das Beispiel zeigt dieses:
Die Anwendung findet sich unter dieser URL: http://localhost:8080/JSP2/index.jsp.

JBoss-Besonderheit: damit Fehler im Servlet an die Seite "errorpage.jsp" weitergeleitet werden muss folgendes in web.xml eingetragen werden:
   <error-page>
     <error-code>500</error-code>
     <location>/errorpage.jsp</location>
   </error-page> 


Beispiel 3: Tag Libraries

In diesem Beispiel wird Beispiel 2 weitergeführt: auf der JSP-Seite "index.jsp" soll kein Stück Javacode mehr zu sehen sein. Stattdessen soll alle dynamische Formatierung von TagLibs erledigt werden.
Das Beispiel verwendet folgende Taglibraries:
-jakarta-taglibs-request-1.0.1 (Arbeiten mit dem Request, z.B. Ausgabe von Attributen im Request)
-Sun-Implementation des Java-Standard-Taglib-Standards Version 1.2.

Hier gibt es das Projekt als WAR-Export-Datei:
JSP3.war.

Nach dem Anlegen des Dynamic Web Projects müssen die zu verwendenden Tag-Libraries importiert werden.
Dazu müssen die Dateien "taglibs-request.jar" aus dem Paket "jakarta-taglibs-request-1.0.1" (siehe Link auf meiner Startseite) und "jstl.jar" aus der Sun-Referenzimplementation (findet man im JBoss-Verzeichnis unter "server\default\deploy\jboss-web.deployer") in das Verzeichnis "WebContent\WEB-INF\lib" des Projekts eingefügt werden. Anschließend "Refresh" im Projekt wählen. Die beiden Libraries sollten jetzt im Project Explorer unter "Web App Libraries" auftauchen.
Wir müssen außerdem die Deklarationen der Taglibraries (Dateien mit der Endung ".tld") ins Projekt packen. Dazu aus "taglibs-request.jar" die Datei "taglib.tld" extrahieren, und aus "jstl.jar" die Datei "c.tld". Beide in das Verzeichnis "WebContent\WEB-INF\tags" (das Ziel ist frei wählbar, die Dateien könnten auch direkt in WEB-INF gelegt werden) packen.
Tag Libraries
Jetzt müssen wir die Tag Libraries in "web.xml" eintragen:
	<jsp-config>
		<taglib>
			<taglib-uri>http://jakarta.apache.org/taglibs/request-1.0</taglib-uri>
			<taglib-location>/WEB-INF/tags/taglib.tld</taglib-location>
		</taglib>
 		<taglib>
			<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
			<taglib-location>/WEB-INF/tags/c.tld</taglib-location>
		</taglib>
	</jsp-config> 
Hier werden symbolische Namen für die Taglibs in "WEB-INF\lib" deklariert, unter diesen URI (Unified Resource Identifier) werden sie später auf den JSP-Seiten angesprochen.

In "index.jsp" werden die Taglibs so eingebunden:
	<%@ taglib uri="http://jakarta.apache.org/taglibs/request-1.0" prefix="req" %>
	<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
Jetzt können die Tags aus den TagLibraries unter den Alias-Namen "req" bzw. "c" verwendet werden.

Wie im vorherigen Beispiel muss außerdem die Errorpage als Handler für den Error Code 500 eingetragen werden !

Die Anwendung findet sich unter dieser URL: http://localhost:8080/JSP3/index.jsp.


Beispiel 4: Custom Tag Libraries

In diesem Beispiel werden die TagLibraries aus Beispiel 3 ersetzt durch handgeschriebene Taglibraries.

Hier gibt es das Projekt als WAR-Export-Datei:
JSP4.war.

Die TagLibraries landen im Package de.fhw.swtvertiefung.knauf.jsp4.tags. Die Definition der Tags erfolgt in der Datei "WebContent\WEB-INF\tags\jsp4.tld".
Der Rahmen dieser TagLibrary-Deklaration sieht so aus (gemäß JSP-2.0-Spezifikation, die TagLibs aus dem letzten Beispiel wurden erstellt gemäß JSP-Spezifikation 1.1, dort wurde eine DTD verwendet und einige Tags hießen leicht anders):
<taglib xmlns="http://java.sun.com/xml/ns/javaee" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" 
  version="2.1> 
  <tlib-version>1.0</tlib-version>
  <short-name>jsp4</short-name> 
  <uri>http://www.informatik.fh-wiesbaden.de/~knauf/jsp4</uri> 
  ...
</taglib> 
Hier vergebe ich einen Kurznamen der TagLib und eine URI, wobei beide Werte frei vergebbar sind und nur als Vorschläge dienen, auf der JSP-Seite können sie beliebig überschrieben werden.

Folgende Tags werden verwendet:
In "web.xml" muss dieses zugefügt werden:
<jsp-config>
 	<taglib>
		<taglib-uri>http://www.informatik.fh-wiesbaden.de/~knauf/jsp4</taglib-uri>
		<taglib-location>/WEB-INF/tags/jsp4.tld</taglib-location>
	</taglib>
</jsp-config> 
Die Taglib-URI unter der wir die TagLib später in den JSPs ansprechen ist hier identisch mit der in der TLD-Datei vorgegebenen, dies ist aber nicht verpflichtend.

In "index.jsp" wird die TagLib so eingebunden:
<%@ taglib uri="http://www.informatik.fh-wiesbaden.de/~knauf/jsp4" prefix="jsp4" %>
Jetzt zeigt uns Eclipse auch brav die verfügbaren Tags an:
TagLib in Eclipse


Die Anwendung findet sich unter dieser URL: http://localhost:8080/JSP4/index.jsp.


Beispiel 5: Tag Files

Anmerkung: WTP 1.5 unterstützt Tag Files noch nicht, aber in WTP 2.0 soll dieses Feature vorhanden sein.

Wir nutzen hier ein im JSP-Standard 2.0 eingeführtes neues Feature: Tag-Libraries können auch in sogenannten In diesem Beispiel werden die in Java codierten Tags aus Beispiel 4 ersetzt durch JSP-Fragmente.
Weitere Informationen finden sich in Kapitel 8.5 der JSP-2.1-Spezifikation.
Nützliche Links zu diesem Thema:
http://www.oracle.com/technology/sample_code/tutorials/jsp20/tagfiles.html
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jsps/customtag/How-to-TagFile.html
http://today.java.net/pub/a/today/2003/11/14/tagfiles.html (Teil 1 und 2)
http://www.oracle.com/technology/pub/articles/cioroianu_tagfiles.html

Hier gibt es das Projekt als WAR-Export-Datei: JSP5.war.

Erstellen der Tags:
Das Erstellen eines Tags ist einfach: wir legen ein Unterverzeichnis "tags" in "WEB-INF" an (das Verzeichnis darf auch anders heißen). Alle Dateien in diesem Verzeichnis, die die Endung ".tag" haben werden als Tag erkannt. Der Dateiname ist dabei gleichzeit der Tagname.

Das Erstellen einer TLD-Datei entfällt. Falls ein Tag Attribute hat, dann werden die so in der .tag-Datei deklariert:
	<%@ attribute name="..."%>

Die Entsprechung zur "page"-Direktive auf einer JSP-Seite ist die "tag"-Direktive, die z.B. zum Importieren von Java-Packages verwendet werden kann:
	<%@ tag import="de.fhw.swtvertiefung.knauf.jsp5.*"%>


Verwendung der Tags:
In web.xml muss nichts eingetragen werden.
In der JSP wird die Taglibrary so eingebunden:
	<%@ taglib prefix="jsp5" tagdir="/WEB-INF/tags" %>
Der relative Pfad zum Verzeichnis der Tags wird angegeben und die Taglibrary erhält einen Alias.


Beispiel: Das "ifExistsRequestAttribute"-Tag:
Die Tags in diesem Beispiel verwenden alle massiv Javacode. Dies ist nicht wirklich schön, aber da die Tags allesamt auch durch Tags der JSTL abbildbar sind würde es nicht viel Sinn ergeben hier die JSTL zu verwenden.
<%@ attribute name="requestAttribute"%>

<%
  //Prüfen ob das Attribut existiert !
  if (request.getAttribute(requestAttribute) != null)
  {
    //Body ausführen !
    %>
 	<jsp:doBody />
 	<%
  }
%> 
Das Tag hat ein Attribut "requestAttribute", dies ist ein String der ein Attribut angibt auf dessen Existenz im Request geprüft wird. Falls das Attribut vorhanden ist wird der Inhalt des Tags auf der JSP ausgeführt. Dies geschieht durch das JSP-Element "<jsp:doBody />".


Im "loopOverHistorie.tag" ergab sich das Problem dass ich das aktuelle Item nicht in den JspContext legen konnte, denn es ging in den Childelementen verloren. Deshalb verwende ich hier den Request um das aktuelle Item abzulegen.
Ansonsten sind die Tags identisch mit den Tags aus Beispiel 4.

Die Anwendung findet sich unter dieser URL: http://localhost:8080/JSP5/index.jsp.



Stand 12.04.2007
Historie:
04.04.2007: Erstellt aus Vorjahresbeispiel.
JSP3: web.xml gemäß Servlet-Spezifikation 2.5, umgestellt auf JBoss-eigene JSTL-Implementation.
JSP4: web.xml gemäß Servlet-Spezifikation 2.5, zwei Javadoc-Warnungen behoben, tld-Datei auf Version 2.1 aktualisiert.
06.04.2007: JSP5 zugefügt
12.04.2007: JSP3: falsche URI der c.tld korrigiert