什么是Groovy

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cguofc%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> <smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="chsdate" downloadurl=""></smarttagtype><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!--[if !mso]><object classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object> <style> st1/:*{behavior:url(#ieooui) } </style> <![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h3 {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; mso-outline-level:3; font-size:13.5pt; font-family:宋体; mso-bidi-font-family:宋体; font-weight:bold;} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} p {mso-margin-top-alt:auto; margin-right:0cm; mso-margin-bottom-alt:auto; margin-left:0cm; mso-pagination:widow-orphan; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} pre {margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; tab-stops:45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt; font-size:12.0pt; font-family:宋体; mso-bidi-font-family:宋体;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->

什么是Groovy

Groovy是一种语言,Groovy的规则比Java少得多。Java平台仅关心使字节码得到执行。此平台不强迫您使用Java语言。只要提供了字节 码,工作就会进行。Groovy代码会被编译为字节码,而对于Java平台来说,字节码是从Java代码还是Groovy代码生成的并没有任何区别。

  Groovy是一种 语言,其语法类似于Java,但比Java更简单。它通常被视为脚本/灵活/动态的语言,但是我不喜欢这类形容词,因为我认为它们只会令人困惑。如果说 Java是一位明智的中年男子,那么Groovy就是他十几岁的儿子。Groovy具有父亲的许多特点,但是更为狂野且更为有趣。他们也可以很好地合作。

  Groovy的规则比Java少得多。例如,要在Java中获得标准的"Hello World"输出,您需要编写一个类、一个具有合适参数的主方法,等等。但是在Groovy中,如果不想编写所有样板代码,您可以抛开类定义和主方法,仅 编写一行代码即可打印出"Hello World"

  以下是打印Hello World的文件 Hello.groovy 的内容:

println "Hello World" 

  Java平台仅关心使字节码得到执行。同样,此平台不强迫您使用Java语言。只要提供了字节码,工作就会进行。Groovy代码会被编译为字节码,而对于Java平台来说,字节码是从Java代码还是Groovy代码生成的并没有任何区别。

  以下是一个Groovy例子,它显示了Groovy对清单、映射和范围的内置支持,并证明了Groovy的简单性及其利用Java的强大功能的能力:

// Print Date
def mydate = new java.util.Date()
println mydate

//Iterate through a map

def numbersMAP = ['1':'ONE', '2':'TWO']
for (entry in numbersMAP) {
 println "${entry.key} = ${entry.value}" 
}

//Introducing the range
def range = 'a'..'d'

//Lists
def numberlist = [1, 2, 3, 4, 5, 6, 7, 8]
println numberlist;
println "Maximum value: ${numberlist.max()}"

  请注意以上代码直接使用java.util.Date ,对收集的内置支持减少了使用清单、映射和范围所需的代码。还有许多其他有趣的Groovy特性,例如闭包和简化的XML处理。您可以在groovy.codehaus.org上找到详细清单。

  现在让我们来讨论如何将Groovy用于Web开发。

使用Groovy进行Web开发

  大多数Java EE教程都从一个基本servlet例子开始。对于Groovy Web开发来说,您将从groovlet(在groovyservlet的对应概念)开始。如果您在servlet中摆脱了类和doXX() 方法声明,那么剩下的内容就与groovlet很像了。以下是一个名为 Login.groovy groovlet例子,您需要将它置于Web应用程序的最高级目录:

def username= request.getParameter("username")
def password= request.getParameter("password")

if (username == "java" && password == "developer") {
 response.sendRedirect("home.jsp")
 session = request.getSession(true);
 session.setAttribute("name", username)
}
else {
 println """
 <h1>Login Invalid</h1>
 <p>Your IP has been logged > ${request.remoteHost}</p>
 """ 
paramMap = request.getParameterMap()
 println "<p>You Submitted:</p>" 
for (entry in paramMap) {
 println "${entry.key} = ${entry.value}<br/>"
 }
}

  您可以仅创建一个简单的HTML表单,然后将此表单的行为属性发送到 action="Login.groovy"。然后将以下标签添加到web.xml

<servlet>
 <servlet-name>Groovy</servlet-name>
 <servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>
<servlet-mapping>
 <servlet-name>Groovy</servlet-name>
 <url-pattern>*.groovy</url-pattern>
</servlet-mapping>

  现在只需将要求的Groovy jar 文件添加到WEB-INF/lib 目录,您的Groovy Web应用程序就准备好在任意Java EE应用服务器上运行了。

  您应该已经注意到代码中没有分号,而且使用了隐式变量如requestresponse。其他隐式变量有contextapplicationsessionoutsout html

  GSPJSPgroovy中的对应概念。您无需使用println生成HTML;只需将Groovy代码嵌入HTML页面。本文中的例子将在提到Grails时使用GSP

  请注意,因为所有代码最终都要转换为字节码,所以groovletGSP能够与servletJSP轻松协作。因此您无需区分groovletGSP或者servletJSP

  现在让我们讨论前途无量的Grails框架。如果成功的话,Grails能够极大地改变开发Java Web应用程序的方式。Ruby on RailsRuby的影响,Grails也能够对Groovy实现。

一篇bloghttp://www.blogjava.net/BlueSUN/archive/<chsdate year="2007" month="3" day="10" islunardate="False" isrocdate="False" w:st="on">2007/03/10</chsdate>/103014.html

Groovy 是一种基于 **JVM(Java 虚拟机)** 的动态编程语言,它结合了 Java 的语法和 Python、Ruby 等动态语言的灵活性,旨在简化开发流程并提升代码可读性。以下是 Groovy 的核心特点和应用场景: --- ### **1. 核心特性** #### **(1)与 Java 的无缝兼容** - **语法兼容**:Groovy 代码可以直接调用 Java 类库,反之亦然(需遵循 Groovy 语法规则)。 - **编译结果**:Groovy 代码会被编译为 Java 字节码,运行在 JVM 上,因此可以无缝集成到现有 Java 项目中。 #### **(2)动态类型与可选类型** - **动态类型**:变量无需显式声明类型(如 `def x = 10`),类型在运行时确定。 - **静态类型支持**:也可使用 `@TypeChecked` 或 `@CompileStatic` 注解启用静态类型检查。 #### **(3)简洁的语法** - **省略分号和括号**: ```groovy // Java 写法 System.out.println("Hello"); // Groovy 写法 println "Hello" ``` - **字符串插值**: ```groovy def name = "Groovy" println "Hello, $name!" // 输出:Hello, Groovy! ``` - **闭包(Closures)**: 类似 Lambda 表达式,但更灵活: ```groovy def greet = { name -> println "Hello, $name!" } greet("World") // 输出:Hello, World! ``` #### **(4)元编程(Metaprogramming)** - **动态方法添加**:运行时为类添加方法或属性。 - **方法拦截**:通过 `methodMissing` 或 `propertyMissing` 实现动态行为。 - **AST 转换**:编译时修改抽象语法树(如 `@Immutable` 注解生成不可变类)。 #### **(5)内置脚本支持** - Groovy 可以直接作为脚本语言运行,适合快速任务(如文件处理、系统管理)。 --- ### **2. 典型应用场景** #### **(1)构建工具(如 Gradle)** - Gradle 的构建脚本使用 Groovy 编写,利用其简洁语法和动态特性管理依赖和任务: ```groovy plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web:2.7.0' } ``` #### **(2)测试自动化** - 结合 Spock 框架编写行为驱动开发(BDD)风格的测试: ```groovy def "user login should succeed"() { given: "a valid user" def user = new User(username: "admin", password: "123456") when: "login is attempted" def result = authService.login(user) then: "the result is successful" result.success == true } ``` #### **(3)脚本化任务** - 快速处理文件、数据库或 HTTP 请求: ```groovy // 读取文件并统计行数 def file = new File("data.txt") def lineCount = file.readLines().size() println "Total lines: $lineCount" ``` #### **(4)领域特定语言(DSL)** - 创建自定义 DSL 简化复杂配置(如 Jenkins Pipeline): ```groovy pipeline { agent any stages { stage('Build') { steps { sh 'mvn clean package' } } } } ``` --- ### **3.Java 的对比** | **特性** | **Java** | **Groovy** | |------------------|-----------------------------|-------------------------------| | **类型系统** | 静态类型(必须声明类型) | 动态类型(`def` 关键字) | | **语法简洁性** | 冗长(需显式分号、括号) | 简洁(支持省略分号、括号) | | **元编程** | 不支持 | 支持(运行时修改类行为) | | **闭包** | Java 8+ 的 Lambda 表达式 | 更强大的闭包(支持自由变量) | | **适用场景** | 大型企业应用、高性能需求 | 脚本、测试、快速原型开发 | --- ### **4. 学习 Groovy 的建议** - **从 Java 过渡**:Groovy 的语法对 Java 开发者友好,可逐步引入动态特性。 - **实践项目**:尝试用 Groovy 编写脚本或小型工具(如文件批量处理)。 - **探索框架**:学习 Gradle、Spock 或 Jenkins Pipeline 的 Groovy 用法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值