DOAG SIG Java: Grails und Oracle Rapid Web Application Development mit Grails und Oracle Referent: Frank Szilinski Firmenvorstellung Kernkompetenzen esentri Strategieberatung Projektmanagement Technologie 2 Java/SOA Software Solutions Open Source Oracle RIA Technologie Portfolio 3 Ziele des Vortrags Rapid Web Application Development mit Grails und Oracle Overview Technology-Stack Wo gehört das Framework hin? Groovy und Grails Einblick in die Sprache Groovy und das Framework Grails Grails und Oracle Zusammenspiel Datenbank, Grails und WebLogic Real-Life Plug-In, Integration, Einsatzgebiete, Conclusion 4 Trends – Groovy und Grails 5 Was ist Groovy? 2003 gestartet 2004 als JSR-241als Standard aufgenommen 2007 Release 1.0 2007 Jax Innovation Award 2010 Release 1.7.1 6 Basis für Grails Allzweck-Programmiersprache für die JVM Ausdrucksstärke von Ruby, Lisp und Python Stabile, funktionsreiche Sprache Objektorientiert Template Mechanismen Was ist Grails? 2005 gestartet 2006 Release 0.1 2008 Release 1.0 2008 Februar Das Unternehmen Groovy Grails wurde von SpringSource gekauft 2008 November SpringSource wird von VMWare übernommen aktuell Release 1.2.2 7 Was ist Grails? 8 Web Application Development Plattform Rapid Getting things done Open Source keine Lizenzkosten Full-stack MVC Framework JVM als Laufzeitumgebung Nahtlose Java Integration Ausführbar in diversen Containern Deckt den JEE Development Cycle ab Verbindet bewährte OSS Frameworks wie Spring, Hibernate, Sitemesh, HSQLDB, Quartz Code Debug Compile Test Package Deploy Vergleichbare Frameworks* Application Development Framework 9 Grails Framework Grails Hibernate Java Language Sitemesh Java Development Kit (JDK) Java Virtual Machine 10 JEE Groovy Spring Integrated Development Environments SpringSource ToolSuite Grails-Nature Code-Completion Grails Aktionen über Kommandozeile Eclipse Bisher keine Integration Oracle JDeveloper Grails Aktionen über konfigurierbare externe Tools Oracle NetBeans Grails Integration in Projektbaum Automatische Generierung und Konfiguration Code-Completion Bester Support 11 Demo Teil I Scaffolding Sample 12 Grails Einflussfaktoren Scaffolding und templating Rock-solid foundations Java Integration Agiles Vorgehen Convertion over Configuration 13 Incredible wetware Grails Produktivitäts Ethos Begriffe = Best Practices Scaffolding Gerüst um die notwendigsten CRUD Operationen, Controller und Views eines Domain-Objects generieren zu lassen Convention over configuration (CoC) Ein Entwickler kann sich darauf verlassen, dass ein Standardverhalten ohne Konfiguration erreicht wird, was jedoch angepasst werden kann, falls dies notwendig ist Don‘t repeate yourself (DRY) Redundanzen, Mehrfachkonfiguration und Copy&Paste vermeiden Default is what you expect (DIWYE) Das Verhalten und die Standards sind so definiert, wie ein Entwickler es erwarten würde Domain-driven-Development (DDD) Die Domain ist die treibende Kraft 14 Der Einstieg in Groovy Groovy ist eine... 1. dynamische 2. Scriptsprache Quelle: Bild: http://www.pedantique.org/2010/02/14/life-on-the-jvm/ 15 Groovy Interpreter Groovy Groovy Source 16 compile (groovy) Java ByteCode execute (Class Loader) Der Einstieg in Groovy Erfahrener Entwickler spart mit Groovy gegenüber Java 40-60% Quellcode und benötigt nur ⅓ der Zeit Kann mit Java vermischt werden Wird in Java ByteCode übersetzt Groovy Klasse = Java Klasse Groovy Servlets und Templates bieten optimale Voraussetzung zur Erstellung nicht nur von Webseiten Viele neue Sprachfeatures wie GPath GString Internal iterations Closures Meta Object Protocol (MOP) Dynamics/Expandos, Kategorien, Metaclass, AST Transformations 17 Die Sprache Groovy Beispiel 1 Parse alle Dateien rekursiv unterhalb des Verzeichnisses „aFolder“, die mit „TAG“ enden und prüfe die Gültigkeit und Wohlgeformtheit dieser Dateien: im Terminal groovy -e 'new File(“aFolder").eachFileRecurse{ f -> if (!f.isDirectory() && f.name.endsWith(“TAG")){ new XmlParser().parse(f)}}' 18 Die Sprache Groovy Beispiel 2 Java ((Date)getAttribute("PromotionDate")).compareTo((Date)getAttribute("HireDate")) > 0 Groovy PromotionDate > HireDate Beispiel 3 Java ((Number)getAttribute("Salary").multiply(new Number(0.10)) Groovy Salary * 0.10 19 Die Sprache Groovy Beispiel 4 Java List names = new ArrayList(); for (Iterator iterator = people.iterator(); iterator.hasNext();) { Person person = (Person) iterator.next(); names.add(person.getName()); } System.out.println(names); Groovy def names = people*.name println names 20 Die Sprache Groovy Beispiel 5 Java try { // Create a URL for the desired page URL url = new URL("http://hostname:80/index.html"); // Read all the text returned by the server BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; StringBuffer sb = new StringBuffer(); while ((str = in.readLine()) != null) { sb.append(str); } in.close(); } catch (MalformedURLException e) { } catch (IOException e) { } System.out.println(sb.toString()); Groovy def text = new URL("http://hostname:80/index.html").text println text 21 Die Sprache Groovy Beispiel 6: Closures def adder = {a,b -> a+b } assert 3 == adder.call(1,2) def multiplier = {a,b -> a*b } assert 2 == multiplier(1,2) def map = {a,b,f -> f(a,b) } assert 3 == map(1,2,adder) 22 Die Sprache Groovy Beispiel 7: Expandos coach = new Expando() coach.firstName = "Louis" coach.lastName = "Van Gaal" coach.victories = 148 coach.matchWon = { coach.victories++; } coach.matchWon() assert coach.victories == 149 23 Grails Architektur Dojo Acegi Grails Prototype Quarz JUnit ... Canoo WebTest Yahoo UI Flex Groovy Spring Hibernate Java 24 Sitemesh Grails Integration Presentation Geschäftslogik GSP Controller Grails DispatcherServl et Service Domain Enterprise Services Remote Services 25 Integratio n GORM Client Data Grails MVC Paradigma Aufruf von Client: http://localhost/bookapp/Book/show class BookController { def show = { ["books": Book.list ] } } Controller class Book { String title Author author String ISBN BigDecimal price def belongsTo = Author } Model 26 <html> <head> <title> Book list </title> </head> <body> <h1> Book list </h1> <table> <tr> <th> Title </th> <th> Author </th> </tr> <g:each in=" ${ books } "> <tr> <td> ${ it.title } </td> <td> ${ it.author } </td> </tr> </g:each> </table> </body> </html> View Grails GORM GORM = Groovy Object-Relational Mapping Basis für GORM ist Hibernate, kann aber durch Plug-Ins beliebige ausgetauscht werden Persistence Management ist ohne Konfiguration verfügbar Domain Klassen haben durch Konvention automatisch Methoden find findAll get count list ... Zugriff über dynamische Finder-Methoden class User { String login String firstName String lastName String role } User.findByLastNameAndFirstName('Szilinski', 'Robert') User.findByFirstNameLike('Sz%') 27 Grails GORM Automatische Instanzmethoden user.save(), user.validate(), user.update(), user.delete() Uni- und Bi-Direktionale Beziehungen id, version, equals, hashCode, toString von Grails generiert Domain-Klasse und anwendungsspezifisch Validatoren class Author { String firstName String lastName class Book { String title Author author Publisher publisher def hasMany = [books : Book] static constraints={ firstName( blank:false) lastName( blank:false) } } 28 def belongsTo = [author:Author] } class Publisher { String name def hasMany = [books:Book] } Grails DataSource - Oracle Datenbanken dataSource { pooled = true driverClassName = "oracle.jdbc.driver.OracleDriver" username = "xeuser" password = "xepass" dialect = "org.hibernate.dialect.Oracle9Dialect" } hibernate { cache.use_second_level_cache=true cache.use_query_cache=true cache.provider_class='net.sf.ehcache.hibernate.EhCacheProvider' } environments { development { dataSource { dbCreate = "update" url = "jdbc:oracle:thin:@myXEDatabase:1521:XE" } } test { ... } production { ... } } 29 Grails und Groovy Server Pages (GSP) Meta Tags in den HTML-Dateien oder per Konvention angeben Konvention: Decorator in entsprechende Verzeichnisse legen DecoratorMapper Beispielsweise PrintDecoratorMapper GSP ≈ JSP eigenen TagLibs und Integration in Sitemesh Ajax TagLib unterstützt Prototype, Rico, Yahoo UI, Dojo, DWR, OpenLazlo, Wicket 30 Verkürzter Entwicklungszyklus Code Debug Compile Test Package Deploy Entwicklungszyklus Grails Entwicklungszyklus JEE Code Debug 31 Test Deployment-Matrix Mögliche Application Container ab Grails 1.0 32 Oracle AS Weblogic 8.1.2 Weblogic 9.2 Weblogic 10 Tomcat 5.5 Tomcat 6.0 JOnAS 5.1 JOnAS 5.2 Geronimo 2.1.1 GlassFish v1 (Sun AS 9.0) and v2 (Sun AS 9.1) GlassFish v3 Prelude v3 "Prelude“ IBM Integrated Web Application Server for i 7.1 Sun App Server 8.2 Resin 3.2 JBoss 4.2 Jetty 6.1 SpringSource Application Platform 1.0 beta Websphere Application Server Community Edition 2.0 (WAS CE) Websphere 6.1 Grails Application on Oracle WebLogic <?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance“ xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-web-app.xsd"> <container-descriptor> <prefer-web-inf-classes>true</prefer-web-inf-classes> </container-descriptor> </weblogic-web-app> 33 Plug-Ins – die Welt liegt Grails zu Füssen Grails ist eine Plugin-Laufzeit-Umgebung Der Grails Kern besteht aus Plug-Ins (im Standard MVC, GORM etc.) Macht Grails sehr flexibel und Umfangreich Grails-Plugin-Community > 390 Plug-Ins 34 Apache Camel Comet Cloud Foundry DataSources Facebook Feeds Flex/BlazeDS Google Analytics Google Maps JPA JMS LDAP Twitter ... Grails Performance und Zukunft Problem Groovy bisher Faktor 5x bis 15x langsamer als Java!!! Abhilfe JRockit JVM * InvokeDynamic (Java7) Groovy Optimizations (Loop unrolling, etc) Groovy++ 35 Grails Integration Ist Grails EnterpriseReady? Wiederverwendung von existierenden Anwendungen? Grails Integration in existierende Umgebungen? Grails auf der Grünen Wiese? 36 Erfahrungsberichte http://www.noiteuniversitaria.com.br/ Brasilianische Entertainment-Seite 1 Million Seitenzugriffe im Monat http://www.virtualtourist.com/ Travel Community 1 Million Benutzer und 3 Millionen Photos http://www.sky.com Multi-Channel Television Service mit nahezu 10 Millionen Kunden http://kontoblick.de/ Persönliches Finanz-Tracking in kürzester Zeit realisiert 37 Demo Teil II Grails on Oracle 38 Kontakt Frank Szilinski Bachelor of Science in Computer Science [email protected] Stephanienstr. 36 76133 Karlsruhe Tel 0721 / 7540 7530 Fax 0721 / 7540 7539 www.esentri.com [email protected] 39