Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 352 trang
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,Grailsand Griffon"] Book = new Book( map) We can pass the map directly to the bean: Book = new Book ( id: 1, title: "Beginning Groovy,Grailsand 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