1. Trang chủ
  2. » Công Nghệ Thông Tin

beginning groovy, grails and griffon

352 555 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Cấu trúc

  • Beginning Groovy, Grails and Griffon

    • Contents at a Glance

    • Contents

    • About the Authors

    • About the Technical Reviewer

    • Acknowledgments

    • Chapter 1: Introduction to Groovy

      • Installation

      • Groovy by Example

        • Converting Java to Groovy

        • Converting a JavaBean to a GroovyBean

        • Simplifying the Code

        • Using Groovy Collection Notation and Closure

        • Getting Rid of main()

      • Groovy Language Key Features

        • Assertion

        • Annotations for AST Transformation

        • Builder

        • Closure

        • GDK

        • Metaprogramming

        • Native JSON Support

        • Native Support for Lists and Maps

        • Native Support for Regular Expression

        • Object Orientation: Everything is an Object in Groovy

        • String interpolation

        • Static and Dynamic Typing

        • Static Type Checking

        • Static Compilation

        • Optional Syntax

          • Access Modifiers

          • Checked Exceptions

          • Getters and Setters

          • Import Statements

          • Parentheses and Semicolons

          • Return Type and the return Keyword

      • Summary

    • Chapter 2: Groovy Basics

      • Scripts

        • Using Script Functions

        • Compiling Groovy

        • Running Groovy

          • Command Line

          • Groovy Shell

          • Groovy Console

      • Assertions

        • Power Asserts

      • Strings

        • GStrings

        • Single Line Strings

        • Multiline Strings

        • Slashy Strings

        • Multiline Slashy Strings

        • Dollar Slashy Strings

      • Regular Expressions

        • Groovy Regular Expression Operators

          • Match Operator

          • Find Operator

          • Pattern Operator

        • Common Uses of Regular Expressions

      • Collective Datatypes

        • Arrays

        • Lists

        • Maps

        • Ranges

        • Sets

      • Control Structure

        • Groovy Truth

        • Logical Branching

        • Looping

        • Exception Handling

      • Methods

      • Closures

        • Implicit Variables

          • it

          • this, owner, and delegate

        • Explicit Declaration of Closure

        • Reusing the Method as a Closure

        • Closures and Collection

          • any

          • collect

          • each

          • every

          • find

        • Closures as Map Keys and Values

        • Currying Closure

        • Closure Trampoline

        • Closure Memoization

      • Operators

        • Operator Overloading

        • Specialized Operators

          • Spread Operator

          • Elvis Operator

          • Safe Navigation/Dereference Operator

          • Field Operator

          • Method Closure Operator

          • Diamond Operator

      • Summary

    • Chapter 3: More Advanced Groovy

      • Object Orientation in Groovy

        • Classes and Scripts

        • Groovy Constructors

        • Inheritance

        • Polymorphism

      • Groovy Unit Testing

      • Working with XML

        • Writing XML with Java

        • Groovy Builders

        • Writing XML with Groovy MarkupBuilder

        • Reading XML with XmlSlurper

      • Native JSON support

        • Reading JSON

        • JsonBuilder

        • Prettyprinting JSON Content

      • Generating Text with Templates

      • Runtime Metaprogramming

        • Metaobject Protocol

        • Metaclass

        • Using invokeMethod() and get/setProperty()

          • Overriding invokeMethod

          • Overriding getProperty and setProperty

        • Using methodMissing()

      • Expandos

      • ExpandoMetaClass

        • Borrowing Methods from Other Classes

        • Adding Constructors

        • Adding Properties

        • Adding Methods on Interfaces

        • Adding or Overriding Instance Methods

        • Adding or Overriding Static Methods

        • Categories

        • Runtime Mixins

      • Compile-time Metaprogramming

        • AST Transformations

        • Built-in AST Transformations

          • Delegate Transformation

          • Immutable Transformation

          • Lazy Transformation

          • Logging Transformation

          • Newify Transformation

          • Singleton Transformation

      • Domain-Specific Languages

      • Summary

    • Chapter 4: Introduction to Grails

      • What Is Grails?

        • Grails Features

          • Convention over Configuration

          • Unit Testing

          • Scaffolding

          • Object Relational Mapping

          • Plugins

        • Integrated Open Source

          • Groovy

          • Spring Framework

          • Hibernate

          • SiteMesh

          • Ajax Frameworks

          • Tomcat

          • H2

      • Grails Architecture

      • Installing Grails

      • Collab-Todo Application

        • Creating Collab-Todo application

        • Running the Application

        • Creating the Controller

        • Testing the Controller

      • Scaffolding

        • Creating a Domain Class

        • Dynamic Scaffolding

        • Static Scaffolding

          • Finishing the Remaining Domains

          • Finishing the Remaining Controllers

        • Creating Domain Relationships

      • H2 Console

      • Grails Plugins

      • Grails Interactive Mode

      • Summary

    • Chapter 5: Building the User Interface

      • Starting with the End in Mind

        • Creating the Footer

        • Creating the Topbar

        • Adding More Look and Feel

        • Grails Tags

          • Logical Tags

          • Iteration Tags

          • Assignment Tags

          • Linking Tags

          • Ajax Tags

          • Form Tags

          • UI Tags

          • Render and Layout Tags

          • Validation Tags

        • Static Resources

          • r:require

          • r:layoutResources

      • Making the Topbar Functional

        • The Login View

        • The login Action

        • Handling the Login and Logout Actions

      • Externalizing Strings

      • Errors and Validation

      • Flash and Flash Messages

      • Creating an Audit Log Using Action Interceptors

      • Using Filters

      • Summary

    • Chapter 6: Building Domains and Services

      • GORM

      • Collab-Todo’s Domain

      • Creating Domain Objects

        • Basic Domain Creation

          • New Columns

          • Naming

          • Foreign Keys

          • Data Type

          • Setting Default Values

          • Large Object Types

        • Creating Relationships

          • Players Involved

            • One-to-One

            • One -to-Many

          • Managing Relationships

            • Many-to-One

            • Many-to-Many

          • Turning on the Cache

          • Transient Properties

          • GORM Events

          • Database Model

      • Overwriting Default Settings

        • Adjusting the Mappings

          • Table and Column Naming

          • Changing the Primary Key

          • Disabling Versioning

          • Changing Eager Fetching and Locking

          • Creating Database Indexes

          • Class Inheritance

        • Turning on the Cache

        • Transient Properties

        • GORM Events

        • Database Model

      • Validation

        • Constraints

          • Using Built-In Constraints

          • Creating Custom Constraints

        • Calling the Validator

        • Validation Messages

      • Querying the Database

        • GORM’s CRUD Support

        • Creating Queries

          • GORM’s Dynamic Queries

            • Counts

            • Single Result-Set Queries

            • Multiple Results Queries

            • findAllBy

            • findAllWhere

            • getAll

            • List

            • listOrderBy

            • Filtering Queries

          • HQL Queries

            • find

            • findAll

            • executeQuery

          • Hibernate’s Criteria Queries

          • Detached Criteria

          • Where Queries

      • Services

        • Creating a Service

        • Calling the Service

        • Injecting into the Service

        • Initializing the Service

        • Setting a Bean to Be Transactional

        • Service Context Available in the Service

      • Summary

    • Chapter 7: Security in Grails

      • What Is Security?

        • Authentication

        • Access Control

      • An Overview of Grails Security Solutions

      • Custom Security Implementation

      • Registering a User

        • Installing the Captcha Plugin

        • Implementing the Registration Page

        • Adding the Registration Action to the Controller

        • Logging In and Out

        • Securing the Controllers

      • CAS

        • CAS Installation

        • CAS Configuration

        • CAS Usage

      • Spring Security

        • Security Domain Classes

          • Person Class

          • Authority Class

          • PersonAuthority Class

          • Requestmap Class

        • Securing URLs

          • URLs and Authorities

          • Defining Secured Annotations

          • Simple Map in Config.groovy

          • Requestmap Instances Stored in the Database

        • SecurityTagLib

      • Summary

    • Chapter 8: Web 2.0—Ajax and Friends

      • Advanced Presentation Components

        • Adding RichText Capabilities

        • Adding Search Capabilities

        • Allowing File Uploads

          • Uploading the File

          • Downloading the File

          • Adding Mail Services

          • Creating the E-Mail Service

          • Creating the Mail Sender

          • Updating the Registration Page

      • Tag Libraries

        • Creating the Tag Library

        • Referencing the Tag Library

      • Ajax in Grails

        • Using Ajax Frameworks in Grails

          • Using remoteField

          • Using remoteFunction

          • Using remoteLink

          • Using formRemote

          • Using javascript

          • Using submitToRemote

          • Handling Ajax Events

        • Dynamic Rendering of Data

          • Rendering a Template

          • Creating a Template

          • Making the Page Dynamic

      • RSS Feeds

      • Summary

    • Chapter 9: Web Services

      • RESTful Web Services

      • RESTful in Grails

        • URL Mappings

          • Default URL Mappings

          • RESTful Mappings

        • Content Negotiation

          • Content Negotiation using the Accept Header

          • Content Negotiation with the Format Request Parameter

          • Content Negotiation with URI Extensions

        • RestController

          • Common Functionality

          • RESTful show

          • RESTful delete

          • RESTful update

          • RESTful create

      • Summary

    • Chapter 10: Reporting

      • The Report

      • Reporting Tools

        • Overview

        • Installing JasperReports and iReports

      • Creating the Todo Report

        • Defining the Data Source

        • Using iReports

        • Enhancing the Report

        • Compiling the Report

      • The Report Tag

        • Tag Library Overview

        • Creating the Tag

      • The ReportController and the ReportService

      • Tying It All Together

        • Gathering the Report Data

        • Adding the Report Tag to the Application

      • The Report List

      • An Alternate Approach

      • Summary

    • Chapter 11: Batch Processing

      • Installing the Quartz Plugin

      • Creating a Job

      • Building a Batch-Reporting Facility

        • Creating a Nightly Reporting Job

          • Setting the Name and Group

          • Controlling Execution Frequency

        • Retrieving the User’s Todos

        • Invoking the Report Service

        • Invoking the E-Mail Service

      • Summary

    • Chapter 12: Deploying and Upgrading Grails Applications

      • Deploying Grails Applications

        • Using Environments

        • Understanding Grails Configurations

          • Startup and Shutdown Behavior

          • Data Source Configurations

          • Logging Configurations

        • Packaging the Application for Deployment

        • Deploying to an Application Server

      • Upgrading Grails Applications

        • Configuration Changes

        • Command Line Changes

        • H2

        • jQuery

        • Controller Public Methods

        • Unit Test Framework

      • Summary

    • Chapter 13: Introduction to Griffon

      • Installing Griffon

      • Creating Your First Application

      • Directory Structure

      • Griffon Application Life Cycle

        • Initialization

        • Startup

        • Ready

        • Shutdown

        • Stop

      • Views

        • Builder Overview

        • Griffon View

        • Special Nodes

          • Application

          • Container

          • Widget

          • Bean

          • Noparent

          • Root

      • Models and Bindings

      • Controllers

        • Injected Properties

        • Injected Methods

          • createMVCgroup

          • buildMVCgroup

          • destroyMVCgroup

          • withMVCgroup

          • newInstance

        • Initialization and Destruction Hook

          • mvcGroupInit

          • mvcGroupDestroy

        • Actions

      • Summary

    • Index

Nội dung

www.it-ebooks.info For your convenience Apress has placed some of the front matter material after the index. Please use the Bookmarks and Contents at a Glance links to access them. www.it-ebooks.info iii Contents at a Glance About the Authors ��������������������������������������������������������������������������������������������������������������� xv About the Technical Reviewer ������������������������������������������������������������������������������������������ xvii Acknowledgments ������������������������������������������������������������������������������������������������������������� xix Chapter 1: Introduction to Groovy ■ �������������������������������������������������������������������������������������1 Chapter 2: Groovy Basics ■ ������������������������������������������������������������������������������������������������15 Chapter 3: More Advanced Groovy ■ ����������������������������������������������������������������������������������57 Chapter 4: Introduction to Grails ■ �������������������������������������������������������������������������������������89 Chapter 5: Building the User Interface ■ ��������������������������������������������������������������������������125 Chapter 6: Building Domains and Services ■ �������������������������������������������������������������������155 Chapter 7: Security in Grails ■ ������������������������������������������������������������������������������������������189 Chapter 8: Web 2�0—Ajax and Friends ■ ��������������������������������������������������������������������������217 Chapter 9: Web Services ■ ������������������������������������������������������������������������������������������������241 Chapter 10: Reporting ■ ���������������������������������������������������������������������������������������������������257 Chapter 11: Batch Processing ■ ���������������������������������������������������������������������������������������279 Chapter 12: Deploying and Upgrading Grails Applications ■ ��������������������������������������������291 Chapter 13: Introduction to Griffon ■ ��������������������������������������������������������������������������������305 Index ���������������������������������������������������������������������������������������������������������������������������������333 www.it-ebooks.info 1 Chapter 1 Introduction to Groovy Modern Java programmers live in the dissonance of two conflicting schools of thought. On one hand, dynamic languages such as Groovy, JRuby, and Jython offer advances in expressive power. On the other, many Java purists reject these languages as too impractical. Groovy with its new version addresses this conflict, establishing itself as an expedient language. Anachronistically, as programming languages evolve in a benign continuum, one or the other contender language is impeached upon on its performance merits. However, with progressive enhancements of compilers, runtime systems, or even processing power, it became apparent that the performance penalties were not so big as envisaged. The contender language not only survived, but also had rather favorable consequences on the programming sphere. It is now apparent that Groovy is not a fad that will fade away next year or the year after. Beautifully-engineered Groovy seamlessly integrates with the existing Java libraries and aims at dynamicity to Java without introducing a steep learning curve for Java developers. Groovy, however, is not alone in the new feature- rich JVM landscape—other languages such as JRuby, Jython, Jaskell, Clojure, Scala are its contemporaries. All these languages are designed to, when not leveraging Java, assuage some of Java’s problems. But there are a few factors that ascertain Groovy’s position as first among equals. Groovy was designed from scratch to run on Java virtual machines, as were Clojure and Scala, which gives Groovy, Clojure, and Scala few notches. Jython and JRuby were ported on JVM. Jaskell is a JVM counterpart of pure functional language Haskell. Other than execution environment, all these languages except Groovy lack Java’s immense libraries. Groovy is designed to be both source-compatible and binary- compatible with Java. This means that a Groovy class could extend a Java class or implement a Java interface, and that a Java class could extend a Groovy class or implement a Groovy interface. Grails, the leading next-generation Groovy- based framework, is built on widely-held Spring and Hibernate frameworks. Griffon, another Groovy-based MVC framework, brings a revolution in the world of desktop applications. Groovy’s source and binary compatibility with Java, combined with two Groovy-powered next-generation frameworks supported by the starfleet of SpringSource, strongly indicates that Groovy’s future is assured. It is only logical. In this chapter, we will introduce the Groovy language, describe how to install it, and give you an idea of the benefits of Groovy over Java by working through an example. Then we will give you a general overview of key features of the Groovy language. Installation Groovy comes bundled as a .zip file or platform-specific installer for Windows, Ubuntu, and Debian (as well as openSUSE until recent versions). This section explains how to install the zipped version, since it covers the most platforms. To install Groovy: 1. Download the most recent stable Groovy binary release .zip file from http://groovy. codehaus.org/Download. 2. Uncompress groovy-binary-X.X.X.zip to your chosen location. www.it-ebooks.info CHAPTER 1 ■ INTRODUCTION TO GROOVY 2 3. Set a GROOVY_HOME environment variable to the directory in which you uncompressed the .zip file. 4. Add the %GROOVY_HOME%\bin directory to your system path. To validate your installation, open a console and type the following: >groovy -v You should see something like this: Groovy Version: 2.0.0 JVM: 1.6.0_31 Vendor: Sun Microsystems Inc. OS: Windows 7 Groovy by Example The best way to grasp the power and elegance of Groovy is to compare it to Java using an example. In the remainder of this chapter, we will show you how to convert the simple Java class in Listing 1-1 into Groovy. Then we will demonstrate how to adapt the code to use common Groovy idioms. Listing 1-1. Simple Java Class 1. package com.apress.bgg; 2. 3. import java.util.List; 4. import java.util.ArrayList; 5. 6. 7. public class Todo { 8. private String name; 9. private String note; 10. 11. public Todo() {} 12. 13. public Todo(String name, String note) { 14. this.name = name; 15. this.note = note; 16. } 17. 18. public String getName() { 19. return name; 20. } 21. 22. public void setName(String name) { 23. this.name = name; 24. } 25. 26. public String getNote() { 27. return note; 28. } 29. www.it-ebooks.info CHAPTER 1 ■ INTRODUCTION TO GROOVY 3 30. public void setNote(String note) { 31. this.note = note; 32. } 33. 34. public static void main(String[] args) { 35. List<Todo> todos = new ArrayList<Todo>(); 36. todos.add(new Todo("1", "one")); 37. todos.add(new Todo("2", "two")); 38. todos.add(new Todo("3","three")); 39. 40. for(Todo todo : todos) { 41. System.out.println(todo.getName() + " " + todo.getNote()); 42. } 43. } 44. } If you have any Java experience, you will recognize Listing 1-1 as a basic Todo JavaBean. It has getters and setters for name and note attributes, as well as a convenience constructor that takes a name and note for initializing new instances. As you would expect, this class can be found in a file named Todo.java in the com.apress.bgg package. The class includes a main() method, which is required for Java classes to be executable and is the entry point into the application. On line 35, the main() method begins by creating an instance of a java.util.ArrayList to hold a collection of Todos. On lines 36–38, three Todo instances are created and added to the todos list. Finally, on lines 40–43, a for statement iterates over the collection and prints the Todo's name and note to System.out. Converting Java to Groovy To convert the Java Todo class in Listing 1-1 to Groovy, just rename the file to Todo.groovy. That’s right, Groovy derives its syntax from Java. This is often referred to as copy/paste compatibility. So congratulations, you are a Groovy developer (even if you didn’t know it)! This level of compatibility, along with a familiar API, helps to reduce the Groovy learning curve for Java developers. It also makes it easier to incorporate Java examples found on the Internet into a Groovy application and then refactor them to make them more Groovylike, which is what we will do with Listing 1-1. To run this Groovy application, from the command line, type the following: > groovy com\apress\bgg\Todo.groovy If you are coming from a Java background, you may be a little surprised that you did not need to first compile the code. Here’s the Java equivalent: > javac com\apress\bgg\Todo.java > java com.apress.bgg.Todo Running the Java application is a two-step process: Compile the class using javac, and then use java to run the executable class in the JVM. But Groovy will compile to byte code at runtime, saving a step in the development process and thereby increasing Groovy’s productivity. Groovy provides a lot of syntactic sugar and is able to imply more than Java. You’ll see this in action as we make our Groovy application more Groovy by applying some of the Groovy idioms. www.it-ebooks.info CHAPTER 1 ■ INTRODUCTION TO GROOVY 4 Converting a JavaBean to a GroovyBean Let’s begin by simplifying the JavaBean, which could also be referred to as a Plain Old Java Object (POJO). Groovy has the GroovyBean, which is a JavaBean with a simpler Groovy syntax, sometimes referred to as a Plain Old Groovy Object (POGO). GroovyBeans are publicly scoped by default. Listing 1-2 shows our example using a GroovyBean. Listing 1-2. Simple Example Using a GroovyBean 1. package com.apress.bgg; 2. 3. import java.util.List; 4. import java.util.ArrayList; 5. 6. 7. public class Todo { 8. 9. String name; 10. String note; 11. 12. public static void main(String[] args) { 13. List <Todo> todos = new ArrayList<Todo>(); 14. todos.add(new Todo(name:"1", note:"one")); 15. todos.add(new Todo(name:"2", note:"two")); 16. todos.add(new Todo(name:"3", note:"three")); 17. 18. for(Todo todo : todos) { 19. 20. System.out.println(todo.name + " " + todo.note); 21. } 22. } 23. } Listing 1-2 is significantly shorter than Listing 1-1, primarily because Groovy has a concept of native properties, which means getters and setters do not need to be declared. By default, all class attributes—such as the name and note attributes on lines 9 and 10—are public properties and automatically generate corresponding getters and setters in the byte code. So if the class is used from Java code, or reflection is used to interrogate the class, you will see the getters and setters. These properties also have a more intuitive usage model. They can be assigned or used directly, as on line 20, where the name and note properties, rather than the getters, are used to generate the output. Also, rather than needing to explicitly create a convenience constructor for initializing a GroovyBean, you can pass named parameters in the constructor to initialize any properties you want, as in lines 14–16. GroovyBeans have a very useful initialization feature called Named parameters. We can pass a Map to the constructor of a bean that contains the names of the properties, along with an associated initialization value. Every GroovyBean has this built-in Map constructor, which works by iterating the map object and calling the corresponding property setter for each entry in the map. Suppose we have a GroovyBean Book, which has the properties id and title. We can initialize such bean with a map: map = [id: 1, title: "Beginning Groovy, Grails and Griffon"] Book = new Book( map) We can pass the map directly to the bean: Book = new Book ( id: 1, title: "Beginning Groovy, Grails and Griffon") www.it-ebooks.info CHAPTER 1 ■ INTRODUCTION TO GROOVY 5 Simplifying the Code Some of the syntax sugar included in the Groovy language is making semicolons, parentheses, and data typing optional. Other interesting features to simplify code include implicit imports like the java.util.* package, common methods like println() applying to all objects including Java objects, and more flexible strings. Listing 1-3 applies these features to our example. Listing 1-3. Simple Example Applying Syntactic Sugar, Implicit Imports, Common Methods,and String Features 1. package com.apress.bgg; 2. 3. public class Todo { 4. 5. String name 6. String note 7. 8. public static void main(String[] args) { 9. def todos = new ArrayList() 10. todos.add(new Todo(name:"1", note:"one")) 11. todos.add(new Todo(name:"2", note:"two")) 12. todos.add(new Todo(name:"3", note:"three")) 13. 14. for(Todo todo : todos) { 15. 16. println "${todo.name} ${todo.note}" 17. } 18. } 19. } In Listing 1-3, under the package declaration we no longer need to import java.util.List, java.util. ArrayList, and java.util.Iterator. These are implicitly imported since they are in the java.util.* package. Other implicitly included packages are java.lang.*, java.net.*, java.io.*, groovy.lang.*, and groovy.util.*. Also notice that, other than in the for statement (which we will clean up in the next round of refactoring), all the semicolons were removed. On line 16, we used optional parentheses with the implicit println() method. But that is not the only change to line 16. The println() method was modified to use Groovy’s GString format, which is similar to the Apache Ant property format, rather than concatenating two strings. We’ll cover Groovy strings in Chapter 2. At this point, just notice how much simpler this is to read. Line 9 has been changed to use optional typing. The variable todos is no longer typed to List. Groovy uses “duck typing,” which means if it sounds like a duck and walks like a duck, it must be a duck. Do you really care what the type of an object is, as long as you can pass it a message and it will handle the request if it can? If the object cannot handle the request, you will receive a groovy.lang.MissingMethodException or groovy.lang.MissingPropertyException. Of course, where you think typing is necessary, you always have the option of explicitly typing variables. Using Groovy Collection Notation and Closure The next step in refactoring the example is to take advantage of Groovy’s collection and map notation, as well as replace the ugly for statement with a more elegant closure. Listing 1-4 shows this version. www.it-ebooks.info CHAPTER 1 ■ INTRODUCTION TO GROOVY 6 Listing 1-4. Example with the Groovy Collection Notation and Closure 1. package com.apress.bgg; 2. 3. public class Todo { 4. 5. String name 6. String note 7. 8. public static void main(String[] args) { 9. def todos = [ 10. new Todo(name:"1", note:"one"), 11. new Todo(name:"2", note:"two"), 12. new Todo(name:"3", note:"three") 13. ] 14. 15. todos.each { 16. println "${it.name} ${it.note}" 17. } 18. } 19. } Notice how the ArrayList was replaced with []. Again, this is just syntactic sugar; Groovy really is instantiating an ArrayList. Similarly, we can create maps with the [:] syntax. To make the code more clean, we can initialize the list without needing to call the add() method for each entry. Then to simplify the iteration, we call the each() method, passing a closure that prints out the string. Notice that, by default, the iteration variable is it. Chapter 2 will provide more explanations and examples of Groovy lists, maps, and closures. Getting Rid of main() One bit of Java ugliness left in our example is the main() method. After all these improvements, the main() method now stands out. Fortunately, Groovy has a concept of scripts as well as classes, and we can turn this into a script, removing the need for the main() method. To begin, the file must be renamed to something like Todos.groovy. This is because a script will also be compiled to a class, and if we didn’t change the name, there would be a name clash between the Todo class and the Todo script. Then we simply move the code that currently exists in the main() method outside the Todo class. Note that, in Groovy, any code that is not inside a class is called a script. When the script is run, it will behave the same as before. Listing 1-5 shows the script version. Listing 1-5. Example as a Script 1. package com.apress.bgg; 2. public class Todo { 3. String name 4. String note 5. } 6. def todos = [ 7. new Todo(name:"1", note:"one"), 8. new Todo(name:"2", note:"two"), 9. new Todo(name:"3", note:"three") 10. ] www.it-ebooks.info CHAPTER 1 ■ INTRODUCTION TO GROOVY 7 11. todos.each { 12. println "${it.name} ${it.note}" 13. } Finally, we have elegant, easy-to-read code at a fraction of what we started with in Java. It should be obvious that if we had started with the Groovy idioms to begin with, the Groovy approach would have been much more productive. Groovy Language Key Features This section gives a general overview of the language features that make Groovy a commendable extension to the Java platform. A detailed treatment of all these features is given in subsequent chapters. Assertion An assertion is used to validate that an expected condition is true. Assertions in Groovy are more powerful than in Java because assertion in Java works only on Boolean, whereas assertion in Groovy can accept any type. Assertions in Java can be disabled, whereas assertions in Groovy are always executed and are recommended to be used in the production code. Listing 1-6. Assertion Example def list = [1, 2, 'x'] // list of 3 elements assert list.size() == 3 Annotations for AST Transformation When the Groovy compiler compiles Groovy scripts and classes, the Groovy parser (the front end of the compiler) creates an Abstract Syntax Tree (AST) before generating the final byte code for the class. The AST is the in-memory representation of the source code, comprising class, method, property, statement, and variables. AST transformation is the capability to add new code (methods, checks) into source code before the final byte code is generated. The objective of the AST transformation is to let developers structure their code while focusing more on the business code rather than on boilerplate code or cross-cutting concerns. Groovy provides annotations you can use to annotate code structures for AST transformation. Here is one example of AST transformation using @Singleton annotation provided by Groovy: Listing 1-7. Using Annotations for AST Transformation @Singleton class SomeSingleton { // } The @Singleton annotation creates a private constructor and a static method, which gives us an instance of the Singleton through AST transformations. www.it-ebooks.info [...]... java.math.BigDecimal, java.math.BigInteger Parentheses and Semicolons Parentheses and semicolons are optional in Groovy The following statements are valid in Groovy: Listing 1-22.  Optional Semicolons and Parentheses println ("hello"); println "hello" 13 www.it-ebooks.info Chapter 1 ■ Introduction to Groovy Return Type and the return Keyword In Groovy, the return type for a method and the return keyword as the last statement... scripts, including compiling and running Groovy scripts using the command Line, Groovy Shell, and Groovy Console Then we will focus on specific aspects of the Groovy language: assertions, strings, regular expressions, collections, ranges, control structures, methods, closures, and operators Scripts You will be using the Groovy language to build domain objects, controllers, and services But that isn’t... instantiates the Groovy class Name and sets the firstName property to a value passed in on the command Line Listing 2-8 illustrates compiling and executing the programs Listing 2-8.  Joint Compile and Execute groovyc *.groovy *.java java -cp %GROOVY_HOME%/embeddable/groovy-all-2.0.0.jar; SayHello "Luke" Here is the output: Hello Luke, Java calling Groovy Compiling the Groovy and Java classes is accomplished... matching the file pattern ending in groovy and java You run the program in the same way that you run any other Java program—just include groovy-all-.jar in the classpath Running Groovy You can run Groovy scripts and classes through the command Line, Groovy Shell, or Groovy Console Let’s look at each technique Command Line To run Groovy from the command line, you have several options: • Use... Lines 1 and 2 assign a famous quote to the saying variable Line 3 defines a regular expression pattern that should find the words that end in en, such as men and women ■■Caution  Notice the space between the = and ~ for the pattern operator in Listing 2-26 Without the space, it would be the find operator Line 4 applies the pattern to the saying and returns a matcher that contains the results Lines 5 and. .. println greeting() Listing 1-24 shows that Return type is dynamic In both Listing 1-23 and Listing 1-24, the output is: Hello world ■■Note  It appears that removing constructs like parentheses and semicolons is unessential and rather mundane, but as you will see in domain-specific languages, one of the key areas of Groovy, removing these constructs brings code close to the natural language Summary The... dramatically reduce the code it takes to write the equivalent Java class in Groovy, while increasing the readability and expressiveness In the next chapter, we will continue exploring Groovy by looking at its basic language features 14 www.it-ebooks.info Chapter 2 Groovy Basics Chapter 1 introduced you to Groovy, its relationship to Java, and where the two languages differ This chapter will delve into the... to Groovy Here is the output: John Doe 40 2 bmw ford Native Support for Lists and Maps Java has no language-level support for collections that it has for arrays Groovy enhanced the Java collection classes by adding and improving the declaration syntax and additional methods Groovy contains first-class constructs for List and Map It also adds the new collection type—Range—at the language level, which... Groovy compiler is a joint compiler It can compile Groovy and Java code at the same time The joint compiler first became available in Groovy 1.5 through a generous donation by JetBrains, the makers of IntelliJ IDEA The joint compiler allows you to compile Groovy and Java files with a single compile statement Listings 2-6 and 2-7 are a Groovy file and a Java file, respectively, to demonstrate joint compilation... expression handling right into the language via the =~ operator and matcher objects Object Orientation: Everything is an Object in Groovy Unlike Java, everything in Groovy is an object; there are no primitive types As a result, in Groovy, no auto boxing is needed because everything is an object For example, Groovy executes 2 + 2 as 2.plus(2) The plus operator is implemented via the plus() method In Groovy, . title: " ;Beginning Groovy, Grails and Griffon& quot;] Book = new Book( map) We can pass the map directly to the bean: Book = new Book ( id: 1, title: " ;Beginning Groovy, Grails and Griffon& quot;) www.it-ebooks.info CHAPTER. method-invocation and synthesis of methods and classes. In Groovy, runtime metaprogramming is realized using meta-object protocol. The MOP, in Groovy, comprises categories, expandos, and metaclasses. Listing. from scratch to run on Java virtual machines, as were Clojure and Scala, which gives Groovy, Clojure, and Scala few notches. Jython and JRuby were ported on JVM. Jaskell is a JVM counterpart of

Ngày đăng: 24/04/2014, 14:40

TỪ KHÓA LIÊN QUAN