softwaretechnik - perschkeperschke.info/dhbwvs9363/sonst/java_jsp.pdf · 2016. 10. 13. · 20.07.10...
TRANSCRIPT
20.07.10 Thomas Perschke
Softwaretechnik
Servlets / JSP
20.07.10
Rückblick
Servlets– Einfache Servlets– Auswerten von Form-Daten
20.07.10
Heute
JSP
20.07.10
Servlet - JSP
HTML-Code wird im Servlet-Code erzeugt– Darstellung und Logik vereint– Java und HTML-Know-How notwendig– Änderung der Darstellung hat Änderung des Servlet-Codes
zur Folge– Keine Nutzung von HTML-Entwicklungstools möglich– Langer Entwicklungszyklus
Lösung: JSP
20.07.10
JSP – Java Server Pages
Technologie für die Entwicklung dynamischer Web-Seiten Kein Produkt, sondern offene Spezifikation Ermöglicht die Auslagerung der HTML-Formatierung Trennung
von Businesslogik und Darstellung Ermöglicht das Einbetten von speziellem Code in eine HTML-
Seite anstelle der Einbettung von HTML-Code in den Programmcode
JSP-Seiten bestehen aus– HTML-Code– Eingebettete JSP-Elemente
JSP-Elemente werden serverseitig aufgelöst, bevor die Ergebnisseite zurück gesendet wird
JSP-Seiten liegen auf dem Server compiliert vor Gutes Zusammenspiel von JSP und Servlets Voraussetzung: JDK, JSP-fähiger Web-Server
20.07.10
Konkurrierende Technologien
ASP– Ermöglicht das Integrieren von Programmcode in eine HTML-Seite
(VBScript, JScript)– Ermöglicht das Einbinden und Aufrufen von ActiveX-Komponenten– Datenbankzugriff, andere Komponenten von Drittanbietern – Funktionsweise wie bei JSP– Microsoft-spezifische Funktionen, nur limitierter Support für andere
Plattformen PHP
– Open Source Web Scripting Language– C-ähnliche Syntax mit einigen Features von Perl, C++ und Java– Große Anzahl an vordefinierten Funktionen (DB-Zugriff, LDAP,
generieren von PDF-Dokumenten und Bilder)– Funktionsweise wie bei JSP– Unterstützt eine große Anzahl von Plattformen
20.07.10
Beispiel einer JSP-Seite
<%@ page language="java" contentType="text/html" %> <html> <head><title>Meine JSP-Seite</title></head> <body> <h1>Meine erste JSP-Seite</h1> <% java.util.Date clock = new java.util.Date() %> <% if(clock.getHours()<12){ %> <h2>Guten Morgen</h2> <% } else if(clock.getHours()<18) { %> <h2>Guten Tag</h2> <% } else { %> <h2>Guten Abend</h2> <% } %> </body> </html>
<html><head><title>Meine JSP-Seite</title></head> <body> <h1>Meine erste JSP-Seite</h1> <h2>Guten Tag</h2> </body></html>
<html><head><title>Meine JSP-Seite</title></head> <body> <h1>Meine erste JSP-Seite</h1> <h2>Guten Tag</h2> </body></html>
20.07.10
JSP-Elemente
Direktive– beschreibt Informationen über die Seite selbst– Ändern sich nicht zwischen zwei Seitenaufrufen– Direktive Elemente
<%@ page ... %>Seitenabhängige Attribute wie Script-Sprache, Fehlerseite
<%@ include ... %>Einbindung von Dateien währende der Übersetzungsphase
<%@ taglib ... %>Deklaration von Tag Libraries
<%@ page errorPage=„errorpage.jsp“ %><%@ page isErrorPage=„true“ %>
20.07.10
JSP-Elemente
Standard Action Elemente– Dienen zum Ausführen von Aktionen– Basieren meist auf weiteren Informationen (Request-
Parameter, Informationen von externen Systemen,...)– Das Ergebnis der Aktion kann von Aufruf zu Aufruf
unterschiedlich sein– Action Elemente
<jsp:useBean>Ermöglicht den Zugriff auf JavaBeans
<jsp:getProperty>, <jsp:setProperty>Holt/Setzt den Wert eines bestimmten Attributes eines Beans
<jsp:forward>Leitet die Bearbeitung eines Requests an eine JSP-Seite oder an eine Servlet weiter
20.07.10
JSP-Elemente
Scripting Elements– Ermöglichen das Einbetten kleiner Code-Fragmente in eine
JSP-Seite (if, while,...)– Scripting Elements:
<% ... %>Scriptlet, dient zur Einbindung von ScriptingCode
<%= ... %>Expression, dient zur Einbindung von Java-Ausdrücken, bei denen das Ergebnis der Seite hinzugefügt werden soll
<%! ... %>Deklaration, dient zur Deklaration von Instanzvariablen und Methoden in einer JSP-Seite
20.07.10
JSP Processing
20.07.10
Hello-World Servlet
20.07.10
Hello World JSP-Seite
20.07.10
Von JSP-Seite generiertes Servlet
20.07.10
Einschub: JavaBeans
JavaBeans sind alle Javaklassen, die folgenden Bedingungen genügen:
– Implementieren das Interface „java.io.Serializable“– Verfügen über einen leeren Konstruktor– Für den Zugriff auf die Attribute stehen get- und set-Methoden
zur Verfügung, die einer Namenskonvention genügen: Die get-/set-Methoden beginnen mit get/set und Enden mit dem
Attributname, wobei der erste Buchstabe des Attributes groß geschrieben ist
Beispiel:– Attribute: String name– Get-Methode: public String getName()...– Set-Methode: public void setName(String newName)...
20.07.10
Einschub: JavaBean - Beispiel
public class Person { private String name; private String fname; private String email; private String pwd; public Person(){ } public void setName(String newName){ name = newName; } public String getName(){ return name; } ... }
20.07.10
Beispiel: Person
<%@ page language="java" contentType="text/html" %> <html> <head><title>Aktuelle Uhrzeit</title></head>
<body> <jsp:useBean id="person" class=„Person"></jsp:useBean> Die Daten der Person sind: <ul> <li>Name: <jsp:getProperty name="person" property="name"></jsp:getProperty> <li>Vorname: <jsp:getProperty name="person" property="fname"></jsp:getProperty> <li>Email: <jsp:getProperty name="person" property="email"></jsp:getProperty> <li>Kennwort: <jsp:getProperty name="person" property="pwd"></jsp:getProperty> </ul> </body> </html>
20.07.10
Übergabe von Parametern (1)
<html> <head><title>Zeit eingeben</title></head>
<body> Geben Sie das aktuelle Datum ein: <form method="post" action="zeit2.jsp"> <input type="text" name="hours" size="2">: <input type="text" name="minutes" size="2"> <br><input type="submit" value="go"> </form> </body> </html>
20.07.10
Übergabe von Parametern (2)
<%@ page language="java" contentType="text/html" %> <html> <head><title>Eingegebene Uhrzeit</title></head>
<body> <jsp:useBean id="clock" class="java.util.Date„ scope=„request“> <jsp:setProperty name="clock" property="*"></jsp:setProperty> </jsp:useBean> Die eingegebene Zeit ist: <br>Stunden: <jsp:getProperty name="clock" property="hours"></jsp:getProperty> <br>Minuten: <jsp:getProperty name="clock" property="minutes"></jsp:getProperty> </body> </html>
20.07.10
Implizite JSP-Objekte
Request– Instanz der Klasse javax.servlet.http.HttpServletRequest– Ermöglicht Zugriff auf alle Informationen des Requests
Response– Instanz der Klasse javax.servlet.http.HttpServletResponse– Ermöglicht Zugriff auf alle Informationen des Response
Exception– Nur in Fehlerseiten verfügbar– Liefert Informationen zum aufgetretenen Fehler
20.07.10
Beispiel: Request-Informationen
<%@ page language="java" contentType="text/html" %> <html> <head><title>Eingegebene Uhrzeit</title></head>
<body> <h1>Request-Informationen</h1>s Remote-Host: <%= request.getRemoteHost() %> <br>Remote-Addr: <%= request.getRemoteAddr() %> <br>Browserkennung: <%= request.getHeader("User-Agent") %> <br>Protocol: <%= request.getProtocol() %> <br>Parameter1: <%= request.getParameter("param1") %> <br>Parameter2: <%= request.getParameter("param2") %> </body> </html>
20.07.10
Datenaustausch zwischen JSP und Servlets
ScopeBestimmt, wie lange und für welche User gemeinsame Informationen gültig sind
– PageSichtbar nur innerhalb der Seite
– RequestSichtbar innerhalb aller Seiten, die den gleichen eines Request abarbeiten
– SessionSichtbar innerhalb einer Session, u.U. über mehrere Requests hinweg
– ApplicationSichtbar innerhalb der Applikation, also sichtbar für alle User der gleichen Applikation
20.07.10
Beispiel: Datenaustausch ServletJSP (1)
private synchronized void handleGetPersonAction( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Person person = new Person(); person.setName("Perschke"); person.setFirstname("Thomas"); person.setEmail("[email protected]"); person.setPassword("tp");
request.setAttribute("p1", person); RequestDispatcher rd = request.getRequestDispatcher("person.jsp"); rd.forward(request, response); }
20.07.10
Beispiel: Datenaustausch ServletJSP (2)
... <body> ... <jsp:useBean id="p1" scope="request" class=„Person" />
<p>Angaben zur Person: <br>Name: <%= p1.getName() %> <br>Vorname: <%= p1.getFirstname() %> <br>Email: <%= p1.getEmail() %> ... <p>Passwort: <jsp:getProperty name="p1" property=„password“ %>
</jsp:getProperty> ...
20.07.10
Beispiel: Datenaustausch ServletJSP (3)
... <body> ... <jsp:useBean id=„personen" scope="request" class=„java.util.Vector" />
<% for(int i=0; i<personen.size; i++){ %> <% Person einePerson = (Person)personen.elementAt(i); %> <p>Angaben zur Person <%= (i+1) %>: <br>Name: <%= einePerson.getName() %> <br>Vorname: <%= einePerson.getFirstname() %> <br>Email: <%= einePerson.getEmail() %> ... <p>Passwort: <jsp:getProperty name=„einePerson“ property=„password“ %>
</jsp:getProperty> ... <% }//end of for %>
...
20.07.10
JSP-Tags
Problem: – Grundlegende Java-Kenntnisse notwendig- Mangelnde Portierbarkeit durch Bindung an Servlet
- Lösung:- Erzeugen eigener Tags zur Kapselung oft benötigter
Funktionen- Ziel:
- Vollständige Befreiung der JSP von Java-Code- Leichtere Wiederverwendung- Nutzung von Tag-Bibliotheken (JSP Standard Tag Library,...)
20.07.10
JSP-Tags: Beispiel iterator-Tag
Der iterator-Tag soll dazu dienen, bestimmte HTML-Fragmente zu vervielfältigen.
Vorher:
<%@ page language="java" [...] %><html> [...] <body> <% for(int i=0; i<3; i++){ %> <p>Carpe Diem: Genieße den Tag!</p> <% } %> </body></html>
Nachher:
<%@ taglib uri=“[...]“ prefix=“mytags“ %><html> [...] <body> <mytags:iterate times=“3“> <p>Carpe Diem: Genieße den Tag!</p> </mytags:iterate> </body></html>
20.07.10
Ein eigenes Tag
Vorgehensweise:
1. Erstellen der Java-Klasse2. Konfiguration des Tag-Handlers3. Einbinden der Tag-Bibliothek4. Verwenden des Tags in einer JSP
20.07.10
Ein eigenes Tag – Erstellen der Java-Klasse
Erstellen der benötigten Java-Klasse, die die Funktionalität aufnimmt (Tag-Handler)
Java stellt dabei im Paket javax.servlet.jsp.tagext verschiedene Interfaces bereit. Kürzer: Verwendung der Klassen „TagSupport“ und „BodyTagSupport“ und überschreiben der Methoden
[...] public class IterationTag extends BodyTagSupport
implements BodyTag { [...] }
20.07.10
Ein eigenes Tag – Erstellen der Java-Klasse
Lebenszyklus eines Tags
<html>
[...]
[...]
</html>
<tag>
</tag>
[...]z.B. Text oder weitere Tags[...]
Rumpf
Hier wird die MethodedoStartTag() aufgerufen
Hier wird die MethodedoInitBody() aufgerufen
Hier wird die MethodedoAfterBody() aufgerufen
Hier wird die MethodedoEndTag() aufgerufen
Hier beginnt die Bearbeitung des nächsten Tags
Ende des Dokuments
EVAL_BODY_INCLUDE
SKIP_BODY
SKIP_PAGE
SKIP_BODY
EVAL_BODY_AGAIN
20.07.10
Ein eigenes Tag – Erstellen der Java-Klasse
Beispiel: Iterator-Tag
public class IterationTag extends BodyTagSupport [...] { private int iterations = 0; public void setTimes(Integer value){ iterations = value; } public int doAfterBody(){ BodyContent body = getBodyContent(); JspWriter out = body.getEnclosingWriter(); try{ for(int i=0; i<iterations; i++){ out.print(body.getString()); } }catch(IOException e){[...]}; return SKIP_BODY; } }
20.07.10
Ein eigenes Tag – Erstellen der Java-Klasse
Viele Servlet-Container verwalten ihre Tags über einen Pool. Aus diesem Grund sollten Tag-Handler, die einen zustand besitzen, über die Methode release() in den Ausgangszustand zurückgesetzt werden. Die Methode release() wird vom Servlet-Container nach Beendigung des Tag-Lebenszyklus aufgerufen.
public class IterationTag extends BodyTagSupport [...] { [...] public void release(){ iterations = 0; } }
20.07.10
Ein eigenes Tag – Konfiguration des Tag-Handlers
Dem Servlet-Container muss nun mitgeteilt werden, für welcher Tag-Handler für welches Tag zuständig ist. Was bei den Servlets der Deployment-Descriptor ist, wird in Tag-bibliotheken Tag Library Descriptor genannt (TLD).
<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC [...] >
<taglib> [...] <tag> <name>iterate</name> <tag-class>IterationTag</tag-class> <attribute> <name>times</name> <required>true</required> <type>java.lang.Integer</type> </attribute> </tag> [...]</taglib>
20.07.10
Ein eigenes Tag – Einbinden der Tag-Bibliothek
Der TLD wird üblicherweise unterhalb des Verzeichnisses „web-inf“ im Dateisystem abgelegt
Im Web-Deployment-Descriptor wird der TLD dann verfügbar gemacht
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC [...]>
<web-app> [...] <taglib> <taglib-uri>/mytags</taglib-uri> <taglib-location>/WEB-INF/tlds/mytags.tld</taglib-location> </taglib> [...]</web-app>
20.07.10
Ein eigenes Tag – Verwendung in der JSP
<%@ taglib uri=“[...]“ prefix=“mytags“ %><html> [...] <body> <mytags:iterate times=“3“> <p>Carpe Diem: Genieße den Tag!</p> </mytags:iterate> </body></html>