Besprechung Datenbankpraktikum

Werbung
Servlets und JSPs
HTTP, JSP und Servlets
DB2
Besprechung
Datenbankpraktikum
DBServer
Server
Client
Apache
Anfrage (http-request)‫‏‬
27. Mai 2008
Statischer
Webserver
Antwort (http-response)‫‏‬
Dynamischer
Webserver
Java Servlets
(kompiliert)‫‏‬
statische
HTML-Seiten
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
• HTTP Request:
– URL:
http://server:port/page?param1=value1&param2=
value2
– Methode: POST/GET/...
– Body: Beinhaltet Parameter bei Post, andere
Daten für die Verbindung
– Header
• HTTP Response:
Besprechung Datenbankpraktikum SoSe 2008
Java Server
Pages (JSP)‫‏‬
27.05.2008
Datentransport bei HTTP:
Zwei Methoden, um Daten zu übergeben:
• GET: Die Daten werden an die Ziel-URL
angehängt.
– Nachteile:
• Der Benutzer kann die Daten sehen
• Die Länge ist begrenzt
• POST: Die Daten werden an die http-Anfrage als
Body angehängt
– Nachteil:
• Nur per Formular möglich
27.05.2008
HTTP Daten (2)‫‏‬
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
HTTP Daten (3)‫‏‬
• Parameter-Übergabe durch GET
• HTML-Formulare: POST
– Parameter an einen Link anhängen, das Ziel des Links wird
aufgerufen und kann die Parameter dann auswerten:
– Syntax:
<a href="filename.jsp?param1=val1&param2=val2">..</a>
– in JSP dynamisch erzeugen, der User löst durch klicken auf
den Link die gewünschte Aktion aus.
– Bsp: <% for ( int i=0; i<10; i++ ) { %> <a
href="filename.jsp?id=<%=i%>"><%=i%>tes Ziel</a><% }
%>
Besprechung Datenbankpraktikum SoSe 2008
JSPEngine
HTTP-Daten (1)‫‏‬
Request und Response
– Header
– Geforderte Datei (HTML)‫‏‬
Besprechung Datenbankpraktikum SoSe 2008
Jakarta
Tomcat
27.05.2008
– Per HTML-Tags definiert man eine logische Struktur von
Eingabefeldern, die die Eingaben des Benutzers
aufnehmen und bei Bestätigung an ein angegebenes
Ziel senden:
– Bsp: Bitte Daten eingeben:<br />
/>
<form action="filename" method="post">
Name:
<input type="text" name="id" /><br
<input type="submit" value="OK" />
</form>
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
1
(X)HTML – Hypertext Markup
Language
HTTP Daten (4)‫‏‬
• alle Daten im impliziten Objekt request (der Klasse
HttpServletRequest)‫‏‬
• Auslesen der Parameter
name : liefert den Wert des
Parameters name als String zurück
name : liefert Array mit
allen Werten des Parameters name zurück
: liefert alle Parameter, die an
eine Seite gesendet wurden
• Weitere Informationen aus dem Anfrage-Header:
– z.B.
Host und Port)‫‏‬
): liefert die URI der Anfrage (ohne
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
<html>
<head>
<title>Hallo Welt!</title>
<meta ... />
<style> <!-- CSS --> </style>
</head>
<body>
<p>
Dies ist ein Absatz mit Text. Dieser Bereich ist
<strong>hervorgehoben</strong>.
<!-- Das ist ein Komentar. Er wird nicht angezeigt -->
</p>
<table> <!-- Das ist eine Tabelle -->
<tr> <!-- Die Tabelle hat eine Zeile -->
<td>Hier ist die erste Spalte</td>
<td>... und da die zweite</td>
</tr>
</table>
</body>
</html>
Besprechung Datenbankpraktikum SoSe 2008
Servlets vs. JSPs
Bearbeitung dynamischer Seiten
•
Lesen der gesendeten Daten
•
andere Informationen aus http-Anfrage entnehmen
•
Ergebnisse generieren
•
•
Ergebnisse formatieren, in HTML einbetten
HTTP-Antwortparameter setzen
•
Dokument an Client zurücksenden
• Unterschiedliche Konzepte:
aus Formularen, Links, andere http-Anwendungen
– Servlets erstellen HTML-Code im Java-Code
– JSPs integrieren Java-Code in HTML-Code
Cookies, Browser-Typ, Hostname, ...
• Servlet
Datenbankanfrage, Benutzereingaben verarbeiten, ...
– Grundfunktionalität für eine Reaktion auf HTTPAnfragen (Controller)‫‏‬
Cookies an Client schicken
• doGet - versus doPost - Requests
Textformat für HTML und XML, Binärdaten für Bilder usw.
• JSP
– Geeignet für dynamische Repräsentation von
Inhalte mittels (X)HTML (Views)‫‏‬
Servlets und JSPs erleichtern diese Schritte
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
Servlets
27.05.2008
Servlets: doGet() Beispiel
Web Server
HTTP Servlet Unterklasse
public class SimpleRead extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response)º
throws ServletException, IOException {
GET request
response
response.setContentType("text/html");
doGet()‫‏‬
PrintWriter out = response.getWriter();
out.write("<html>\n");
out.write("<head>Hallo Welt</head>\n<body>\n<p>");
POST request
response
out.write("Parameter id hat den Wert: " +
request.getParameter("id"));
doPost()‫‏‬
...
out.write("</p>\n</body>\n</html>");
...
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
2
Servlets: doPost() Beispiel
JSP-Seiten
public class SimpleRead extends HttpServlet {
grob: JSP = HTML + zusätzliche Tags
protected void doPost(HttpServletRequest request,
HttpServletResponse response)º
throws ServletException, IOException {
String op = request.getParameter("operation");
int i = request.getParameter("id");
String result = "";
if(op.equals("searchCustomerById")) {
Customer c = Customer.getInstance();
result = c.searchCustomerById(i);
}
<html>
<head>
<title>Hallo Welt</title>
</head>
<html>
<head>
<title>Hallo Welt</title>
</head>
<body>
Herzlich Willkommen
<body>
Herzlich Willkommen,
es ist jetzt
<%=new java.util.Date()%>
</body>
response.setContentType("text/html");
PrintWriter out = response.getWriter();
</body>
out.write(...);
out.write("Der Kunde mit ID: " + i + "ist: " + result);
...
</html>
</html>
}
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Konstrukte einer JSP
• Deklarationen:
– Beispiel: <strong>hervorgehobener Text</strong>
– Hauptteil der Ausgabe im Browser
• Ausdrücke:
– Beispiel: <%=
%> (<%= foo %>)º
– Code wird ausgewertet und ausgegeben
– Beispiel: <%! Code %> <%! int foo = 21; %> º
– Die Instanzen, die so erzeugt werden, werden im Rumpf
der Java-Klasse deklariert. Sie sind also in allen
Instanzen des JSPs gültig (im Gegensatz zur
Instanziierung in einem Skriptlet-Code)‫‏‬
• Scriptlets:
– Beispiel: <% Code %> (<% foo = foo * 2; %>)º
– Ausführen von Java-Code
– Ausgaben mit print, println über das automatisch (in
jedem JSP) instanziierte Objekt out (Instanz von
JspWriter, Unterklassen von PrintWriter)‫‏‬
27.05.2008
Konstrukte einer JSP
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Beispiel
<%@ page import ="java.util.HashSet" %>
<%! int var2 = 0; %>
• Direktiven zum Import von Klassen:
<%@ page import="package.Class" %>
z.B. <%@ page import="java.util.Vector" %>
<html>
<head>
<title>Hallo Welt</title>
</head>
• Weitere Direktiven:
– Fehlerseite
• wird bei unbehandelten Exceptions aufgerufen
• implizites Objekt
<body>
1 + 4 = <% int var = 1+4;
out.println( var + "<br />" ); %>
var2 = <%= var2++ %>
•
–
• zum Einbinden von Dateien
</body>
•
</html>
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Konstrukte einer JSP
• HTML-Elemente:
Besprechung Datenbankpraktikum SoSe 2008
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
3
JSPs
Beispiel – Umsetzung (1)‫‏‬
Was erzeugt Tomcat daraus?
• JSPs werden (automatisch) zu Servlets
kompiliert:
JSP
*.java
package org.apache.jsp;
...
import java.util.HashSet;
*.class
public class test_jsp extends HttpJspBase {
int var2 = 0;
...
public void _jspService(HttpServletRequest request,
HttpServletResponse response) {
...
out.write("\n");
out.write("\n\n");
out.write("<html>\n\t");
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
Beispiel – Umsetzung (2)‫‏‬
27.05.2008
jspInit und jspDestroy
out.write("<head>\n\t\t");
out.write("<title>HTML-Seite");
out.write("</title>\n\t");
out.write("</head>\n\t\n\t");
out.write("<body>\n\t\t1 + 4 = ");
int var = 1+4;
out.println(var+"<br />");
out.write("\n\n\t\tvar2 = ");
out.print( var2++ );
out.write("\n\t");
out.write("</body>\n");
out.write("</html>\n");
...
wird automatisch einmal am Anfang bzw. Ende ausgeführt
<%!
Connection con = null;
public void jspInit() {
try {
Class.forName( "COM.ibm.db2.jcc.DB2Driver" );
}
catch ( Exception e ) {}
}
public void jspDestroy() {
try {
con.close();
}
catch ( Exception e ) {}
}
}
}
%>
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Sessions
Implizite Objekte eines JSPs
• JspWriter out: Schreibt Daten in den Ausgabestrom an den Browser
• HttpServletRequest request: Enthält Anfrage-Parameter, Cookies
und sonstige Informationen zur Anfrage
• HTTP-Protokoll ist zustandslos
• keine Unterstützung für
Kontextinformationen
• HttpServletResponse response: Repräsentiert die Antwort an den
Browser. Bietet Möglichkeiten zum Ändern von Headern, Setzen von
Http-Statuscodes und Cookies
• HttpSession session
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
4
Sessions
Sessions
Server
Client
Client
response
request
• wozu?
– Benutzerkomfort
– Statistiken
– ...
response
request
response
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Sessions
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Sessions
Server
Client
• Protokoll nachträglich um Sessions erweitert
– eindeutige ID für jeden neuen Client
– als Cookie oder GET/POST-Parameter
– bei jeder Anfrage an den Server gesandt
request
Client
• Verschiedene Implementierungen
– Cookies: auf dem Client wird die eindeutige
Session ID abgelegt
– URL Rewriting: Session ID wird in der Addresse
kodiert
"
"
request
response
request
response
Î
request
response
Servlet Engine wählt automatisch richtige
Implementierung
session
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Sessions
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Sessions in Servlets/JSP
• Session ist "Container" für Daten
• Server hält diese Daten
• Session wird automatisch gestartet
– implizites Objekt:
• einige Methoden:
– spart Traffic
– nur kontrollierte Manipulation
º
º
• Session-Ende:
º
– explizit durch den Client
– durch Timeouts
º
º
• explizites Beenden einer Session
–
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
º
27.05.2008
5
Weitere Kontexte
Sessions in Servlets/JSP
•
• Speichern von Objekten:
º
–
• Holen von Objekten
– für die Dauer einer einzelnen Anfrage
•
º
–
– für die Dauer einer Session
• Löschen von Objekten
•
º
–
Besprechung Datenbankpraktikum SoSe 2008
– über die gesamte Laufzeit der Anwendung
27.05.2008
Sessions
Client
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Java Beans
Server
Client
• Java-Klasse zur Abbildung der Daten
• Default Konstruktor
• vorgegebenes Namensschema für
Zugriffsmethoden:
– Attribut XYZ:
void setXYZ( ... )º
... getXYZ()º
page
session
application
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Java Beans
– Ausnahme: boolesche Attribute:
void setXYZ( boolean ... )º
boolean isXYZ()º
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Beispiel
• Daten werden in Beans gehalten
• Beans werden in angemessenem Kontext
abgelegt
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
6
Beispiel
Java Beans und JSP
• Bean deklarieren/erzeugen:
• Property lesen:
• Property schreiben:
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Web Applikation Ordnerstruktur
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Deployment Descriptor
• /WEB-INF/web.xml
– Deployment Descriptor
• /WEB-INF/classes/
<servlet>
– kompilierte Java Klassen
<servlet-name>
• /WEB-INF/lib/
<servlet-mapping>
• /
<servlet-name>
<url-pattern>
– *.jsp, *.html, *.gif, *.jpg, etc.
</servlet-name>
</url-pattern>
</servlet-mapping>
27.05.2008
Deployment Descriptor
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Sessions
• Interface
Überwachen von Sessions
• Methoden:
• Weitere Tags:
– <init-param>
– <load-on-startup>
– <session-timeout>
– <welcome-file-list>
– <error-page>
– ...
Besprechung Datenbankpraktikum SoSe 2008
</servlet-class>
</servlet>
– JAR Archiven
Besprechung Datenbankpraktikum SoSe 2008
</servlet-name>
<servlet-class>
–
–
zum
º
º
• damit auch Reaktion auf Session-Timeouts
möglich
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
7
Beispiel
Sessions
package tum.dbpra00;
• Timeout auf dem Praktikumsserver:
eine Minute
• konfigurierbar in WEB-INF/web.xml:
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionWatcher implements HttpSessionListener
{
public void sessionCreated( HttpSessionEvent e ) {
System.err.println( "Neue Session: " + e );
}
public void sessionDestroyed( HttpSessionEvent e ) {
System.err.println( "Session " + e + " beendet." );
}
}
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
Session Listener
Java Standard Tag Library (JSTL)‫‏‬
• Tag Library für oft benutzte Funktionen
• Logik in JSP Seiten ohne Java Code direkt
in der JSP Seite selber einzugeben
• Weitere Trennung von Präsentation und
Logik
• Einbindung des Listeners in
Î
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
Java Naming and Directory Interface
(JNDI)‫‏‬
// Obtain our environment naming context
// Look up our data source
DataSource ds = (DataSource)º
cxt.lookup("java:/comp/env/jdbc/PraktDB");
27.05.2008
Apache Ant
•
•
•
•
Context initCtx = new InitialContext();
Selbständig einarbeiten und evtl. nutzen
Build Tool für Java Projekte
Vergleichbar mit make
XML basiert
Beispiel Ant Script (mit Kommentare) im
Frontend bereitgestellt
// Allocate and use a connection from the pool
Connection con = ds.getConnection();
... use this connection to access the database ...
con.close();
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
8
RequestDispatcher
RequestDispatcher Beispiel
• Interface javax.servlet.RequestDispatcher
• Benutzt um den request zu jede Resource
(HTML-Datei, Servlet oder JSP Seite)
weiterzuleiten
• Beinhaltet Funktionen:
throws ServletException, IOException {
/* Die die von Methode getGreetingBean() gibt
eine JavaBean (Klasse mit get/set Methoden)
zurück.*/
GreetingBean bean = getGreetingBean();
/* Die bean dem request "anhängen" */
request.setAttribute("greetingbean",bean);
– forward(request, response):
–
Leitet ein Request
vom Servlet zu eine anderere Resource
include(request, response): Schreibt die Inhalte
einer Resource (HTML, Servlet oder JSP) nach
response (server-side includes in Servlet).
protected void doGet(HttpServletRequest request,
HttpServletResponse response)º
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
RequestDispatcher Beispiel
hello.jsp holen */
RequestDispatcher dispatcher =
request.getRequestDispatcher("hello.jsp");
...
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
dbpra Verzeichnisstruktur etc.
...
/* über den RequestDispatcher den request,
* und den response auf
* die JSP forwarden.
*/
dispatcher.forward(request,response);
}
•Die Weiterleitung läuft im ServletContainer intern ab.
Der Client lädt nicht eine neue Adresse, sondern
bekommt von dieser Weiterleitung gar nichts mit.
Besprechung Datenbankpraktikum SoSe 2008
/* RequestDispatcher auf die JSP
27.05.2008
• Tomcat: dbpra, Port: 8080
• Einstiegsseite:
http://dbpra.in.tum.de:8080/
• Jede Gruppe hat ihren eigenen Kontext unter
/vol/praktika/dbpra/share/tum/dbpra<XX>/public_jsp
• JSPs als Dateien mit der Endung *.jsp in obiges Verzeichnis
• Beispiel-JSPs unter
/vol/praktika/dbpra/share/tum/staff/public_jsp
• Tomcat kann auch statische html-Seiten ausliefern
• Nutzt JNDI zur Verbindungsaufbau (siehe Merkblatt)‫‏‬
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
Hinweise
• Core Servlets and Java Server Pages (Hall and
Brown):
http://pdf.coreservlets.com
• Java Server Pages:
http://java.sun.com/products/jsp/
• Java Servlets API Specification:
http://java.sun.com/products/servlet/reference/api/index.html
• Java 1.5.0 API Specification:
http://java.sun.com/j2se/1.5.0/docs/api/
• HTML Tutorials:
http://www.selfhtml.org/
http://www.w3schools.com/
• Tomcat Dokumentation:
http://jakarta.apache.org/tomcat/tomcat-5.5-doc/
Besprechung Datenbankpraktikum SoSe 2008
27.05.2008
9
Herunterladen