Java Server Pages JSP
Willemers Informatik-Ecke
Java Server Pages sind HTML-Seiten, in die Java-Code kombiniert werden. 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 dieser die Java-Anteile gar nicht mehr zu sehen bekommt.

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

Eine JSP-Seite wird auf einem Applicaton Server wie Tomcat oder Glassfish ausgeführt. Erkennt der Application Server die JSP-Seite, wird sie automatisch in ein Servlet übersetzt.

HTML-Seite für das Eingabeformular

Die folgende Seite ist eine einfache HTML-Seite, die ein Formular enthält. Sie enthält reines HTML, kann aber durchaus als JSP angelegt werden. Vielleicht wollen wir später doch noch Java verwenden. Nennen wir die Seite newuser.jsp und legen sie im Dynamic Web Project von Eclipse als New|JSP-File an.

Als Action ist die Datei register.jsp genannt. Die Endung .jsp muss für JSP-Seiten zwingend angegeben werden. Nur so kann der Application Server die Seite unter den übersetzten Servlets finden und dieses dann korrekt aufrufen. Als Methode wird POST verwendet. Das sendet die Parameter im Datenblock. Bei kleineren Eingabemasken wäre auch GET möglich. Dann werden die eingegebenen Daten in der URL hinter einem &-Zeichen angehängt.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
    <h1>Register per JSP:</h1>
    <form action="register.jsp" method="post">
        <table>
            <tr>
                <td>Name</td>
                <td><input type="text" name="name"></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>
</html>

JSP: HTML-Seite mit Java

JSP eignet sich ideal zum Auswerten der HTML-Eingabeformulare. Java kann in JSP-Seiten eingebettet werden. Der Bereich beginnt mit einer spitzen Klammer (Kleinerzeichen) und einem Prozentzeichen. Es wird durch Prozentzeichen und der spitzen Klammer (Größerzeichen) abgeschlossen.

Die JSP-Seite register.jsp wertet die Daten des oben angegebenen FORM aus, indem es auf die request-Parameter der Servlet-Methode service zugreift und deren Methode getParameter verwendet.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <h2>Ergebnis Registrierung:</h2>
    <%
        String name = request.getParameter("name");
        String pw1 = request.getParameter("pw1");
        String pw2 = request.getParameter("pw2");
    %>
    <table>
        <tr>
            <td>Name:</td>
            <td>
                <% out.print(name); %>
            </td>
        </tr>
        <tr>
            <td>Passwort:</td>
            <td>
        <%
        if (pw1.equals(pw2)) {
            session.setAttribute("user", name);
            response.sendRedirect("main.jsp");
        } else {
        %>
            Passwort nicht identisch!
            <a href="newuser.jsp">Neu eingeben</a>
        <%
        }
        %>
            </td>
        </tr>
    </table>

</body>
</html>

Kontrollelemente

Text-Input

Für die Eingabe von Text wird ein Input-Element vom Typ text verwendet. Mit dem Attribut name wird der Bezeichner des Elements festgelegt, über den es später ausgelesen werden kann.
<td><input type="text" name="ort"></td>
Im bearbeitetenden Servlet (oder einer JSP-Datei) kann der eingegebe Text über die Methode getParameter ausgelesen werden.
String ort = request.getParameter("ort");

Select: Auswahl aus einer Klappbox

Ein select-Element ermöglicht dem Anwender aus einer übersichtlichen Zahl von Optionen eine auszuwählen, vergleichbar mit einer Combobox bei grafischen Oberflächen.
<select name="status">
  <option value="reserviert">reserviert</option>
  <option value="gebucht">gebucht</option>
</select>
Die Auswertung erfolgt im Servlet oder in einer JSP durch Auslesens des Select-Namen per getParameter. Als Ergebnis erhält man den Select-Value des ausgewählten Elements.
String wert = request.getParameter("status");

Datumseingabe

Für die Eingabe eines Datums stellen die Browser-Hersteller ein Input-Element von Typ date zur Verfügung. Je nach Browser ermöglicht das Element die Eingabe des Datums über einen Monatskalender oder nur über eine formatierte Text-Eingabe.
<input type="date" id="anreise" name="anreise" value="2018-07-22" min="2018-01-01">
Ausgewertet wird dieses Element wie ein formatiertes Text-Input. Über DateFormat kann aus dem String ein Date erzeugt werden.
java.util.Date von;
String strVon = request.getParameter("anreise");
if (strVon!=null && !strVon.isEmpty()) {
    try {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        von = formatter.parse(strVon);
    } catch (ParseException e) {
        paraOk = false;
        fehler += "Anreise-Parameter ist falsch\n";
    }                
} else {
    paraOk = false;
    fehler += "Anreise-Parameter ist falsch\n";
}

Variablen

Die JSP-Seiten werden beim Deploy vom Server in ein Servlet umgewandelt. Wenn die JSP-Seite aufgerufen wird, stehen ihr die Parameter der Methode service zur Verfügung.

Die Parameter der Methode service

Die Parameter der Methode service sind unter festen Namen zugreifbar: Im Beispiel oben ist zu sehen, wie über request die Methode getParameter() aufgerufen wird und response verwendet wird, um darüber sendRedirect() zu einer anderen Seite zu wechseln. Dies funktioniert also wie bei einem Servlet. Über die Variablen request und response kann die JSP also auf Kommunikationsdaten des Clients zugreifen.

Variable out

Als besonderer Service steht die Variable out zur Verfügung. Die Variable out ist vom Typ PrintWriter und könnte im Servlet über response.getWriter() ermittelt werden. Mit der Methode out.print() lassen sich Werte auf den Ausgabestrom an den Client senden.

Noch weiter lässt sich die Ausgabe verkürzen, wenn Sie ein Ausdruckselement verwenden, das durch <%= eingeleitet wird.

<%= "Ausgabe an den Browser." %>
Auch die Ausgabe einer Variablen ist auf diese Weise möglich.

Variable session

Mithilfe der Variablen session können Daten für die Sitzung gespeichert werden. Im Beispiel wird der Benutzername über den Schlüssel "user" durch die Methode setParameter() eingetragen.

Jede andere JSP und jedes Servlet kann den Wert aus session zurückholen. Hier als Beispiel der Ausschnitt aus main.jsp:

<%
String userString = session.getAttribut("user").toString();
out.print(userString);
%>

Variable application

Vergleichbar mit der Variablen session gibt es die Variable application. Auch sie bietet die Methoden getAttribute() und setAttribute() und erlaubt, auf diesem Weg Daten zu speichern. Im Gegensatz zur Session gelten die dort gespeicherten Daten applikationsweit.

Die Variable application ist vom Typ ServletContext und kann von Servlets aus über den Aufruf getServletContext() herangezogen werden.

Direktiven <%@ ... %>

Folgt auf <% ein @, so spricht man von Direktiven.

Direktive <%@ page ... %>

Damit können Optionen für die JSP-Datei gesetzt werden. Zum Beispiel:

Java-Importe

Besonders interessant ist die Page-Direktive import, mit der der Java-Befehl import erreicht werden kann. Die folgende Anweisung importiert die Enumeration.
<%@ page import="java.util.Enumeration" %>
Eigene Klassen können ebenfalls mit dieser Direktive importiert werden. Dazu sollte die eigene Klasse aber in einem benannten Package (hier im Beispiel data) und nicht im Default-Package liegen.
<%@ page import="data.User" %>
...
<%
User user = new User(name, request.getParameter("pw1"));
application.setAttribute("users", user);
%<

Einbetten von JSP-Fragmenten

Die include-Direktive erlaubt es, Dateifragmente (mit der Endung .jspf) werden in den Text einzubetten. So etwas ist ungeheuer praktisch, wenn im Kopf der Anwendung durchgehend das Firmenlogo oder andere Informationen ersceheinen sollen.
<%@ include file="header.jspf" %>

Taglib

Mit taglib können Bibliotheken eingebunden werden, die JSTL-Bibliotheken eingebunden. Sie wird einem Prefix zugeordnet, der später für den Aufruf der Bibliotheken verwendet wird. Diese Anweisungen können 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).

Beispiel für taglib
Innerhalb des Bodys wird 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>

Methoden in JSP erstellen

Mit dem Tag-Paar <%! und %> umschließen Sie selbstdefinierte Methoden, die Sie innerhalb von JSP-Seiten benötigen.

JSP in einem Eclipse-Projekt anlegen

Eclipse ermöglicht es, in einem Dynamic Web-Project eine JSP-Datei zu erzeugen. Dazu ...