• Scaffolding, DomainKlassen, Controller, Datenbindung, Views • URL-Mappings • Mehrsprachigkeit und Internationalisierung • Ajax • GORM: Groovy ObjectRelational Mapping • Deklarative Transaktionen mit Grails-Service • Integration von Grails in bestehende Systeme • Plugin-Entwicklung • Sicherheit • Webservices • Spring • Legacy-Integration mit Hibernate • Grundlagen von Groovy • Kapitel zum Download im Internet: Webflows erstellen Den Sourcecode sowie ein zusätzliches Kapitel finden Sie zum kostenlosen Download im Internet unter www.it-fachportal.de/5094. Grails liefert die Antworten auf die lange Suche nach besseren Alternativen in der Java-Welt in Form eines Frameworks, das die üblichen Probleme beim Entwickeln von Webapplikationen unaufdringlich und elegant löst. Wenn Framework und Programmiersprache für Ihr Projekt auf Basis der Java-Plattform frei zu wählen sind, kann Ihnen Grails Funktionen bieten, die Sie in keinem anderen Framework finden werden. Dieses Buch liefert Ihnen alle Informationen, die Sie benötigen, um sofort produktiv zu arbeiten. ISBN 978-3-8266-5937-9 Mit diesem Buch erhalten Sie ein umfassendes Praxis-Handbuch zu Grails. Angefangen bei den Basiskonzepten bis hin zu fortgeschrittenen Anwendungen und Themen lernen Sie das beeindruckende Spektrum und die Stärken von Grails kennen. Trotz der umfangreichen Funktionalitäten sind die Lösungen einfach – und beim Durcharbeiten der Beispiele lernen Sie nebenbei vielleicht eine ganz neue Methode für die Entwicklung von Webanwendungen kennen. Sie lernen unter anderem, wie Sie mit Groovy und Grails schnell Prototypen von Anwendungen, dynamische TagLibraries und Rich Domain Models erstellen und wiederverwendbare Services anbieten können. So können Sie sich auf das Wichtige konzentrieren: die Geschäftslogik Ihrer Anwendungen. ISBN 978-3-8266-5548-7 Mit diesem Buch werden Sie ein begeisterter GrailsAnhänger und -Profi! Diese deutsche Übersetzung des englischen Standardwerkes zu Grails wurde vollständig auf die neue Version 1.2 aktualisiert. Über die Autoren: Graeme Keith Rocher ist Software-Ingenieur und Leiter der Grails-Entwicklung bei SpringSource, dem Unternehmen hinter dem Spring-Framework, auf dem Grails aufbaut. In seiner gegenwärtigen Rolle leitet Graeme Rocher die laufende Entwicklung des Grails-Frameworks und ist für dessen Produktstrategie und Innovation verantwortlich. Jeff Brown ist Software-Ingenieur bei SpringSource und Mitglied des Groovy- und Grails-Entwicklungsteams. 5094_Grails_2_U4_RS_korr2.indd 1 Das produktive Web-Framework für die Java-Plattform Insiderwissen aus erster Hand von Grails-Entwicklern Internationalisierung, Ajax, GORM, Plugins, Sicherheit, Webservices Einsatz von Spring und Hibernate ISBN 978-3-8266-5898-3 Regalsystematik: (Web)Programmierung (D) 17x24cm Grails 1.2 Basiswissen, Konzepte, Architektur ISBN 978-3-8266-5094-9 ISBN 978-3-8266-5094-9 Probekapitel und Infos erhalten Sie unter: [email protected] www.it-fachportal.de Graeme Rocher • Jeff Brown Fachkorrektur von Marc-Oliver Scheele Außerdem zum Thema: Grails 1.2 • Basiswissen, Konzepte und Architektur von Grails Lernen Sie von dem Projektgründer und dem Key-Committer, wie Sie mit Grails – das leichtgewichtige Open-Source Web Application Framework auf Basis von Groovy – erfolgreich leistungsfähige Applikation für die Java-Plattform entwickeln. € 49,95 Einführung in Groovy Graeme Rocher Jeff Brown Aus dem Inhalt: 5094 0812 28,5 mm 05.02.2010 13:27:57 00_____Grails1-2_5094.book Seite 23 Freitag, 5. Februar 2010 2:26 14 Kapitel 1 Das Wesen von Grails Einfachheit ist die ultimative Perfektion. – Leonardo da Vinci Wollen Sie Grails verstehen, müssen Sie zunächst seine Ziele kennen: die Enterprise-JavaWebentwicklung erheblich zu vereinfachen, die Webentwicklung auf die nächste Abstraktionsebene zu heben, Entwicklern Funktionen zur Verfügung zu stellen, die es auf anderen Plattformen bereits seit Jahren gibt, und dabei die Flexibilität der zugrunde liegenden Technologien in aller Vielfalt und Reife zu bewahren. Schreiben Sie mühselig zahlreiche, lahmlegende XML-Konfigurationsdateien? Quälen Sie sich mit einem Buildsystem, das einfache Änderungen nicht in wenigen Sekunden, sondern in langen Minuten testet? Mit Grails macht die Entwicklung auf der Java-Plattform wieder Spaß. Es reißt Barrieren nieder und gibt Benutzern Zugriff auf APIs, damit Sie sich allein auf Ihre Geschäftsprobleme konzentrieren können. Keine Konfiguration, kein Overhead, sofortiger Turnaround. Wie ist das möglich? Grails nutzt bewährte Konzepte wie etwa Convention over Configuration (CoC, Konvention statt Konfiguration), Don’t Repeat Yourself (DRY, Wiederhole dich nicht) und sinnvolle Defaults, die mit der knappen Groovy-Sprache und mehreren domänenspezifischen Sprachen (DSLs) realisiert werden, die Ihnen die Arbeit erleichtern. Als angehender Grails-Entwickler kommt Ihnen dies vielleicht wie Schummelei vor. Sollten Sie nicht mehr Mühe haben? Schließlich können Sie zwei Stunden hartes Körpertraining auch nicht in zwanzig Minuten zusammenquetschen, oder? Wo ist der Haken? Als Entwickler können Sie sicher sein, auf den Schultern von Giganten zu stehen, denen wir die Technologien verdanken, die Grails zugrunde liegen: Spring, Hibernate und natürlich die Java-Plattform. Grails realisiert die besten Funktionen aus Frameworks in dynamischen Sprachen, wie Ruby on Rails, Django oder TurboGears, für die Java Virtual Machine (JVM). 1.1 Einfachheit und Power Grails hebt sich von Konkurrenzprodukten deutlich durch sein Design ab. Grails versucht nicht, das Rad neu zu erfinden, sondern greift auf bewährte Frameworks wie Spring und Hibernate zurück. So kann es arbeitserleichternde Funktionen liefern, ohne dafür Robustheit zu opfern. Grails basiert auf einigen der in ihren Kategorien beliebtesten Open-SourceTechnologien: 쐽 Hibernate: De-facto-Standard für Objekt-relationales Mapping (ORM) in der Java-Welt 쐽 Spring: Sehr beliebter Inversion of Control (IoC) Container und Wrapper-Framework für Java 쐽 SiteMesh: Ein robustes und stabiles Layout-Framework © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 23 00_____Grails1-2_5094.book Seite 24 Freitag, 5. Februar 2010 2:26 14 Kapitel 1 Das Wesen von Grails 쐽 Tomcat: Ein bewährter und weit verbreiteter Servlet-Container 쐽 HSQLDB: Eine reine Java-Implementierung eines relationalen Datenbankmanage- ment-Systems (RDBMS). NEU in 1.2 Hinweis Bis einschließlich Version 1.1 wurde Grails mit dem Jetty-Servlet-Container ausgeliefert. Da die Grails-Anwendungen im Produktivbetrieb jedoch meist auf dem Tomcat-Server laufen, wird nun folgerichtig auch während der Entwicklung standardmäßig auf Tomcat gesetzt. Nutzer, die Jetty für die Entwicklung von Grails-Applikationen bevorzugen, können über folgende Kommandos Tomcat deinstallieren und Jetty wieder als integrierten Servlet-Container zum Standard machen: grails uninstall-plugin tomcat grails install-plugin jetty Die Konzepte von ORM und IoC sind für einige Leser vielleicht neu. ORM ist einfach eine Methode, um Objekte aus der objektorientierten Welt Tabellen einer relationalen Datenbank zuzuordnen. ORM ist zusätzliche Abstraktion über SQL, die es Entwicklern ermöglicht, über ihr Domain-Modell nachzudenken, statt sich mit SQL herumzuschlagen. Mit IoC können Objekte so verknüpft werden, dass ihre Dependencies zur Laufzeit bereitstehen. So müssen etwa persistente Objekte gespeichert oder aus einer Datenquelle abgerufen werden. IoC nimmt dem Entwickler die Aufgabe ab, die erforderliche Datenquelle zu referenzieren. Doch diese Konzepte sind im Moment nicht so wichtig. Sie werden später ausführlicher erläutert. Sie profitieren von Grails, weil es diese Frameworks mit der Groovy-Sprache durch eine weitere Abstraktionsschicht einhüllt. Als Entwickler bemerken Sie nicht, dass Sie eine Springund Hibernate-Anwendung erstellen. Sie werden bestimmt keine einzige Hibernate- oder Spring-XML-Zeile schreiben; aber sie ist da, falls Sie sie brauchen. Abbildung 1.1 zeigt das Verhältnis von Grails zu diesen Frameworks und dem Enterprise Java Stack. Abb. 1.1: 24 Der Grails-Stack © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 00_____Grails1-2_5094.book Seite 25 Freitag, 5. Februar 2010 2:26 14 1.2 Grails, die Plattform 1.2 Grails, die Plattform Haben Sie bei Grails gedacht: »Bloß nicht noch ein Web-Framework!«? Das wäre verständlich; denn es gibt Dutzende von Web-Frameworks für Java. Doch Grails ist anders: Es ist nicht nur ein Web-Framework, sondern eine komplette Umgebung. Es ist eine Plattform mit anspruchsvollen Zielen: Es will alle Aufgaben von der View- bis hinunter zur PersistenzSchicht abdecken. Außerdem will Grails durch sein Plugin-System (siehe Kapitel 12) Probleme lösen helfen, für die es keine vorgefertigten Lösungen bereithält. Mit Grails können Sie Searching, Job Scheduling, Enterprise Messaging, Remoting und mehr implementieren. Der schiere Umfang der von Grails abgedeckten Aufgaben könnte Albträume über endlose Konfigurationssitzungen auslösen. Doch selbst bei seinen Plugins verwendet Grails Convention over Configuration und vernünftige Defaults zur Arbeitserleichterung. Sie sollten Grails nicht nur als ein weiteres Web-Framework, sondern als die Plattform betrachten, auf der Sie Ihre nächste Web-2.0-Anwendung realisieren wollen. 1.3 Leben im Java-Ökosystem Mit Grails können Sie – dank Groovy – nicht nur Ihre bekannten und beliebten Java-Frameworks nutzen, sondern auch alle Vorteile von Java und der JVM. Keine andere dynamische Sprache für die JVM ist mit Java so integriert wie Groovy. Es arbeitet per Design auf jeder Ebene nahtlos mit Java zusammen. Beginnend mit der Syntax hat es folgende weitere Ähnlichkeiten: 쐽 Die Groovy-Grammatik ist von der Java-5-Grammatik abgeleitet; deshalb ist der meiste gültige Java-Code zugleich gültiger Groovy-Code. 쐽 Groovy verwendet dieselben grundlegenden APIs wie Java; deshalb sind Ihre zuverlässi- gen Javadocs immer noch gültig! 쐽 Groovy-Objekte sind Java-Objekte. Dieses hat weitreichende Konsequenzen, die vielleicht nicht sofort deutlich werden. So kann etwa ein Groovy-Objekt java.io.Serializable implementieren und per Remote Method Invocation (RMI) versendet oder mit Session-Replication Tools in Clustern verpackt werden. 쐽 Mit dem Joint Compiler von Groovy sind zirkuläre Referenzen zwischen Groovy und Java möglich, ohne dass es zu Problemen beim Kompilieren kommt. 쐽 Mit Groovy können Sie leicht dieselben Profiling- und Überwachungs-Tools sowie alle existierenden und künftigen Java-Technologien verwenden. Die nahtlose Integration mit Java und die Java-ähnliche Syntax sind die wesentlichen Gründe für den Wirbel, der um Groovy gemacht wurde. Endlich eine Sprache mit ähnlichen Fähigkeiten wie Ruby oder SmallTalk, die direkt in der JVM lief. Das Potenzial, Java-Code mit dynamischem Groovy-Code zu kombinieren, bietet ungeahnte Möglichkeiten. Außerdem können Sie in Groovy statische und dynamische Typen mischen und so bei Bedarf die Sicherheit der statischen Typisierung mit der Leistungsstärke und Flexibilität der dynamischen Typisierung kombinieren. Die starke Integration mit Java macht Groovy immer beliebter, insbesondere bei der Entwicklung von Webanwendungen. Jede Programmierplattform drückt mit unterschiedlichen Idiomen im Wesentlichen dieselben Konzepte aus. In der Java-Welt haben wir Servlets, Filter, Tag-Bibliotheken und Java Server Pages (JSP). Bei einem Wechsel auf eine neue Platt© des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 25 00_____Grails1-2_5094.book Seite 26 Freitag, 5. Februar 2010 2:26 14 Kapitel 1 Das Wesen von Grails form müssen Sie alle diese Konzepte, ihre APIs und Idiome mehr oder weniger mühsam neu lernen. Neues zu lernen, ist an sich nicht schlecht, doch in der Praxis immer mit Kosten verbunden. Diese können ein größeres Hindernis darstellen, neue Technologien zu übernehmen, die von den Standards oder Konventionen abweichen, die auf der Java-Plattform oder in Ihrem Unternehmen definiert sind. Zusätzlich hat Java Standards für Deployment, Management, Sicherheit, Benennung und mehr. Grails will als Plattform die Essenz von Frameworks wie Rails, Django oder CakePHP mit der reifen Umgebung der Java Enterprise Edition (Java EE) und ihren APIs verknüpfen. Grails gehört jedoch zu den Technologien, die für sich selbst sprechen: Im Moment, wo Sie damit arbeiten, geht Ihnen ein kleines Licht auf. Deshalb wollen wir schnell mit der Beispielanwendung beginnen, die das Buch durchzieht: gTunes. Unser gTunes-Beispiel führt Sie schrittweise durch die Entwicklung eines Musikladens im Stile von Apple, Amazon oder Napster. Eine derartige Anwendung bietet vom E-Commerce bis RESTful-APIs und RSSoder Atom-Feeds zahlreiche interessante Möglichkeiten. Wir hoffen, dass Sie dadurch Grails und seine Funktionen gründlich kennen lernen. 1.4 Grails installieren Grails zu installieren, ist fast so einfach wie seine Anwendung, aber Sie müssen mindestens eine Voraussetzung erfüllen. Grails erfordert eine gültige Installation des Java SDK 1.5 oder neuer. Sie bekommen es bei Sun Microsystems unter http://java.sun.com. Nach der Installation des Java SDK müssen Sie die Umgebungsvariable JAVA_HOME auf den Installationsordner setzen und JAVA_HOME/bin zu Ihrer PATH-Variablen hinzufügen. Anmerkung Wenn Sie unter Mac OS X arbeiten, ist Java bereits installiert! Dennoch müssen Sie die JAVA_HOME in Ihrer ~/.profile-Datei setzen. Testen Sie Ihre Installation in einer Eingabeaufforderung mit java -version: $java -version Der Output sollte (bis auf die Versionsnummern) dem aus Listing 1.1 ähneln. java version "1.6.0_10" Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0_10-b05-237) Java HotSpot(TM) Client VM (build 1.6.0_10-119, mixed mode, sharing) Listing 1.1: Java ausführen Wie bei vielen anderen Java-Frameworks wie Apache Tomcat oder Apache Ant erfordert die Installation einige einfache Schritte: Laden Sie Grails von http://grails.org herunter; entpacken Sie die Zip-Datei in ein Verzeichnis Ihrer Wahl; erstellen Sie eine GRAILS_HOMEVariable, die auf dieses Verzeichnis zeigt; fügen Sie das GRAILS_HOME/bin-Verzeichnis in Ihre PATH-Variable ein. Testen Sie die Installation in einer Eingabeaufforderung mit grails: 26 © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 00_____Grails1-2_5094.book Seite 27 Freitag, 5. Februar 2010 2:26 14 1.5 Ihre erste Anwendung erstellen $ grails Wurde Grails erfolgreich installiert, sollte der Output des Befehls dem aus Listing 1.2 ähneln. Welcome to Grails 1.2 - http://grails.org/ Licensed under Apache Standard License 2.0 Grails home is set to: /Developer/grails-1.2 No Skript name specified. Use 'grails help' for more info or 'grails interactive' to enter interactive mode Listing 1.2: Grails ausführen Listing 1.2 sagt Ihnen, dass Sie durch Eingabe von grails help mehr über Grails erfahren können. Grails zeigt dann u.a. eine Liste der verfügbaren Befehle an. Wenn Sie zusätzlich den Namen eines Befehls angeben, erhalten Sie mehr Informationen über diesen Befehl. Das folgende Beispiel demonstriert dies für den Befehl create-app: $ grails help create-app Listing 1.3 zeigt ein Beispiel für den typischen Output des help-Befehls. Usage (optionals marked with *): grails [environment]* create-app grails create-app -- Creates a Grails application for the given name Listing 1.3: Hilfe über einen Befehl Die Befehlszeilenschnittstelle von Grails wurde mit einem anderen Groovy-basierten Projekt namens Gant (Groovy Ant Scripting; http://gant.codehaus.org/) erstellt, das das beliebte Apache-Ant-Buildsystem (http://ant.apache.org/) einkapselt und eine nahtlose Mischung von Ant Targets und Groovy-Code ermöglicht. Näheres zur Grails-Befehlszeile erfahren Sie in Kapitel 11. 1.5 Ihre erste Anwendung erstellen In diesem Abschnitt erstellen Sie Ihre erste Grails-Anwendung. Sie heißt gTunes und enthält einen einfachen Controller. Sie führen zu diesem Zweck die folgenden Schritte aus: 1. Erstellen Sie die neue Anwendung mit dem Befehl grails create-app gTunes. 2. Navigieren Sie mit dem Befehl cd gTunes in das gTunes-Verzeichnis. 3. Erstellen Sie mit dem Befehl grails create-controller store einen Storefront-Controller. 4. Schreiben Sie Code, um den Benutzer mit einer Meldung zu begrüßen. 5. Testen Sie Ihren Code mit grails test-app. 6. Führen Sie die Anwendung mit grails run-app aus. © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 27 00_____Grails1-2_5094.book Seite 28 Freitag, 5. Februar 2010 2:26 14 Kapitel 1 Das Wesen von Grails 1.5.1 Schritt 1: Die Anwendung erstellen Einfach? Zweifellos! Zunächst führen Sie den Befehl create-app aus, den Sie aus dem vorigen Abschnitt kennen. Geben Sie den Befehl wie folgt in ein Befehlsfenster ein: $ grails create-app Wenn Sie (¢) drücken, fordert Grails Sie auf, einen Projektnamen einzugeben (siehe Listing 1.4). Geben Sie dann gTunes ein und drücken Sie (¢). Alternativ können Sie auch direkt grails create-app gTunes eingeben. Dann führt Grails automatisch die entsprechenden Aktionen aus. Running script /Developer/grails-dev/GRAILS_1_2/scripts/CreateApp_.groovy Environment set to development Application name not specified. Please enter: gTunes Listing 1.4: Eine Anwendung mit dem Befehl create-app erstellen Grails erstellt automatisch eine Grails-Anwendung namens gTunes mit allen erforderlichen Verzeichnissen. Im nächsten Schritt navigieren Sie im Befehlsfenster zu der neuen Anwendung: cd gTunes Abb. 1.2: Die gTunes-Anwendungsstruktur An diesem Punkt haben Sie eine neue saubere Grails-Anwendung mit sämtlichen Standardeinstellungen. Abbildung 1.2 zeigt einen Screenshot der Verzeichnisstruktur der Anwendung. Sie werden die Struktur einer Grails-Anwendung und die Aufgaben der verschiedenen Dateien und Verzeichnisse im Laufe dieses Buches näher kennen lernen. Beachten Sie jedoch, dass Grails Verzeichnisse für Controller, Domain-Objekte (Models) und Views erstellt hat. 28 © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 00_____Grails1-2_5094.book Seite 29 Freitag, 5. Februar 2010 2:26 14 1.5 Ihre erste Anwendung erstellen 1.5.2 Schritt 2: Einen Controller erstellen Grails ist ein MVC-Framework, das heißt, es arbeitet mit Models, Views und Controllern, um die Concerns (Aufgaben- oder Verantwortungsbereiche) sauber zu trennen. Viele WebFrameworks trennen mit dem MVC Pattern (Model View Controller Pattern) Benutzerschnittstelle und Geschäftslogik (siehe Wikipedia, http://de.wikipedia.org/wiki/ Model_View_Controller). Controller sind zentrale Komponenten einer Grails-Anwendung, die den Verkehr der Anfragen und Antworten zwischen den Views und den Models steuern. Weil die gTunes-Anwendung einen Online-Musikladen nachbildet, nennen wir unseren Controller store (Laden). Grails hilft Ihnen mit mehreren Befehlen, passende Klassen für die verschiedenen Bereiche einer Grails-Anwendung zu erstellen, etwa mit dem create-controller-Befehl einen Controller. Doch Sie müssen diese Befehle nicht verwenden. Wenn Sie die verschiedenen Konzepte in Grails besser kennen, können Sie eine Controller-Klasse genauso leicht mit einem Texteditor Ihrer Wahl oder einer integrierten Entwicklungsumgebung (IDE) erstellen. Hier wollen wir jedoch den create-controller-Befehl verwenden. Er hat wie createapp, ein Argument, mit dem Sie den Namen des gewünschten Controllers spezifizieren können: $ grails create-controller store Lehnen Sie sich zurück, während Grails den Rest erledigt. [copy] Copying 1 file to /Developer/grails-dev/gTunes/grails-app/controllers Created Controller for Store [mkdir] Created dir: /Developer/grails-dev/gTunes/grails-app/views/store [copy] Copying 1 file to /Developer/grails-dev/gTunes/test/unit Created ControllerTests for Store Listing 1.5: Einen Controller mit dem Befehl create-controller erstellen Grails erstellt mit dem create-controller-Befehl zwei Klassen: einen neuen Controller namens StoreController im grails-app/controllers-Verzeichnis und einen zugehörigen Testfall im test/unit-Verzeichnis (siehe Abbildung 1.3). Weil Groovy dynamisch arbeitet, sollten Sie in jedem Grails-Projekt eine möglichst umfassende Code Coverage oder Test Coverage (Code- oder Test-Abdeckung) anstreben. Code Coverage ist ein Maß aus dem Software-Testing. Es beschreibt, zu welchem Grad der Sourcecode eines Programms getestet worden ist. Grails generiert zu jedem Controller automatisch einen Test. Dynamische Sprachen wie Groovy, Ruby und Python werden längst nicht so stark vom Compiler unterstützt wie statisch typisierte Sprachen wie etwa Java. Einige Fehler, die in diesen Sprachen zur Compile-Zeit entdeckt werden, bleiben bei dynamischen Sprachen bis zur Laufzeit im Code, darunter auch die Methoden-Resolution. Doch was Sie in dynamischen Sprachen an Compiler-Unterstützung verlieren, wird durch deren Ausdrucksstärke ausgeglichen. © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 29 00_____Grails1-2_5094.book Seite 30 Freitag, 5. Februar 2010 2:26 14 Kapitel 1 Das Wesen von Grails Der neu erstellte StoreController Abb. 1.3: Leider verführt der Komfort des Compilers Java-Entwickler oft dazu, das Testen ganz zu vergessen. Doch natürlich ist der Compiler kein Ersatz für geeignete Unit-Tests. In diesem Buch werden wir immer wieder die automatisierten Testverfahren demonstrieren, mit denen Sie von Grails unterstützt werden. 1.5.3 Schritt 3: Eine Meldung ausgeben Zurück zu dem StoreController. Standardmäßig erstellt Grails den Controller und definiert für ihn eine einzige Action namens index. Sie ist per Konvention die Standardaction des Controllers. Listing 1.6 zeigt den StoreController mit seiner standardmäßigen indexAction. class StoreController { def index = {} } Listing 1.6: Die standardmäßige index-Action Die index-Action scheint nicht viel zu tun; doch per Konvention weist ihre Deklaration Grails an, automatisch eine View namens grails-app/views/store/index.gsp darzustellen. Views werden erst in Kapitel 5 behandelt. Deshalb wollen wir hier zwecks Einfachheit etwas weniger Anspruchsvolles versuchen. Grails’ Controller verfügen über mehrere implizite Methoden (siehe Kapitel 4), darunter render, eine Mehrzweckmethode, die unter anderem einfache textuelle Antworten darstel- len kann. Listing 1.7 zeigt, wie Sie die einfache Meldung »Willkommen im gTunes-Store!« ausgeben können. class StoreController { def index = { render "Welcome to the gTunes store!" 30 © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 00_____Grails1-2_5094.book Seite 31 Freitag, 5. Februar 2010 2:26 14 1.5 Ihre erste Anwendung erstellen } } Listing 1.7: 1.5.4 Eine Meldung mit der render-Methode ausgeben Schritt 4: Den Code testen Der voranstehende Code ist einfach genug, doch selbst der einfachste Code sollte getestet werden. Öffnen Sie die Testsuite StoreControllerTests.groovy, die weiter vorne im Verzeichnis test/unit generiert worden ist. Listing 1.8 zeigt einen Ausschnitt aus dieser Datei. class StoreControllerTests extends grails.test.ControllerUnitTestCase { void testSomething() { } } Listing 1.8: Ausschnitt aus der generierten Testsuite StoreControllerTests.groovy In Grails werden Tests in Unit-Tests und Integrationstests unterteilt. Integrationstests ziehen die gesamte Umgebung einschließlich der Datenbank hoch und laufen deshalb meist langsamer. Außerdem sollen sie normalerweise die Interaktion zwischen mehreren Klassen testen. Deshalb muss Ihre Anwendung kompletter sein, bevor Sie sie ausführen können. Dagegen laufen Unit-Tests schneller, erfordern aber mehr Mocks und Stubs. Stubs sind Klassen, die beim Testen echte Methoden simulieren, indem sie beliebige fest einprogrammierte Werte zurückgeben. Mocks machen im Wesentlichen dasselbe, verfügen aber zusätzlich über »Erwartungen«. So kann etwa ein Mock spezifizieren, dass es »erwartet«, dass eine bestimmte Methode wenigstens einmal (oder, falls erforderlich, zehn Mal) aufgerufen wird. Im weiteren Verlauf des Buches wird der Unterschied zwischen Unit-Tests und Integrationstests klarer werden. Um den StoreController in seinem gegenwärtigen Status zu testen, können Sie den Wert der Antwort zusichern, die an den Benutzer gesendet wurde (siehe zum Beispiel Listing 1.9). class StoreControllerTests extends grails.test.ControllerUnitTestCase { void testRenderHomePage() { controller.index() assertEquals "Welcome to the gTunes store!", controller.response.contentAsString } } Listing 1.9: Die index-Action von StoreController testen Hier wird mit einer eingebauten Testfunktion von Grails der Inhalt des response-Objekts geprüft. Bei einem Test wandelt Grails das normale HttpServletResponse-Servlet-Objekt in ein Spring-Objekt namens MockHttpServletResponse um, das über Hilfs-Properties wie contentAsString verfügt, mit denen Sie das Ergebnis eines Aufrufs der renderMethode prüfen können. Dennoch sollten Sie sich noch nicht zu viele Gedanken über diesen Code machen. Das Buch enthält zahlreiche Beispiele, die Sie mit dem Testen in Grails zunehmend vertrauter machen. © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 31 00_____Grails1-2_5094.book Seite 32 Freitag, 5. Februar 2010 2:26 14 Kapitel 1 Das Wesen von Grails 1.5.5 Schritt 5: Die Tests ausführen Mit dem Befehl grails test-app können Sie die Tests ausführen und prüfen, ob alles erwartungsgemäß funktioniert. Der Befehl führt alle Tests in der Anwendung aus und gibt die Ergebnisse im Verzeichnis test/reports aus. Mit dem Befehl grails test-app StoreController können Sie außerdem die StoreControllerTests selektiv ausführen. Listing 1.10 zeigt einen typischen Output einer Ausführung des test-app-Befehls. ------------------------------------------------------Running 1 unit test... Running test StoreControllerTests...PASSED Tests Completed in 703ms ... ------------------------------------------------------Tests passed: 1 Tests failed: 0 ------------------------------------------------------Tests passed. View reports in /Developer/grails-dev/gTunes/test/reports Listing 1.10: Tests mit grails test-app ausführen Die Reports werden als XML-, HTML- und einfache Textdateien im Verzeichnis test/ reports gespeichert. Abbildung 1.4 zeigt den generierten HTML-Report in einem Browser – er ist definitiv besser lesbar als das XML-Gegenstück! Abb. 1.4: Generierter HTML-Testreport Hinweis Falls Sie in Ihren Tests Logging-Ausgaben produzieren, erscheinen diese standardmäßig nicht im Output auf der Konsole (im JUnit-Report können Sie eingesehen werden). Um die Ausgaben auf der Konsole verfolgen zu können, rufen Sie den Test mit folgenden Parametern auf: grails test-app -echoOut -echoErr 32 © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 NEU in 1.2 00_____Grails1-2_5094.book Seite 33 Freitag, 5. Februar 2010 2:26 14 1.5 Ihre erste Anwendung erstellen 1.5.6 Schritt 6: Die Anwendung ausführen Nachdem Sie den Code getestet haben, können Sie das Programm mit dem Befehl grails run-app ausführen, der standardmäßig bei Port 8080 einen lokalen Grails-Server startet. Grails verwendet standardmäßig den verbreiteten und robusten Tomcat (http://tomcat.apache.org) Container als Server, aber natürlich können Sie Grails in jedem ServletContainer ab Version 2.4 oder neuer deployen. (Deployment wird in Kapitel 11 behandelt.) Führen Sie das Programm wie folgt aus: $ grails run-app Grails startet und zeigt dann einen URL an, über den Sie auf die Grails-Instanz zugreifen können. ... Environment set to development Running Grails application… Server running. Browse to http://localhost:8080/gTunes Listing 1.11: Eine Anwendung mit run-app ausführen Wird ein Bind-Error wie der Folgende angezeigt, liegt wahrscheinlich ein Port-Konflikt vor: Server failed to start: java.net.BindException: Address already in use Dieser Fehler tritt normalerweise auf, wenn bereits ein weiterer Container, wie etwa Jetty (http://www.mortbay.org), an Port 8080 läuft. Sie können dieses Problem umgehen, indem Sie Grails an einem anderen Port ausführen, indem Sie mit dem server.port-Argument einen alternativen Wert übergeben: grails -Dserver.port=8087 run-app In diesem Fall wird Grails dann an Port 8087 gestartet. Abgesehen von Port-Konflikten sollte Grails jetzt laufen und bereit sein, Anfragen zu verarbeiten. Öffnen Sie Ihren Lieblings-Browser und navigieren Sie zu dem URL, der Ihnen von Grails’ run-app-Befehl in Listing 1.11 angezeigt wird. Sie sollten zunächst die Grails-Begrüßungsseite sehen (siehe Abbildung 1.5). Der Begrüßungsbildschirm wird standardmäßig mit einer Groovy-Server-Pages-Datei (GSP-Datei; im Verzeichnis grails-app/views/index.gsp) angezeigt, aber Sie können den Speicherort dieser Datei durch URL-Mappings ändern (siehe Kapitel 6). In Abbildung 1.5 werden die verfügbaren Controller angezeigt, darunter der weiter vorne erstellte StoreController. Wenn Sie diesen Link anklicken, wird eine Seite mit der weiter vorne implementierten Meldung »Willkommen im gTunes-Store!« angezeigt (siehe Abbildung 1.6). © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094 33 00_____Grails1-2_5094.book Seite 34 Freitag, 5. Februar 2010 2:26 14 Kapitel 1 Das Wesen von Grails Abb. 1.5: Die Standardbegrüßungsseite von Grails Abb. 1.6: StoreController gibt 1.6 eine Meldung aus. Zusammenfassung Erfolg! Ihre erste Grails-Anwendung läuft. In diesem Kapitel haben Sie die ersten Schritte unternommen, um Grails zu lernen, indem Sie Grails installiert und eingerichtet haben. Außerdem haben Sie Ihre erste Grails-Anwendung mit einem einfachen Controller erstellt. Als Nächstes erfahren Sie, wie Sie mit Grails schnell neue Projekte anstoßen können. Danach lernen Sie, wie Sie mit Grails prototypische CRUD-Funktionen (Create, Read, Update, Delete) generieren können, die Sie dann ausbauen können. 34 © des Titels »Grails 1.2« (ISBN 978-3-8266-5094-9) 2010 by Verlagsgruppe Hüthig Jehle Rehm GmbH, Heidelberg Nähere Informationen unter: http://www.it-fachportal.de/5094