Java Server Pages JSP
Willemers Informatik-Ecke
Servlets REST
Java Server Faces

Java Server Pages (JSP) ermöglicht die Einbettung von Java-Code in HTML-Seiten. Eine JSP-Seite wird auf einem Applicaton-Server wie Tomcat oder Glassfish ausgeführt.

Vergleichbar zu PHP wird der Java-Code in den HTML-Code eingebettet, auf dem Server ausgeführt und das Ergebnis als HTML-Code an den Client übertragen, so dass der Client die Java-Anteile gar nicht mehr zu sehen bekommt.

Im Gegensatz zu Javascript oder zu Java-Applets wird der Programmcode nicht auf dem Client, also im Browser ausgeführt, sondern auf dem Server.

Technisch basieren JSP-Seiten auf Servlets, sind aber spezialisiert und eingeschränkt auf Browser als Clients und HTML als Datenformat.

Einbettung von Java-Code in HTML

Java Server Pages sind HTML-Seiten mit Java-Code (vergleichbar PHP). Die Einbettung in HTML geschieht durch ein Tag mit Prozenten.
<% /* Hier steht Java-Code */ %>|
Zwischen den Tags wird Java gesprochen.

Request- und Response-Parameter

Variablen

Die Variable out steht für einen Ausgabekanal vom Typ PrintWriter.

In Servlets würde die Variable über response.getWriter() ermittelt. Durch den Aufruf von out.print(varname) können Java-Variablen in die HTML-Ausgabe eingefügt werden.

<hr> <% out.print(javavar); %> <hr>
Die Ausgabe lässt sich noch weiter verkürzen, indem das Tag durch ein Gleichheitszeichen ergänzt wird.
<%= javavar %>
Die Variablen session und application können Daten über eine Sitzung oder sogar bis zum Herunterfahren des Servers speichern. Typischerweise werden die Daten als assoziative Attribute abgelegt, vergleichbar mit einer Map.

Beispiel Anmeldung

Eine kleine Web-Anwendung soll als Beispiel dienen:

Erzeugen einer JSP-Seite in Eclipse

Zunächst benötigen Sie ein Projekt für den Application-Server (File|New Project|Web|Dynamic Web Project). Eclipse erzeugt einen HTML-Rahmen, der erst auf den zweiten Blick JSP-Spezifika enthält.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>
Zwischen die body-Tags bauen wir die JSP-Seite.

newuser.jsp: Anmeldung

Im ersten Schritt wird geprüft, ob jemand in der Session eine Nachricht hinterlegt hat. Sie wird angezeigt und zurückgesetzt.
<body>
    <h1>Register per JSP:</h1>
    <%
        String msg = (String)session.getAttribute("msg");
    	if (msg!=null && !msg.isEmpty()) {
    		%>
    		<hr> <% out.print(msg); %> <hr>
    		<%
    	}
    	session.setAttribute("msg", "");
    %>
    <form action="register.jsp" method="post">
        <table>
            <tr>
                <td>Name</td>
                <td><input type="text" name="user"></td>
            </tr><tr>
                <td>Passwort</td>
                <td><input type="password" name="pw1"></td>
            </tr><tr>
                <td>Passwort wiederholen</td>
                <td><input type="password" name="pw2"></td>
            </tr><tr><td></td>
                <td><input type="submit"></td>
            </tr>
        </table>
    </form>

</body>
Das Formular für die Registrierung sendet die Daten per POST an register.jsp.

register.jsp: Auswertung der Registrierung

Die Datei register.jsp hat die Aufgabe, die Anmeldung zu prüfen.

Mit getParameter holt sie sich die Eingabeinhalte.

Sie prüft, ob der Benutzername leer ist oder ob die Passwörter nicht übereinstimmen. In diesem Fall wird die entsprechende Meldung in der Session hinterlegt und der Client zu newuser.jsp zurückgeschickt.

Ist alles gut, wird der Benutzer unter user in der Sitzung hinterlegt und main.jsp aufgerufen.

Die Seite benötigt keine Darstellung. Aus diesem Grund könnte man sie vielleicht sogar besser als Servlet implementieren.

<body>
    <%
        String name = request.getParameter("user");
        String pw1 = request.getParameter("pw1");
        String pw2 = request.getParameter("pw2");
        if (name.isEmpty()) {
            session.setAttribute("msg", "Kein Benutzer");
            response.sendRedirect("newuser.jsp");
        } else if (!pw1.equals(pw2)) {
            session.setAttribute("msg", "Passworteingabe nicht gleich");
            response.sendRedirect("newuser.jsp");
        } else {
            session.setAttribute("user", name);
            response.sendRedirect("main.jsp");
        }
        %>
</body>

main.jsp: Die Hauptseite

Die Hauptseite holt nun aus der Session den Benutzernamen und nutzt ihn für eine persönliche Ansprache.
<body>
<h1>Herzlich Willkommen</h1>

<% String user = (String)session.getAttribute("user"); %>

Hallo <% out.print(user); %>, schön Dich zu sehen.

</body>

Direktiven

Wird hinter der öffnenden JSP-Tag ein @-Zeichen gesetzt, spricht man von einer Direktive.

Das erstes Schlüsselwort der Direktive bezeichnet die Art der Direktiven. Dazu gehören page, include und taglib.

Page-Direktive

Page-Direktiven ermöglichen den Zugriff auf die HTTP-Header.
<%@ page language="Java" %>
<%@ page contentType="text/html" %>
<%@ page pageEncoding="UTF-8" %> 

Page-Direktive für Java-Import

Java import-Anweisungen können nicht einfach zwischen die Standard-Prozent-Tags gesetzt werden. Das betrifft nicht nur eigene Klassen, sondern auch Standardbibliotheken.
<%@ page import="java.util.Enumeration" %>    
<%@ page import="mypackage.Myklasse" %>
Eigene Klassen müssen darüber hinaus in eigenen Packages abgelegt werden.

Include-Direktive

Webseiten-Fragmente können in einer eigenen Datei abgelegt werden. Sie bekommen standardmäßig die Endung .jspf.

Diese Fragmente kann von verschiedenen JSP-Seiten aus eingebunden werden, indem eine Include-Direktive verwendet wird:

<%@ include file="header.jspf" %>

Taglib-Direktive

Mit der Taglib-Direktive können die JSTL-Bibliotheken eingebunden werden. In der Anweisung wird die Bibliothek dazu einem Präfix zugeordnet, der später bei Aufruf verwendet wird.

Die Einbindung der Bibliotheken kann im Header stehen.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
Auf diese Weise wurde die Core-Bibliothek dem Prefix c und die XML-Bibliothek dem Prefix x zugeordnet.

Darüber hinaus gibt es noch die Bibliotheken fmt (Formatierung), funktions (String- und Array-Funktionen) und sql (Datenbankzugriffe).

Als Beispiel wird hier die Liste (kundenliste) von Kunden (kunde) als XML-String von einem REST-Server geholt und anschließend ausgewertet.

<c:import var="xmlStrg" url="http://localhost:8080/RestWar/app/kunde"/>
<x:parse xml="${xmlStrg}" var="output" />

<x:forEach select="$output/kundenliste/kunde" var="element">
    <x:out select="$element/id" />
    <x:out select="$element/name" />
</x:forEach>

Java-Methoden in JSP

Wenn auf einer JSP-Seite eine Java-Methode benötigt wird, wird sie mit dem speziellen Tag-Paar <%! und %> umschlossen.
<%!
String gruss(String name) {
        return "Hallo " + name;
}
%>
...
<% String user = (String)session.getAttribute("user"); %>
<% out.print(gruss(user)); %>, schön Dich zu sehen.
Die Methode kann sowohl im Header als auch im Body der JSP-Seite angelegt werden.