Skriptsprache GroovyShop mit Groovy
Vorbild: Ruby
Skriptsprache Groovy
Bei der Entwicklung von Groovy lehnte sich James Strachan stark an die Konzepte von Ruby an. Die Skriptsprache für die Java-VM erweitert Java um einige nützliche Funktionen wie Maps und Closures, aber auch ein einfaches Template-System zur Erzeugung von SQL-Code. Der Workshop zeigt anhand der aktuellen Groovy-Distribution, wie Sie auf Datenbanken zugreifen und Strings verarbeiten. Als Datenbank verwenden Sie im Beispiel den kostenlosen Microsoft SQL Server 2005 Express mit der dazugehörigen Management-Konsole.
Vorarbeiten
Skriptsprache Groovy
Bevor es richtig losgeht, machen Sie zunächst Ihren Rechner Groovy-fähig. Installieren Sie das Java JDK von Sun (java.sun.com/j2se/1.5.0/download.jsp) auf Ihrem PC. Zur Entwicklung von Groovy-Anwendungen ist noch die aktuelle Distribution notwendig. Diese bekommen Sie auf der Website von Codehaus (dist.codehaus.org/groovy/distributions). Entpacken Sie die heruntergeladene Datei in ein Verzeichnis Ihrer Wahl. Damit anschließend alles ordnungsgemäß funktioniert, müssen Sie innerhalb von Windows noch einige Umgebungsvariablen hinzufügen. In der Systemsteuerung haben Sie unter System, Erweitert die Schaltfläche Umgebungsvariablen. Fügen Sie dort folgende neue Systemvariablen hinzu:
– JAVA_HOME mit dem Installationspfad Ihres JDK
– GROOVY_HOME mit dem Installationspfad Ihrer Groovy-Distribution
Für den Zugriff auf die Datenbank benötigen Sie noch einen JDBC-Treiber. Für das Projekt wird der Open-Source-JDBC-Treiber JTDS (jtds.sourceforge.net) verwendet.
Ergänzen Sie nach der Installation des Treibers die CLASSPATH-Variable um einen passenden Wert innerhalb der Umgebungsvariablen. Haben Sie noch keine CLASSPATH-Variable, so legen Sie diese als Benutzervariable an.
Nach der Festlegung der Pfade lohnt eine kurze Überprüfung, ob Windows alle Informationen richtig angenommen hat. Gehen Sie einfach in eine DOS-Box und rufen Sie den Befehl SET auf. Sie sehen hier unter anderem alle Umgebungsvariablen. Ob Sie alles richtig eingestellt und installiert haben, sehen Sie, wenn Sie auf dem bin-Verzeichnis von Groovy die Datei groovyConsole.bat aufrufen. Diese startet bei richtiger Installation die Groovy-Konsole. Sollte nach dem Aufruf der Datei nichts passieren, rufen Sie diese noch einmal über den DOS-Modus auf und kontrollieren Sie die Fehlermeldung. Meist liegt es an einer falschen Pfadeinstellung.
Die ersten Schritte
Skriptsprache Groovy
Die Syntax von Groovy ist recht ähnlich zu vielen anderen Skriptsprachen. Deswegen finden Sie hier auch nur einen kurzen Überblick über die wesentlichen Befehle von Groovy.
Das obligatorische Hello-World-Beispiel darf trotzdem nicht fehlen. Geben Sie einfach in die obere Hälfte der Groovy-Konsole
println "Hello, World!"
ein und Sie sehen in der unteren Hälfte den Ausgabestring, der durch groovy>
zusätzlich gekennzeichnet ist.
Groovy kennt zwei wichtige Datentypen: List und Map. List funktioniert im Prinzip wie ein Array unter Java und dient zur Speicherung einer geordneten Menge von Daten. Das folgende Beispiel enthält eine Liste von Integer-Werten, die im Array meine Liste gespeichert sind:
meineListe = [25,10,13,8,99,-5]
println meineListe[1]
Der Zugriff auf die einzelnen Elemente des Arrays erfolgt, wie in der zweiten Zeile des Listings gezeigt, über den Index. Als Wert wird wie erwartet die Zahl 10 ausgegeben.
Die Anzahl der Elemente, die sich in der Liste befinden, erhalten Sie über das Attribut size().
Println meineListe.size()
Ungeordnete Datenmengen, auf die per Name zugegriffen wird, verwaltet Groovy in Maps. Ein Wert in einer Map besteht aus zwei Teilen: einem Bezeichner und dessen zugeordneten Wert. Im Beispiel weisen Sie der Variablen Warenkorb mehrere Artikel und die dazugehörigen Mengen zu.
Warenkorb=["DVD-Brenner":1, "DVD-Rohlinge":10, "Einbaurahmen":1, "Nero7":1]
println Warenkorb
Auf die einzelnen Elemente des Warenkorbs kann nun entweder mit dem Namen oder mit der Variablen an sich zugegriffen werden. Die Eingabe Warenkorb gibt alle Informationen der Variablen preis, Warenkorb[?DVD-Brenner?] beispielsweise die Zahl 1.
Unterschiede
Skriptsprache Groovy
Die Handhabung von Bedingungen und booleschen Abfragen unterscheidet sich nicht wesentlich von anderen Skriptsprachen. Einen kompletten Überblick über alle Sprachelemente finden Sie auf der Seite von Codehaus (groovy.codehaus.org/User+Guide).
Eine Besonderheit hat Groovy jedoch im Vergleich zu den meisten anderen Skriptsprachen: die Fähigkeit, Programmzeilen wie Dateninformationen zu behandeln. Damit lassen sich je nach Zusammenhang unterschiedliche Befehle variabel zusammenstellen. Mit diesem Vorgehen lassen sich bei konsequenter Anwendung einige Zeilen Programmcode einsparen. Die Definition einer Funktion unterscheidet sich bei Groovy nur wenig von anderen Skriptsprachen. Quadrat etwa multipliziert die eingegebene Zahl mit sich selbst.
quadrat = { it * it }
quadrat(9)
Interessant wird es erst im nächsten Schritt, wenn Sie vorhandene Methoden auf die Funktion anwenden. Die Methode collect beispielsweise nimmt das mitgelieferte Array und wendet darauf die angegebene Funktion an. Im Beispiel liefert die Programmzeile
[2,4,6,8].collect(quadrat)
das Ergebnis [4, 16, 36, 64] zurück. Weitere Methoden finden Sie in der Online-Dokumentation unter groovy.codehaus.org/Closures.
Eine weitere Methode ist each, die eine Gruppe von Bezeichnern und Werten mit einer Funktion verknüpft. Diese könnte beispielsweise den Warenkorb geordneter ausgeben als im ersten Beispiel.
Warenkorb=["DVD-Brenner":1, "DVD-Rohlinge":10, "Einbaurahmen":1, "Nero7":1]
printWarenkorb = { key, value -> println key + ": " + value + " Stück" }
println "Bestellzusammenfassung"
Warenkorb.each(printWarenkorb)
Zugriff aufs Dateisystem
Skriptsprache Groovy
Wenn Sie Kunden haben, die öfters bei Ihnen bestellen, aber nicht immer die Shop-Oberfläche nutzen möchten, sondern ihre Bestellung direkt über eine Datei hochladen, dann hilft der Zugriff aufs lokale Dateisystem.
Damit können Sie beliebige Dateien öffnen und auslesen:
Upl_Datei = new File("C:\\warenkorb.txt")
Ausgabe_Datei = { println "Bestellposition: " + it }
Upl_Datei.eachLine( Ausgabe_Datei )
Das Beispiel ist einfach aufgebaut und gibt die gelesenen Zeilen lediglich wieder aus. Hier lässt sich jedoch auch einfach eine Weiterverarbeitung der Informationen integrieren.
Arbeiten mit Strings
Skriptsprache Groovy
Dieses Beispiel lässt sich noch erweitern. Im vorherigen Fall ist die ausgewählte Datei lediglich ausgegeben worden. Natürlich kann sie auch einfach weiterverarbeitet werden.
Wenn Sie beispielsweise mit Ihren Kunden vereinbart haben, dass die Datei einen festen Aufbau hat und der erste Wert einer Zeile immer der Artikel ist, der zweite die Anzahl und beide durch einen Doppelpunkt getrennt sind, ist eine Automatisierung einfach möglich.
Upl_Datei = new File("C:\\warenkorb.txt")
Verarbeitung_Datei = {
stringBest = it
Best_Array = stringBest.split(":")
Artikel = Best_Array[0]
Anzahl = Best_Array[1]
println Artikel + ": " + Anzahl + " Stück"
}
Upl_Datei.eachLine( Verarbeitung_Datei )
Die Methode split() sucht sich das Trennzeichen und weist die entstandenen Werte anschließend dem Array Best_Array zu. Auf dieses greifen Sie per Index zu und verarbeiten die gelesenen Daten.
Weitere Methoden zur Verarbeitung von Strings finden Sie bei Codehaus unter docs.codehaus.org/display/GROOVY/Strings.
Datenbank via JDBC
Skriptsprache Groovy
Der Open-Source-JDBC-Datenbanktreiber JTDS kann eine Verbindung entweder zu einem MS-SQL-Server oder einem Sybase-SQL-Server herstellen. Da Microsoft seinen SQL-Server als Express-Version (www.microsoft.com/germany/msdn/vstudio/express) kostenlos zur Verfügung stellt, wird dieser für die folgenden Beispiele genutzt. Die Anpassungen des Codes für den Sybase-Server finden Sie auf der Seite des JTDS-Projekts (jtds.sourceforge.net/faq.html) beschrieben.
Als Erstes muss die Datenbankverbindung zwischen Groovy und dem SQL-Server eingerichtet werden. Die Zeile
import groovy.sql.Sql
lädt die notwendigen Java-Bibliotheken. Im nächsten Schritt wird eine Verbindung zur SQL-Datenbank hergestellt.
Die Variable meineDBVerbindung repräsentiert dabei die Instanz, die bei den folgenden SQL-Querys als Zugriff genutzt wird.
meineDBVerbindung = Sql.newInstance("jdbc:jtds:
sqlserver://192.168.2.19/meineDB; "username", "password",
"net.sourceforge.jtds.jdbc.Driver")
Das Ganze sieht ein wenig unübersichtlich aus. Deshalb die wichtigsten Parameter hier noch einmal in Kürze. Die Minimalausprägung des Befehls lautet jdbc:jtds::///;,
. Die einzelnen Variablen haben folgende Bedeutung:
– Server_Type: Unterscheidung zwischen SQL- und Sybase-Server
– Server: Der Name beziehungsweise die IP-Adresse des Servers
– Database: Der Name der Datenbank auf dem Server
– User/Password: Benutzername und Passwort zum Zugriff auf die Datenbank
Die komplette Parameterliste finden Sie unter jtds.sourceforge.net/faq.html#driverImplementation.
Datenbankzugriff
Skriptsprache Groovy
Nun gilt es, Werte aus der Datenbank auszulesen und Datensätze auf den SQL-Server zu schreiben. In Groovy SQL lassen sich recht einfach Variablen integrieren, über die Sie Werte aus den einzelnen Tabellen lesen und schreiben können.
Für die Beispiele nutzen Sie die Datenbank Shop, die bereits rudimentäre Strukturen für Kunden und eine kleine Artikeldatenbank enthält. Die Verbindung wird wie folgt hergestellt:
import groovy.sql.Sql
sql = Sql.newInstance("jdbc:jtds:sqlserver://localhost/shop?, "user", "password", "net.sourceforge.jtds.jdbc.Driver")
Für den korrekten Zugang ersetzten Sie bitte user und password durch die für Sie zutreffenden Werte.
Eine Liste aller Produkte mit Preis bekommen Sie über die SQL-Abfrage
sql.eachRow("select * from Artikel", { println "${it.Nummer} ? $(it.Name) ? Preis: $(it.Preis)"} );
Auch das Einfügen neuer Kunden funktioniert einfach über den SQL-Insert-Befehl. Die Kundeninformationen Vorname und Name sind in der Tabelle Kunde gespeichert.
Vorname = "Thomas"
Nachname = "Maier"
sql.execute("insert into Kunde (Vorname, Nachname) "+ " values ('${Vorname}', ${Nachname})")
Nach dem Verkauf eines Produkts sollte der Lagerbestand natürlich angepasst werden, damit auch die nächsten Kunden wieder aktuelle Werte erhalten. Dazu ist ein Zugriff auf die Tabelle Bestand mit einem Update-Befehl notwendig. Davor muss allerdings erst noch die aktuelle Anzahl des Lagerbestands ermittelt werden.
artikel = 4711
wert = sql.execute("select Anzahl from Bestand where Nummer = ?", [artikel])
sql.executeUpdate("update bestand set anzahl = ? where nummer=?", [wert,artikel])
Grafisch ist groovy
Skriptsprache Groovy
Natürlich gibt es auch ein Leben außerhalb der Groovy-Konsole. Es gibt inzwischen etliche Groovy-Plug-ins für Entwicklungsumgebungen, unter anderem für Ecplise oder JEdit. Damit generieren Sie dann aus der IDE heraus Java-Bytecode. Dies ist auch über die Kommandozeile möglich, wenn Sie keine IDE einsetzen möchten.
Mit der Groovy-Distribution kommt auch ein Compiler namens Groovyc, der sich im Verzeichnis bin befindet. Mit Groovyc können Sie ähnlich zu Javac Java-Bytecode erzeugen.
Alternativ nutzen Sie Groovy auch innerhalb von Java als integrierte Anwendung. Mehr dazu finden Sie online unter groovy.codehaus.org/Embedding+Groovy.
Alle Dateien und Listings zum Workshop finden Sie auf der Heft-CD und unter listings.internet-pro.de.