52.Servlet - ssw.jku.at

Werbung
Servlets
Servlets
Definition, Servlet vs. CGI, Design, API
Lebenszyklus, Beispiel
JSP
JSP vs. Servlet, Beispiel, Syntax, Beans, TagLibs,
Implizite Objekte
Konfiguration
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
1
Definition
SERVLET
=
Eine auf Java-Technologie basierte Web-Komponente,
die von einem Container verwaltet wird und
dynamisch Inhalt generiert.
SERVLET-ENGINE (Container)
=
Teil eines Web-Servers, der die Netzwerkdienste zum
Empfangen von Anfragen und Senden von Antworten
bereitstellt und die Servlets über ihren gesamten
Lebenszyklus enthält und verwaltet.
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
2
Servlet vs. CGI
 CGI
•
•
 Servlet
Schnittstelle um externe
Programme auszuführen
Pro Aufruf gestartet
•
•
•
•
Zustandslos
•
•
•
•
Sprach-/System-unabhängig
•
•
Gleicher Prozess dadurch
Weniger Overhead
Bleibt im Speicher zwischen
den Anfragen
Eine Instanz für alle Anfragen
Zustandsbehaftet
Fehlerbehandlung (Exceptions)
Sicherer durch Sandbox
Systemunabhängig (soweit
JavaVM verfügbar)
Große Klassenbibliothek
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
3
Design
Client
IE, Mozilla, …
Request
Response
WebServer & Servlet-Engine
Tomcat, …
Servlet 1 Servlet 2 Servlet …
Ressourcen
Dateien, DB, ...
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
4
API
 Generische Klassen: javax.servlet
•
•
•
•
•
Servlet
GenericServlet
ServletRequest
ServletResponse
ServletContext
...
Servlet
 Spezialisierungen für HTTP: javax.servlet.http
•
•
•
•
•
HttpServlet
HttpServletRequest
HttpServletResponse
HttpSession
...
GenericServlet
HttpServlet
Benutzer Servlet
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
5
Servlet Interface
 void init(ServletConfig config)
throws ServletException
•
Initialisierung des Servlets mit Konfigurationsparameter
 ServletConfig getServletConfig()
Zugriff auf die Konfigurationsparameter
•
 void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
•
•
•
•
Führt einen einzelnen Request von einem Client aus und erzeugt die Response.
Für jeden Request wird die Methode in eigenem Thread ausgeführt
Parameter req hält alle Informationen über Request;
in Parameter res wird die Antwort geschrieben
 String getServletInfo()
•
Information über Servlet in Form eines Strings
 void destroy()
•
soll Aufräumarbeiten durchführen und zerstört das Servlet
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
6
ServletRequest
 String getParameter(String name)
•
•
Wert (URL-decoded) des ersten Parameters mit dem gegebenen Namen
null, falls nicht vorhanden
 String[] getParameterValues(String name)
•
•
Array mit Werten (URL-decoded) für jedes Vorkommen des angegebenen
Parameternamens
null, falls nicht vorhanden
 Enumeration request.getParameterNames()
•
•
eine Aufzählung (Enumeration) aller Parameternamen
falls keine Parameter übergeben wurden ist die Enumeration leer
 String getRemoteAddress()
•
IP-Adresse des Clients
 boolean isSecure()
•
true wenn der Aufruf über HTTPS erfolgt ist
 ...
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
7
ServletResponse
 ServletOutputStream getOutputStream()
•
Binäre Daten
exklusiv
 PrintWriter getWriter()
•
Text
 void reset()
•
Löschen des Puffers, der Header und des Statuscodes
 void flushBuffer()
•
Schreiben des Puffers (den Header und Statuscode) an den Client
 String getContentType()
•
Liefert den aktuell gesetzen MIME Typen (z.B.: text/html, image/jpeg, ...)
 void setContentType(String type)
 ...
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
8
HTTP Protokoll
HTTP methods
 GET
 HEAD
 POST
 PUT
 DELETE
 TRACE
 CONNECT
 OPTIONS

Beispiel GET
GET /servlet/MyServlet?name=Scott&
company=MageLang%20Institute HTTP/1.1
Connection: Keep-Alive
Parameter als Name/WertUser-Agent: Mozilla/4.0 (
Paare in URL
compatible; MSIE 4.01; Windows NT)
Host: www.magelang.com
Accept: image/gif, image/x-xbitmap,
image/jpeg, image/pjpeg

Beispiel POST
POST /servlet/MyServlet HTTP/1.1
User-Agent: Mozilla/4.0 (
compatible; MSIE 4.01; Windows NT)
Host: www.magelang.com
Accept: image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, */
Content-type: application/x-www-form-urlencoded
Content-length: 39
name=Scott&company=MageLang%20Institute
Parameter in eigenem
Datenbereich
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
9
HTML Formulare


Ermöglichen Benutzereingaben
Benutzen POST oder GET
<html><head><title>HTML Forms</title></head>
<body>
<form action="result.html" method="get">
<input type="hidden" name="id" value="123"/>
User Name: <input type="text" name="user"/><br>
User Password: <input type="password" name="pass"/><br>
Flash:
<input type="checkbox" name="flash" checked>Enabled</input><br>
Age:
<input type="radio" name="age" value="child">< 18</input>
<input type="radio" name="age" value="adult" checked>≥ 18</input><br>
Role:
<select name="role">
<option value="A">Administrator</option>
<option value="S" selected>Student</option>
</select><br>
<input type="submit" value="Submit"/>
</form>
</body></html>

Aufruf:
result.html?id=123&user=John+Doe&pass=mypass&flash=on&age=adult&role=S
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
10
HTML Formulare Fortsetzung
id=123&user=John+Doe&pass=mypass&flash=on&age=adult&role=S
 Textfelder:
text: Text-Eingabefeld
• hidden: Unsichtbares Textfeld, Information für den Server (z.B.: AppointmentId)
• password: Text-Einfabefeld bei dem die Eingabe versteckt wird
Sonderzeichen werden codiert übertragen (%HexHex; z.B.: ä=%E4),
Leerzeichen als "+" (z.B.: John+Dow).
•

Auswahlfelder:
•
•
•

checkbox: Wert wird nur übertragen wenn er gesetzt ist (als name=on, z.B.:
flash=on), mit checked kann eine Checkbox vorselektiert werden.
radio: Wert wird nur übertragen wenn er gesetzt ist (value wenn angegeben
sonst "on"), es kann nur ein Wert aus einer Gruppe (gleicher Name) ausgesucht
werden, mit checked kann eine Vorselektion erfolgen.
select: Dropdown-Element, als Wert wird der ausgewählte (value der Option
wenn angegeben sonst der Text) übertragen wobei mit selected eine
Vorauswahl getroffen werden kann (sonst erstes Element).
Absenden:
•
submit: Erzeugt einen Button, Text kann mit value gesetzt werden, wird auch
ein name gegeben so wird das Name/Wert-Paar mitübertragen (sinnvoll wenn
mehrere Buttons in eine Formular).
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
11
HttpServlet
 protected Methoden:
•
•
•
•
•
•
•
•
void
void
void
void
void
void
void
void
-
doDelete(HttpServletRequest, HttpServletResponse)
doGet(HttpServletRequest, HttpServletResponse)
doHead(HttpServletRequest, HttpServletResponse)
doOptions(HttpServletRequest, HttpServletResponse)
doPost(HttpServletRequest, HttpServletResponse)
doPut(HttpServletRequest, HttpServletResponse)
doTrace(HttpServletRequest, HttpServletResponse)
service(HttpServletRequest, HttpServletResponse)
Leitet HTTP-Anfragen auf die entsprechenden Methoden um.
 public Methoden:
•
void service(ServletRequest, ServletResponse)
-
Ruft die protected service Methode auf
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
12
Beispiel
package TestPack;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet (HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println(
"<HTML><HEAD><TITLE>Hello World</TITLE></HEAD><BODY>"
+ "<H2>Hello World!</H2>" +
+
"</BODY></HTML>"
"</BODY></HTML>"
);
out.close();
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
13
Lebenszyklus
 Engine lädt Servlet-Klasse und erzeugt ein Exemplar
•
•
alle Variablen werden genau einmal initialisiert
alle Variablen bleiben aktiv, solange das Servlet-Exemplar existiert
 Mehrere Web-Browser (=Clients) fordern das Servlet an
•
Request wird vom Web-Server an Servlet-Engine und von dieser weiter
zum entsprechenden Servlet gesandt
 Engine erzeugt pro Request einen Thread
•
•
jeder Thread behandelt Request+Response des jeweiligen Clients
jeder Thread hat Zugriff auf die Instanzvariablen des Servlets
 Servlet-Engine bestimmt, wann Servlets entladen werden
•
Servlet gibt Ressourcen frei und speichert persistenten Zustand
Client 1
Servlet Thread 1
Servlet Thread 2
Client 2
Servlet Instance
WebServer & Servlet-Engine
Servlet
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
14
Lebenszyklus
 init(ServletConfig)
•
Variablen initialisieren, Ressourcen anfordern
 service(HttpRequest, HttpResponse)
•
•
•
•
doGet(HttpRequest, HttpResponse)
doPost(HttpRequest, HttpResponse)
doPut(HttpRequest, HttpResponse)
...
 destroy()
•
•
Ressourcen freigeben
Eventuell Zustand speichern
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
15
Sitzungen (Sessions)
 Probleme
•
•
•
HTTP ist ein nicht sitzungsorientiertes Protokoll
Wenn der eBusiness-Kunde einen Artikel in den Einkaufskorb legt, woher
weiß der Server, was schon im Einkaufskorb ist?
Wenn der Kunde seine Online-Einkaufstour beendet, woher weiß der
Server, welcher Einkaufskorb zu welchem Kunden gehört?
 Lösungen
•
•
•
Cookies
URL mit Parameter
Versteckte HTML-Formular-Felder
 Unterstützung
•
•
Servlets bieten ein „Higher Level API“
HttpSession
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
16
Sitzungen (Sessions) API
 HttpSession
•
HttpSession <HttpServletRequest>.getSession()
-
•
HttpSession <HttpServletRequest>.getSession(bool c)
-
•
c = true: neues Session-Objekt anlegen wenn noch keines existiert.
c = false: null liefern wenn noch kein Session-Objekt existiert.
Object getAttribute(String name)
-
•
Liefert das aktuelle Session-Objekt, oder erzeugt ein neues wenn noch keines
existiert.
Liefert das Objekt mit dem angegebenen Namen oder null falls es nicht
existiert.
void setAttribute(String name, object o)
-
Speichert das gegebene Objekt unter dem gegebenen Namen.
Existiert ein Name bereits, wird das Objekt überschrieben
Existiert ein Name bereits und o==null, so wird das Objekt entfernt
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
17
Beispiel Interaktion 1/2
package at.jku.ssw.swe2;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class Interact extends HttpServlet
{
public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws IOException
{
PrintWriter out = res.getWriter();
HttpSession ses = req.getSession();
String last
= (String)ses.getAttribute("opinion");
String cur
= (String)req.getParameter("opinion");
ses.setAttribute("opinion", cur);
res.setContentType("text/html");
out.println("<HTML>");
out.println("<HEAD><TITLE>Interaction</TITLE></HEAD>");
out.println("<BODY>");
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
18
Beispiel Interaktion 2/2
if (last == null && cur == null) {
out.println("Please enter your opinion:");
}
else if (last == null || last.equals(cur)) {
out.println("Your opinion is: " + cur);
out.println("<BR> do you have a new one?");
}
else {
out.println("Your opinon was: " + last);
out.println("<BR>and is now: " + cur);
out.println("<BR>do you want to change it again?");
}
out.println("<FORM ACTION="/Interact" METHOD=\"GET\">");
out.println("Your opinion: <INPUT TYPE=\"TEXT\"
NAME=\"opinion\">");
out.println("<INPUT TYPE=\"SUBMIT\" VALUE=\"Send\">");
out.println("</FORM></BODY></HTML>");
out.close();
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
19
Installieren eines Servlets (Anlegen der Verzeichnisse)
ServerKonfiguration
Document
Base
web.xml
Alle benötigeten
Klassen mit korrekter
Verzeichnisstruktur
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
20
Installieren eines Servlets (server.xml)
<Server port="8005" shutdown="SHUTDOWN" debug="0">
…
<Context
<!- Allgemeine Context-Attribute -->
<!- Pflicht -->
path="URL-Pfad zur Anwendung"
docBase="Pfad zur Anwendung (serverseitig)">
<!- Optional -->
className="Klassenname eines alternativen Contexts"
cookies="true | false"
crossContext="true | false"
override="true | false"
privileged="true | false"
reloadable="true | false"
wrapperClass="Klassenname einer alternativen Wrapperklasse"
<!- Von org.apache.catalina.core.StandardContext werden noch weitere
Context-Attribute unterstützt (cachingAllowed, debug, …) -->
</Context>
…
</Server>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
21
Installieren eines Servlets (web.xml 1/3)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!– Allgemeine Beschreibung -->
<display-name>Name der Anwendung</display-name>
<description>Beschreibung der Anwendung</description>
<!– Kontext Parameter die man aus dem Servlet (oder der JSP Seite) über
String name="…", param;
param = getServletContext().getInitParameter(name);
abfragen kann.
-->
<context-param>
<param-name>Name des Parameters</param-name>
<param-value>Wert des Parameters</param-value>
<description>The Beschreibung des Parameters</description>
</context-param>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
22
Installieren eines Servlets (web.xml 2/3)
<!– Beschreibung der Servlets dieser Web Anwendung.
Jedem Servlet können Parameter mitgegeben werden die über
String name="…", value;
value = getServletConfig().getInitParameter(name);
abgefragt werden können.
-->
<servlet>
<servlet-name>Interner Name des Servlets</servlet-name>
<description>Beschreibung des Servlets</description>
<servlet-class>Voll qualifizierter Klassenname</servlet-class>
<init-param>
<param-name>Name des Parameters</param-name>
<param-value>Wert des Parameters</param-value>
</init-param>
<!–Servlet automatisch mit Tomcat starten, die Zahl gibt die Reihenfolge
an in der die Servlets gestartet werden. Wenn keine spezielle
Reihenfolge benötigt wird genügt auch "<load-on-startup/>"
-->
<load-on-startup>Zahl</load-on-startup>
</servlet>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
23
Installieren eines Servlets (web.xml 3/3)
<!– Festlegen unter welchem Namen das Servlet erreichbar sein soll. -->
<servlet-mapping>
<servlet-name>Interner Name des Servlets</servlet-name>
<url-pattern>Offizieller Name des Servlets</url-pattern>
</servlet-mapping>
<!– Festlegen des standard-Timeouts einer Sitzung in Minuten.
Kann vom Servlet über
HttpSession ses=…;
int ses.getMaxInactiveInterval(); abgefragt und über
void setMaxInactiveInterval(int); verändert werden
verändert werden.
-->
<session-config>
<session-timeout>Minuten</session-timeout>
</session-config>
</web-app>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
24
Installieren eines Servlets (server.xml Beispiel)
<Server port="8005" shutdown="SHUTDOWN" debug="0">
…
<Context
path="/Interact"
docBase="HelloWorld">
</Context>
…
</Server>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
25
Installieren eines Servlets (web.xml Beispiel)
<web-app>
<display-name>SWE2</display-name>
<description>Lecture SWE2, Institute SSW</description>
<servlet>
<servlet-name>InteractService</servlet-name>
<description>Simple user interaction sample.</description>
<servlet-class>at.jku.ssw.swe2.Interact</servlet-class>
<load-on-startup/>
</servlet>
<servlet-mapping>
<servlet-name>InteractService</servlet-name>
<url-pattern>/Interact</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout> <!-- 30 minutes -->
</session-config>
</web-app>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
26
Beispiel Ausführung
1
2
3
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
27
JSP vs. Servlet
 JSP
•
•
•
•
•
 Servlets
Strikte Trennung zwischen
Erscheinungsbild (HTML) und
Logik (Java Komponenten)
HTML-Code wie gewohnt
verwenden.
Veränderung des Aussehens
ohne Veränderung des
dynamischen Inhalts
Änderung der JSP Seite hat
automatische Übersetzung zur
Folge
ASP ähnlich
•
HTML Code wird im Servlet
generiert.
 JSP = JavaServer Pages
 JSP Datei wird vom WebServer einmal in ein Servlet übersetzt
 Servlets aber auf einer abstrakteren Ebene programmieren
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
28
Model 1 Architecture



Request werden direkt von der JSP-Seite behandelt
JSP-Seite übernimmt Steuerung und Generierung der Antwort
Datenzugriff sollte in Komponenten (JavaBeans) ausgelagert werden
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
29
Model 2 Architecture




Serverseitige Realisierung des Model/View/Controller Pattern
Steuerung wird durch ein Servlet übernommen
Generierung des Outputs wird an JSP-Seiten delegiert
Modelkomponenten werden von Servlet an JSP-Seiten weitergegeben
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
30
JSP Beispiel
<html>
<head><title>JSP 1</title></head>
<body>
TemplateText
<%@ page import="java.util.*, java.text.*" %>
JSPElement
<% int max = 100; // pure Java code! %>
<P> JSP Test - Zähler bis <%= max %> </P>
<% for (int i = 0; i < max; i++) { %>
<%= i %>
<% }
String dateString =
DateFormat.getDateInstance(DateFormat.SHORT,
Locale.GERMAN).format(new Date());
%>
<P> Heutiges Datum: <%= dateString %> </P>
</body>
</html>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
31
Installieren des JSP Beispiels
 JSP Datei in einen Kontext kopieren und ausführen.
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
32
JSP Syntax 1/3
 Direktiven
•
<%@ ... %>: Eigenschaften & Includes
-
Erlaubt die Einstellung seitenbezogener Optionen.
Kann mehrmals vorkommen.
Inkludiert eine externe Datei.
<%@ page
language="java"
import="java.util.*, java.text.*"
contextType="text/html"
...
%>
<%@ include file="eineDatei.inc" %>
<%@ taglib
uri="/tagliburi"
prefix="kurzname"
%>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
33
JSP Syntax 2/3
 Skriptelemente:
•
<% ... %>: Skriptlet
-
•
<%! ... %>: Deklarationen
-
•
Beliebiger Quelltext (Anweisungen, Variablendeklaration).
Variablen- und Methodendeklarationen
<%= ... %>: Ausdrücke
-
Ausdruck wird in einen String konvertiert und in den Seitentext eingefügt.
Beispiele: <%=i%>, <%=new Date()%>, <%=methode()%>
Achtung, kein abschließendes Semikolon.
 Kommentare:
•
<%-- ... --%>: Kommentar
-
•
Nur in der JSP Datei enthalten, nicht aber im Ergebnis.
In Skriptelementen normale Java Kommentare (/* */ und //)
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
34
JSP Syntax 3/3
 Aktionselemente:
•
<jsp:useBean>
-
JavaBean-Komponente verfügbar machen.
<jsp:useBean id="Instanzname" scope="Geltungsbereich"
class="Klassenname"/>
•
<jsp:getProperty>
-
•
Wert einer JavaBean-Eigenschaft abfragen.
<jsp:setProperty>
-
Wert von JavaBean-Eigenschaften festlegen.
<jsp:setProperty name="Instanzname" property="*" />
•
<jsp:include>
-
•
<jsp:forward>
-
•
Einfügen einer anderen JSP-Seite.
Kontrolle an eine andere JSP-Seite weitergeben.
<jsp:param>
-
Parameterwerte an durch <jsp:include> oder <jsp:forward> verwendete Seiten
weitergeben.
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
35
JSP XML-Syntax




<jsp:declaration> ... <jsp:declaration>  <%! ... %>
<jsp:expression> ... <jsp:expression>  <%= ... %>
<jsp:scriptlet> ... <jsp:scriptlet>  <% ... %>
...
 Regeln:
•
•
•
•
Einfache Anführungszeichen entsprechen doppelten.
Leerzeichen bei Zuweisungen von Attributwerten sind nicht erlaubt.
JSP und XML Syntax darf in einer Seite nicht gemischt werden.
Alle Tags sind case sensitive.
 Gesamte Syntax:
•
•
JSP_Syntax_card12.pdf
http://java.sun.com/products/jsp/docs.html
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
36
Trennung Logik / Aussehen über Beans
<jsp:useBean
id="Bean-Instanzname"
scope="page | request | session | application"
{ class="Qualifizierter Klassenname"
[type="Qualifizierter Klassenname"]
| beanName="Qualifizierter Klassenname | <%! … %>"
type="Qualifizierter Klassenname"
| type="Qualifizierter Klassenname"
}
{</> | > weitere Elemente </jsp:useBean> }
<jsp:getProperty name="Bean-Instanzname"
property="Property-Name"/>
<jsp:setProperty name="Bean-Instanzname"
( property="*"
| property="Property-Name" [param="Parameter-Name"]
| property="Property-Name" value="String | <%! … %>"
)
{} … Gruppierung
/>
| … Alternative
[] … Option
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
37
Beispiel: Bean
<%@ page language="java" contentType="text/html" %>
<html><head><title>JSP 1</title></head><body>
<jsp:useBean
id="textBean" scope="page" class="Beans.Text"
/>
<jsp:setProperty name="textBean" property="*" />
Letzte Eingabe:
<jsp:getProperty name="textBean" property="text" />
<form name="text" action="bean.jsp" method="get">
<input type="text" name="text"/>
<input type="submit" name="action" value="Senden"/>
</form></body></html>
package Beans;
public class Text {
private String text;
public void setText(String text) {
this.text = text;
}
public String getText() { return text; }
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
38
Beispiel: Bean
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
39
Trennung Logik / Aussehen durch forward und redirect
 Anwendung zum Abfragen eines gültigen Passwortes (Anforderung
Länge >= 8 Zeichen)
 pass.jsp:
<%@ page language="java" contentType="text/html" %>
<html><head><title>Password</title></head><body>
<jsp:useBean id="pass" scope="request"
class="Beans.Password"
/>
<% if (pass.isInitialized() && !pass.isValid()) { %>
Passwort nicht gütig (zu kurz).<br>
<% } %>
Bitte Passwort eingeben (min. 8 Zeichen):
<form name="text" action="validate.jsp" method="post">
<input type="text" name="text" value="<%=
(pass.isInitialized())?pass.getPassword():"" %>"/>
<input type="submit" name="action" value="Senden"/>
</form></body></html>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
40
Trennung Logik / Aussehen durch forward und redirect
 validate.jsp:
<%@ page language="java" %>
<jsp:useBean id="pass" scope="request"
class="Beans.Password">
<jsp:setProperty name="pass" property="password"
param="text" />
</jsp:useBean>
<%
if (pass.isValid()) {
response.sendRedirect("ready.jsp");
} else {
%>
<jsp:forward page="pass.jsp"/>
<%
}
%>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
41
Trennung Logik / Aussehen durch forward und redirect
 ready.jsp:
<%@ page language="java" contentType="text/html"
%>
<html>
<head><title>Password</title></head>
<body>
Danke für das gütige Passwort.
</body>
</html>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
42
JSPs in Servlets nutzen
 Warum?
•
•
•
Logik in Servlets.
HTML in JSPs.
Unterstützung durch entsprechende Werkzeuge.
 Wie?
•
javax.servlet.RequestDispatcher
-
•
void include(ServletRequest req, ServletResponse res)
-
•
<ServletContext>.getRequestDispatcher(String absolutPath)
<ServletContext>.getNamedDispatcher(String name)
<ServletRequest>.getRequestDispatcher(String path)
Kontrolle behalten
void forward(ServletRequest req, ServletResponse res)
-
Kontrolle weitergeben
get/post
Servlet
response
Browser
include
JSP 1
JSP 2
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
43
Beispiel RequestDispatcher
public class Test extends HttpServlet {
public void doGet(HttpServletRequest req,
HttpServletResponse res) {
Object o = "Nur ein einfacher Test.";
res.setContentType("text/html");
req.setAttribute("test", o);
try {
getServletContext()
.getRequestDispatcher("/JSP/test.jsp")
.include(req, res);
} catch (Exception exc) { log(exc.getMessage()); }
}
}
<html>
<head><title>RequestDispatcher Test</title></head>
<body>
Value of "test": <%= request.getAttribute("test") %>
</body>
</html>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
44
JSP Implizite Objekte
Objekt
 ServletRequest: request
 ServletResponse: response
•






Wird normalerweise nicht benutzt.
PageContext: pageContext
HttpSession: session
ServletContext: application
JspWriter: out
ServletConfig: config
Object: page
•
Scope
 Request
 Page






Page
Session
Application
Page
Page
Page
Wird normalerweise nicht benutzt.
 Throwable: exception
 Page
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
45
Zusammenfassung





Dynamische Webseiten
Sitzungen
JSP ~ ASP/ASP.NET
JSP: Trennung von Aussehen und Implementierung
JSP/Servlet vs. Applet
•
•
Ausführung am Server, Ergebnis: HTML Seite
Applets: Ausführung am Client, Ergebnis: interaktives Programm
 JSP ist abstraktes Servlet
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
46
Konfiguration
 Download
•
Tomcat (Version 5)
-
•
http://jakarta.apache.org/tomcat/
jetty (Version 5)
-
http://jetty.mortbay.org/jetty/
 Konfiguration
•
server.xml
-
•
Einrichten der Kontexte
web.xml
-
Für alle Webanwendungen
Keine speziellen Konfigurationen!
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
47
web.xml (Schemadefinitionen, Versionen 2.3, 2.4 und
2.5)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- ... -->
</web-app>
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- ... -->
</web-app>
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app version="2.5"
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-app_2_5.xsd">
<!-- ... -->
</web-app>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
48
Herunterladen