Title: Web-Anbindung von Datenbanken
1Web-Anbindung von Datenbanken
2Übersicht
- Applikationslogik auf dem Web-Server Servlets
- Motivation
- Servlet-Tutorial
- Architektur, Trennung von Applikation und
Präsentation - Session-Management
- Datenbankanbindung in Java JDBC
3Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Warum Servlets?
- HTTP Anforderung von Dokumenten
- Problem Dynamik
- Lösungen
- Client-seitig JavaScript, Applets
- Server-seitig CGI, ASP, LiveWire, PHP ...
- Servlets
- Standard-API
- Plattformunabhängig Java
- Lightweight threads
- Stabil
4Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
- Java Servlet Development Kit JSDK 2.0
- ag-db/sw/packages/JSDK2.0
- Zwei Packages
- javax.servlet
- javax.servlet.http
- CLASSPATH enthält
- ag-db/sw/packages/JSDK2.0/lib/jsdk.jar
- Pfade, Referenzen usw. siehe Projektauftrag
5Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Beispiel 1 Einfaches Servlet
import java.io. import java.servlet. import
javax.servlet. public class HelloWorld extends
HttpServlet public void doGet(HttpServletRe
quest request, HttpServletResponse response)
throws IOException, ServletException
response.setContentType("text/html")
PrintWriter out response.getWriter()
out.println("lthtmlgt") out.println("ltbodygt
") out.println("ltheadgt")
out.println("lttitlegtHello World!lt/titlegt")
out.println("lt/headgt")
out.println("ltbodygt") out.println("lth1gtHe
llo World!lt/h1gt") out.println("lt/bodygt")
out.println("lt/htmlgt")
6Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Beispiel 2 Request Info
( ... ) out.println("lthtmlgt")
out.println("ltbodygt")
out.println("ltheadgt")
out.println("lttitlegtRequest Information
Examplelt/titlegt") out.println("lt/headgt")
out.println("ltbodygt")
out.println("lth3gtRequest Information
Examplelt/h3gt") out.println("Method "
request.getMethod()) out.println("Reques
t URI " request.getRequestURI())
out.println("Protocol " request.getProtocol())
out.println("PathInfo "
request.getPathInfo())
out.println("Remote Address "
request.getRemoteAddr())
out.println("lt/bodygt")
out.println("lt/htmlgt") ( ... )
7Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Beispiel 3 Request Header
import java.io. import java.servlet. import
javax.servlet. public class RequestHeaderExampl
e extends HttpServlet public void
doGet(HttpServletRequest request,
HttpServletResponse response) throws
IOException, ServletException
response.setContentType("text/html")
PrintWriter out response.getWriter()
Enumeration e request.getHeaderNames()
while (e.hasMoreElements()) String
name (String)e.nextElement()
String value request.getHeader(name)
out.println(name " " value)
8Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Beispiel 4 Request Parameters
public class RequestParamExample extends
HttpServlet public void doGet(HttpServletRe
quest request, HttpServletResponse response)
throws IOException, ServletException
response.setContentType("text/html")
PrintWriter out response.getWriter()
out.println("GET Request. No Form Data Posted")
public void doPost(HttpServletRequest
request, HttpServletResponse res) throws
IOException, ServletException
Enumeration e request.getParamterNames()
while (e.hasMoreElements())
String name (String)e.nextElement()
String value request.getParamter(name)
out.println(name " " value)
9Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Servlet Lebenszyklus
10Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Web-Server-Konfiguration und URLs
- Standard-Web-Server unterstützen Servlets
- JSDK liefert Web-Server mit
- (Doku siehe Projektauftrag)
- servletrunner
- Property-Dateien assoziieren URL mit Servlet
- Servlet kann unter vielen Namen angesprochen
werden
11Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Architektur einer Web-Applikation
Browser
Presentation Layer
Business-Objekte
Business-Objekte
Business Layer
Web Server
Datenbankzugriff
Data Access Layer
JDBC
Datenbankserver
12Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
Trennen von Applikationscode und BSS (HTML)
Schreiben Sie Ihren eigenen Page-Parser Klassenbib
liotheken (Objekte exportieren HTML, Umweg über
XML) WebMacro
HTML hartcodiert (in print-Anweisungen in
doGet/doPost) Pro einfach für
Programmierer Con Web-Designer/Design Tools,
Wartbarkeit Server Side Includes SSI (ltSERVLETgt
tag in HTML) Pro Trennung von BSS und
Code Con Entweder Servlet druckt Häppchen ohne
HTML oder man hat wieder hartcodiertes
HTML Templates (for common parts of all
pages) Pro Arbeitsersparnis, Wartbarkeit Con
wie SSI Java Server Pages JSP Pro Nur eine
Datei für Code und BSS, kein print Con Wieder
Mix von Applikation und HTML ? JavaBeans
Servlet Vector personen contex.put("Persons",
personen) Template foreach Person in
Persons ltTRgt ltTDgtPerson.Namelt/TDgt ltTDgtPerson.
Vornamelt/TDgt ltTDgtPerson.Telefonlt/TDgt lt/TRgt
end
13HTTP ist zustandslos!
Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
- Ursprünglich Request/Reply-Paradigma
- ECommerce, Electronic Banking Speichern von
Zustandsinformation über Seitenzugriff /
Browersitzung hinaus - Techniken
- URL Rewriting (ltA HREF"nextpage.htmlsessionid
AWEIRGTERUT"gt) - Cookies
14Servlet API für Sessions
Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
- javax.servlet.http.Cookie
- Viel bequemer und mächtigerjavax.servlet.http.Ht
tpSession - Cookies/URL Rewriting transparent für Entwickler
- Objekte werden gespeichert
- Auch über Servlet-Grenzen hinweg
15Beispiel HttpSession
Servlets Motivation Tutorial Architektur/Design Se
ssions JDBC
- HttpSession session request.getSession(tru
e) -
- out.println("ID " session.getId())
- out.println("Created "
session.getCreationTime()) - out.println("Last Accessed "
session.getLastAccessedTime()) - String dataName request.getParameter("da
taName") - if (dataName ! null dateName.length()
gt 0) - String dataValue request.getParamete
r("dataValue") - session.putValue(dataName,
dataValue) -
- String valueNames session.getValueNames(
) - if (valueNames ! null
valueNames.length gt 0) - for (int i 0 i lt
valueNames.length i) - String name valueNamesi
- String value session.getValue(na
me).toString() - out.println(name " "
value) -
-
Beliebiges Object
16(No Transcript)
17Datenbankanbindung in Java JDBC
Servlets JDBC Einführung Architekturen Klassenüber
sicht
- Was ist JDBC?
- ODBC Open Database Connectivity
- JavaSoft-Spezifikation für herstellerunabhängiges
API zum Zugriff auf SQL-Datenbankmanagementsyste
mein - Klassen-/Schnittstellensammlung
Funktioniert auch in Servlets ?
18import java.io. import java.sql. import
com.sybase.jdbc. import java.util. ...
- Class.forName("oracle.jdbc.driver.OracleDriver")
- String url "jdbcoraclethin_at_jefe1521JEFE"
- Connection con DriverManager.getConnection(
url, "aws ", "") - Statement stmt con.createStatement()
- ResultSet rs stmt.executeQuery( "SELECT
name, e_mail FROM adressen") - while (rs.next()) String n rs.getString("name"
)String n rs.getString("e_mail")System.out.p
rintln(s " " n)
19Treiber
Servlets JDBC Einführung Architekturen Klassenüber
sicht
- Übersetzt JDBC-Aufrufe in DB-(Hersteller-)spezifi
sche Aufrufe - Verschiedene Typen
- Beispiel com.sybase.jdbc.SybDriveraus jConnect
- Laden mit Class Loader Class.forName("com. ...
SybDriver") - ? Dynamisch konfigurierbar
202-Schicht-Architektur
Servlets JDBC Einführung Architekturen Klassenüber
sicht
Java-Anwendung
Client-Rechner
JDBC
DBMS-eigenes Protokoll
DBMS
Datenbank-Server
213-Schicht-Architektur
Servlets JDBC Einführung Architekturen Klassenüber
sicht
Java-Applet oder WWW-Browser
Client-Maschine (GUI)
HTTP, RMI, CORBA
Anwendungsserver
Anwendungsserver (Geschäftsprozesse)
JDBC
DBMS
DBMS-eigenes Protokoll
Datenbank-Server
22Das java.sql Package
Servlets JDBC Einführung Architekturen Klassenüber
sicht
- Wichtig sind zunächst folgende Klassen/Schnittstel
len/Ausnahmen - DriverManager
- Connection
- Statement
- ResultSet
- SQLException
23java.sql.DriverManager
Servlets JDBC Einführung Architekturen Klassenüber
sicht
- Verwaltet Treiber
- Treiber werden durch Aufruf von
Class.forName("DriverClassName") registriert - MethodenConnection getConnection(String
url,...)
24java.sql.Connection
Servlets JDBC Einführung Architekturen Klassenüber
sicht
- Repräsentiert Verbindung zur Datenbank
- Senden von SQL-Anweisungen
- MethodenStatement createStatement()void
close()
25java.sql.Statement
Servlets JDBC Einführung Architekturen Klassenüber
sicht
- Ausführung von Anweisungen
- Abfrage von Ergebnissen
- Drei Typen
- MethodenResultSet executeQuery(String)int
executeUpdate(String)void close()
26java.sql.ResultSet
Servlets JDBC Einführung Architekturen Klassenüber
sicht
- Tabelle mit Ergebnis einer Anweisung
- Iterieren mit boolean next()
- Zugriff auf Spaltenwerte mit Type getType(String
columnName)oderType getType(int
columnIndex)Type String, Boolean, Byte, Int,
Float, ...
27java.sql.SQLException
Servlets JDBC Einführung Architekturen Klassenüber
sicht
- MethodenString getSQLState()int
getSQLErrorCode()SQLException
getNextException()
28(No Transcript)
29Property-Class-Generator
- PropTest.snippet
- / This file was generated by PropClassGen from
PropTest.prp / - import java.util.
- import java.io.
- public class PropTest
- public static Properties properties_
- public static String TEST_PRP,
- TEST_HELLO
- static
- properties_ new Properties()
- try
- properties_.load(
- new BufferedInputStream(
- new FileInputStream(
- "/home/sahib/weber/java/mail//PropTest
.prp"))) - catch (Exception e)
- System.out.println(e.getMessage())
-
- TEST_PRP properties_.getProperty("test.prp")
PropTest.prp ________________________ test.prphe
llo, world test.helloits me