不知不觉间已经到了本系列的最后,在这一节里,我们将看到如何在Grails中使用Web服务,了解其与Spring和Hibernate相关的配置,以及关于脚手架和部署有关的内容。
Web服务如今已经成为潮流,不论你是否愿意,只要你还在开发应用,你就得去适应它。Grails支持:
实现Restful的服务在Grails中简直就是小菜一碟,通过URL Mapping就可以将一个普通的Controller暴露为一个Restful服务:
static mappings = { "/product/$id?"(resource:"product") }
缺省Http方法和Action的对应关系:
如果你不满意,也可以自行调整:
"/product/$id"(controller:"product"){ action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"] }
但是该方法不会像前面一样自动进行JSON/XML的Marshalling,除非在映射中指明parseRequest参数:
"/product/$id"(controller:"product", parseRequest:true){ action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"] }
客户端调用Restful服务的方法也不复杂:
关于XML Marshalling:
实现SOAP服务是通过XFire Plugin实现的,它可以把Service暴露为Web服务:
class BookService { static expose=['xfire'] Book[] getBooks(){ Book.list() as Book[] } }
如果想知道它的wsdl,可以访问:http://127.0.0.1:8080/your_grails_app/services/book?wsdl
同样,对于RSS/Atom的支持,Grails也是通过插件:Feed Plugin。它底层使用的是ROME库:
def feed = { render(feedType:"rss", feedVersion:"2.0") { title = "My test feed" link = "http://your.test.server/yourController/feed" Article.list().each() { entry(it.title) { link = "http://your.test.server/article/${it.id}" it.content // return the content } } } }
Spring应用中都会使用到ApplicationContext,Grails是一个Spring应用,当然也不例外,其中的ApplicationContext构造过程如下:
Grails的配置很多时候都发生在运行时,每个插件会给ApplicationContext注册一些Bean,关于这请查阅相关文档。当然,如果你对其最终的ApplicationContext感兴趣,不妨试试Spy插件,本站对它已有 介绍。
Grails并没有堵塞你自行定义Spring配置文件的道路,如果你想补充进行额外配置:
在配置文件中可以引用Grails中的对象,如dataSource、sessionFactory。Grails还引入了Bean DSL,例子:
import grails.util.* beans = { switch(GrailsUtil.environment) { case "production": myBean(my.company.MyBeanImpl) { bookService = ref("bookService") } break case "development": myBean(my.company.mock.MockImpl) { bookService = ref("bookService") } break } }
这种DSL一般规则:
这部分功能,即Bean Builder,亦可单独使用,在参考文档中给出了在Spring MVC应用中使用它的例子,这里就不重点阐述了。
Bean DSL的常见例子:
Spring的配置文件中可以使用XML的名字空间,在Bean DSL中也可以:
名字空间使用例子
xmlns aop:"http://www.springframework.org/schema/aop" aop { config("proxy-target-class":true) { aspect( id:"sendBirthdayCard",ref:"birthdayCardSenderAspect" ) { after method:"onBirthday", pointcut: "execution(void ..Person.birthday()) and this(person)" } } }
此外,我们还可以在Spring配置文件中使用Grails Config文件中定义的变量,配置文件中定义的脚本变量都可作为grails-app/conf/spring/resources.xml中的占位符
如果你想覆盖缺省的配置,可以按下列格式:
[bean name].[property name] = [value]
Grails中对于Hibernate的处理与Spring的非常类似:
Grails中还考虑到了你的现有代码资产,重用现有Domain Class(Java类):
Grails也支持使用注解创建Domain Class:
如果你想改变配置文件的位置,在DataSource.groovy中:
hibernate { config.location = "file:/path/to/my/hibernate.cfg.xml" }
配置文件也可有多个:config.location = ["file:/path/to/one/hibernate.cfg.xml","file:/path/to/two/hibernate.cfg.xml"]
Grails的脚手架提供的功能:
激活脚手架很简单,设置Controller的scaffold属性:
至于其他需要知道的知识:
脚手架相关的命令:
如:grails generate-all com.bookstore.Book,建议使用包名。
如果想自定义模板:
跟部署相关的命令有:
grails war比较特殊,有必要单独说明:
|