Java - Vertiefungskurs

Werbung
Internetzugriff mit Strings und Streams
Lesen aus dem Internet (über URL)
URL url = new URL(
"http://www.upb.de/cs/boettcher/willkommen.htm");
BufferedReader einURL = new BufferedReader(
new InputStreamReader(url.openStream()) );
String s = einURL.readLine() ; // ...
Ausnahmen abfangen (bei allen Leseoperationen)
try {
// ...
Leseoperationen
}
catch(Exception e) { System.out.println(e); } // Ausnahmen abfangen
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Internetzugriff über Sockets
Andere Rechner sind genauso zugreifbar wie lokale Dateien
in Java über Eingabe- bzw. Ausgabe-Ströme
String host = “paris.uni-paderborn.de";
Socket socket = new Socket(host, 13);
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String zeit = in.readLine();
System.out.println(“Die Zeit auf Rechner " + host + " ist " + zeit);
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Ein HTTP-Client
import java.io.*;
import java.net.*;
public class HttpClient {
public static void main( String[ ] args ) {
try { Socket socket = new Socket("192.168.1.101", 8080 );
BufferedReader from_server = new BufferedReader(
new InputStreamReader( socket.getInputStream() ) ) ;
PrintWriter to_server =
new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
// Sende HTTP GET Kommando zum Web server und welche Seite
to_server.println("GET /start.html"); to_server.println(); to_server.flush();
// sende sofort
String zeile = from_server.readLine() ;
while ( zeile != null ) { System.out.println( zeile ) ;
zeile = from_server.readLine() ; }
socket.close(); // Wenn alles gelesen ist, schließe Socket
} catch (Exception e) { System.out.println(e); }
}
}
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Einfacher HTTP-Spiegelserver
import java.io.*;
import java.net.*;
public class HttpSpiegel {
public static void main(String args[]) {
try { ServerSocket ss = new ServerSocket(8080); // Service einrichten
for(;;) { Socket client = ss.accept( ); // warte bis ein Client sich anmeldet
BufferedReader in = new BufferedReader(
new InputStreamReader( client.getInputStream( ) ) );
PrintWriter out = new PrintWriter(
new OutputStreamWriter( client.getOutputStream( ) ) );
out.println("HTTP/1.0 200 "); out.println("Content-Type: text/plain");
out.println( ); out.flush( );
String zeile = in.readLine( ) ;
while( zeile != null && zeile.length( ) != 0 )
{ out.println( zeile ); zeile = in.readLine() ;
}
}
out.close( ); in.close( ); client.close( );
} // for: Warte auf nächsten Client
catch (Exception e) { System.out.println(e); }
}
}
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
RMI und Objektserialisierung
RMI: Aufruf von Methoden in entfernt definierten Klassen
RMI-Server
RMI-Client
RMI-Verbindung
Registrierung via rmiregistry
RMI-Compiler erzeugt aus Klassen Stubs und Skeleton-Klassen
Binden der Objekte , dann Aufruf wie bei lokalen Objekten
Serialisierung: Objekte werden als Datenstrom übertragen
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
RMI-Code (Client)
import java.rmi.*;
Entfernter Server (Typ=interface)
public class Bank {
public interface RemoteBank extends Remote {
public String conc(String s1, String s2)
throws RemoteException ;
}
// interface für Server
// was Server bietet
IP
Servicename
public static void main(String[] args)
{ try
{ // Suche Server mit Name "bankname"
RemoteBank bank = // Serverobjekt
(RemoteBank) Naming.lookup("rmi://192.168.1.101/bankname");
String ret = bank.conc(args[0], args[1]); // Aufruf an Serverobjekt
System.out.println(ret) ;
} // Fange und zeige RMI-Exceptions
catch (Exception e) { System.out.println(e); }
} // main
}
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
RMI-Code (Server)
import java.rmi.*;
import java.rmi.server.*;
import Bank.*;
// lade das Interface für RemoteBank
public class RemoteBankServer extends UnicastRemoteObject implements RemoteBank
{ public RemoteBankServer() throws RemoteException { super(); }
// Implementierung der Remote-Methode conc aus Interface RemoteBank
public synchronized String conc (String s1, String s2) throws RemoteException
{ System.out.println( s1 + " :: " + s2 ) ;
return s1+s2 ;
}
public static void main(String[] args) {
try { RemoteBankServer bank = new RemoteBankServer(); // erzeugt Serverobjekt
Naming.rebind("bankname", bank);
// sein Name ist "bankname"
System.out.println("bankname ist bereit.");
}
catch (Exception e) {
System.err.println(e);
}
}
}
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
RMI: Arbeitsweise / Codegenerierung
1. Alle Java-Programme übersetzen:
javac *.java
2. Das Server-Programm vorübersetzen mit rmic
rmic RemoteBankServer
erzeugt Code zum Datentransfer über das Netz
3. Einen Registrierungsprozeß für rmi-Server starten
Fenster1: rmiregistry
4. Das Server-Programm starten
Fenster2: RemoteBankServer
5. Das Client-Programm starten
Fenster3 (evtl. auf einem anderen Rechner): Bank ab xy
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
3-Tier-Architecktur mit RMI
HTMLSeite
Produktdatenbank
Browser
Applet
BusinessDB-Zugr.
RMI
Logik (Java)
Programm
Eingabe
Client
RMI
Application-Server
DB-Server
+
+
+
+/-
Session-Konzept erlaubt zwischenzeitliche Interaktion
Last zwischen Client und Applicationserver frei verteilbar
in der Regel geringere Serverlast (verteilt auf 2 Server)
Client muß Java-fähige Browser nutzen
-
Server müssen Java-fähige Schnittstelle bieten (Java/Corba)
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
RMI: Übung
1. Kopieren Sie die RMI-Programme (z.B. vom Dozentenrechner)
in ein Verzeichnis auf Ihrem Rechner und ändern Sie Bank.java
so, daß die IP Ihres Rechners eingetragen ist.
2. Alle Java-Programme übersetzen:
> javac *.java
3. Das Server-Programm vorübersetzen mit rmic
> rmic RemoteBankServer
erzeugt Code zum Datentransfer über das Netz
4. Einen Registrierungsprozeß für rmi-Server starten
Fenster1:
> rmiregistry
5. Das Server-Programm starten
Fenster2:
> java RemoteBankServer
6. Das Client-Programm starten
Fenster3 (evtl. auf anderem Rechner): > java Bank ab xy
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Java Server Pages (JSP)
Bisher:
HTML - statische Seiteninhalte
php, ... - dynamische Seiteninhalte, nicht typsicher und portabel
Servlets - dynamische Seiteninhalte, typsicher und portabel ,
aber keine Trennung von Layout, Logik und Daten
Neu:
JSP
- dynamische Seiteninhalte, typsicher und portabel ,
und Trennung von Layout, Logik und Daten
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Java Server Pages (Beispielausgabe)
JSP-Verzeichnis
Layout (+konstanter Inhalt)
JSP-Seite
dynamischer Inhalt
Layout
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Java Server Pages (JSP)
http://localhost:8080
/beispiel1/clock.jsp
JSP-Web-Server
clock.jsp
Web-Browser
.class-Files
Servlet (.java)
Willkommen in ...
Preisliste von
Mo. 22.Jan 21:55 ...
Web-Seite (html)
Clock.Java
Client
Server
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Java Server Pages (Beispiel)
import java.util.*;
// Clock.Java
public class Clock
{ public String getDay()
{
return "Datum und Uhrzeit ist: " + new Date() }
}
<HTML>
// clock.jsp
<%@ page language="java" import="Clock" %>
<jsp:useBean id="clock" class="Clock" />
<H1>Willkommen in unserem Internetshop</H1>
<p> Preisliste von <%= clock.getDay() %> ist ...
</HTML>
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
JSP (Trennung von Design und Logik)
Eingabe
WebBrowser
Ausgabe
Client
JSP-Web-Server
JSP-Seite
.class-Files
Servlet (.java)
Web-Seite (html)
WebDesigner
ProgramJava-Klasse(n)
mierer
Server
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
JSP mit taglib
<HTML>
// beispiel1.jsp
<%@ taglib uri="/bsplib" prefix="jsplib" %>
<H1>Willkommen in unserem Internetshop</H1>
<P>Preisliste von <jsplib:getDay/> ist ... </P>
<jsplib:ifIs timeOfDay="PM"> Sonderangebot vor Ladenschluß ...
</jsplib:ifIs>
</HTML>
<taglib>
// Ausschnitt aus bsplib.tld
<tag>
<name>getDay</name>
<tagclass>beispiel1.GetDayTag</tagclass>
</tag>
<tag>
<name>ifIs</name>
<tagclass>beispiel.IfIsTag</tagclass>
<attribute>
<name>timeOfDay</name>
<required>true</required>
</attribute>
</tag>
</taglib>
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Taglib - Datei
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib> <tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>bsplib</shortname>
<tag>
<name>getDay</name>
<tagclass>beispiel1.GetDayTag</tagclass>
</tag>
<tag>
<name>ifIs</name>
<tagclass>beispiel.IfIsTag</tagclass>
<attribute>
<name>timeOfDay</name>
<required>true</required>
</attribute>
</tag>
</taglib>
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Zusammenfassung
Vorteile von Java für Internet-Programmierung :
+ Portabitität
+ Applets (Eingabe-Fehler auf Clientseite abfangen)
+ Servlets (Serverprogramm: portabel, effizient, sicher)
+ Java Server Pages (trennt Layout von Logik u. Daten)
+ JDBC
+ verteilte Anwendungen (Socket, RMI, ...)
+ Internet-Zugriff
+ Server-Implementierungen
+ Sicherheit für Server und Client
+/- effizient (nicht immer ganz so schnell wie C/C++)
+/- typsichere Entwicklung - nicht: quick (and dirty)
Datenbanken 2 - Java-Server-RMI-Servlets - Prof. Dr. Stefan Böttcher - WS 2000/01
Herunterladen