Universität Augsburg, Institut für Informatik Prof. Dr. W. Kießling Dr. A. Huhn, M. Endres SS 2009 21. Mai. 2009 Übungsblatt 5 Suchmaschinen Aufgabe 1: Servlets und Datenbanken In dieser Aufgabe soll ein Servlet entstehen, mit dessen Hilfe eine Datenbank durchsucht wird. Der Verbindungsaufbau zu einer Datenbank wird bei JEE im Allgemeinen vom Server erledigt. Eine Datenbank wird allgemein durch eine XML-Konfigurationsdatei als Data Source deklariert und kann dann über einen festgelegten Namen erreicht werden. Eine Verbindung zur StandardDatenbank bauen Sie wie folgt auf: javax.naming.InitialContext context = new InitialContext(); javax.xml.DataSource ds = (DataSource) context.lookup("java:/DefaultDS"); java.sql.Connection conn = ds.getConnection(); Dabei ist java:/DefaultDS der JNDI-Name der Resource (JNDI steht für Java Naming and Directory Interface). Die JBoss-Standard-Datenbank ist HSQL. Definitionen aller Tabellen und -Inhalte sind in der Datei server\default\data\hypersonic\localdb.script als SQL-Statements aufgeführt. Sie sollen nun eine Web-Anwendung implementieren, mit der die Nahrungsmittel-Datenbank durchsucht werden kann. Gehen Sie wie folgt vor: a) Ergänzen Sie localdb.script um die Einträge aus der Datei food_db.sql (siehe ÜbungsSeite im Web). Kopieren Sie die neuen CREATE MEMORY TABLE Statements unter die bereits vorhandenen. b) Die INSERT-Statements aus food_db.sql können Sie am Ende der localdb.script einfügen. c) Machen Sie sich mit der Struktur der Nahrungsmittel-Datenbank vertraut. d) Implementieren Sie die Web-Anwendung: Es sollen die Tabellen für die Nahrungsmittel-Typen FAST FOODS, SNACKS, SWEETS und BEVERAGES durchsucht werden können. Für jeden Suchvorgang soll die Tabelle frei wählbar sein oder alle Tabellen durchsucht werden können. e) Pro Nährstoff-Kategorie soll Minimum und Maximum der gewünschten Ergebnisse per Formular wählbar sein. f) Die Anzeige der Ergebnisse soll in Tabellenform erfolgen. 1 Aufgabe 2: Enterprise Java Beans - Session Beans Enterprise Java Beans sind ein Programmierkonzept, um komponentenbasierte Software zu schreiben. Dabei unterscheidet man zwei Arten von Beans: • stateless (zustandslose) Beans, die bei jedem Aufruf gleich reagieren • stateful (zustandsbehaftete) Beans, die einen internen Zustand besitzen Wir werden beide Arten implementieren und mit einem Client darauf zugreifen. 1. Erstellen Sie ein neues EJB-Projekt. Der Ziel-Server ist JBoss, für den auch die DefaultKonfiguration gewählt werden soll. Im letzten Fenster setzen Sie einen Haken vor Generate Deployment Descriptor. 2. Erzeugen Sie jetzt ein neues EJB Session Bean. Wir beginnen mit einem Stateless-Bean namens Calculator im Paket beans. Das Bean soll die folgenden Methoden haben: • public int sum(int a, int b) - gibt die Summe von a und b zurück • public int mult(int a, int b) - gibt das Produkt von a und b zurück Tragen Sie die Methoden dazu sowohl in der Bean-Klasse CalculatorBean als auch im Bean-Interface Calculator ein. Das Interface legt fest, welche Methoden ein Client sehen kann. Über Run as→Run on Server wird das Bean auf dem Server deployed und kann verwendet werden. Die Erfolgsmeldung des Servers lautet: STARTED EJB: bean.CalculatorBean ejbName: CalculatorBean 3. Nun soll ein Programm entstehen, das auf das Bean zugreift. Erstellen Sie ein neues JavaProjekt, dem Sie die Libraries jbossall-client.jar und jboss-ejb3.jar aus dem JBoss-Unterverzeichnis client hinzufügen. Bei den referenzierten Projekten tragen Sie das EJB-Projekt ein. Die Konfigurationsdaten speichern Sie in der Datei jndi.properties: java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost:1099 Die Konfiguration und der Aufruf eines Beans laufen dann wie folgt ab: java.util.Properties props = new Properties(); props.load(new java.io.FileInputStream("jndi.properties")); javax.naming.InitialContext ctx = new InitialContext(props); beans.Calculator calc = (Calculator) ctx.lookup("CalculatorBean/remote"); 4. Stateful Beans haben Attribute, deren Wert während einer Session mit einem Client gespeichert bleibt. Ein solches soll jetzt entstehen und die folgenden Methoden anbieten: • • • • public public public public int int int int setMin(int min) - setze das Attribut min neu setMax(int max) - setze das Attribut max neu random() - gib eine Zufallszahl zwischen min und max zurück getCount() - gib die Anzahl der Aufrufe von random zurück Testen Sie das Bean ebenfalls mit einem Client. 2