文档章节

Grails中的约定

翟志军
 翟志军
发布于 2013/12/24 17:31
字数 1141
阅读 1896
收藏 8
点赞 2
评论 0

Grails是一个约定胜于配置的框架。以下是Grails在controller,servic,domain等方面的约定。

Controller和View的约定

  1. 所有的Controller类的命名都以Controller结尾,并放在grails-app/controllers文件夹中

  2. Controller中所有的public方法,都可以被web请求访问

  3. 在一个空的Controller中加入static scffold = true或者static scaffold = <领域类的类名>,运行时将会动态生成相应的controller脚手架和GSP页面。

  4. Controller中默认从org.codehaus.groovy.grails.plugins.web.api.ControllersApi混入超过30个方法:

    • Object bindData(Object target, Object args) (plus five variants)
    • Object chain(Map args)
    • String forward(Map params)
    • String getActionName()
    • String getActionUri()
    • ApplicationContext getApplicationContext()
    • Map getChainModel()
    • String getControllerName()
    • String getControllerUri()
    • Errors getErrors()
    • FlashScope getFlash()
    • GrailsApplication getGrailsApplication()
    • GrailsApplicationAttributes getGrailsAttributes()
    • ModelAndView getModelAndView()
    • GrailsParameterMap getParams()
    • HttpServletRequest getRequest()
    • HttpServletResponse getResponse()
    • ServletContext getServletContext()
    • HttpSession getSession()
    • String getTemplateUri(String name)
    • String getViewUri(String name)
    • GrailsWebRequest getWebRequest()
    • boolean hasErrors()
    • void header(String headerName, Object headerValue)
    • Object redirect(Map args)
    • Object render(Object o)
    • Object render(String txt)
    • Object render(Map args)
    • Object render(Closure c)
    • Object render(Map args, Closure c)
    • Object withForm(Closure callable)

    另外,void render(Converter converter)void jsonHeader(Object value)org.codehuas.groovy.grails.plugins.converts.api.ConvertersControllersApi混入。Object withFormat(Closurecallable)方法从org.codehaus.groovy.grials.plugins.web.api.ControllersMimeTypesApi混入。

  5. 如果一个controller中的action的名称,与其使用的GSP的名称相同,GSP放在相应的文件夹中,这时,你可以不用设置action对应的GSP。

    例如:

     class UserController{
     	def list(){
     		[conut: count, users: users]
     	}
     }
    

    如果grails-app/views/user/文件夹中存在list.gsp,那么grails将使用list方法返回的[count:count, users: users]来渲染list.gsp。当然,你可以指定gsp页面,例如:

     def list(){
     	render(view: 'list', model: [conut: count, users: users])
    
     }
    
  6. 可以从paramsmap中拿到web请求的参数,或者调用某个重载了bindData的方法

  7. GSP布局约定。在GSP的head标签中定义:<meta name='layout' content='main'>,意指使用grails-app/views/layouts/main.gsp作为该gsp页面的模板。使用的是Sitemesh模板技术。在Contoller级定义模板只需要在Controller类中设置布局属性:static layout = 'main'。全局模板定义需要在Config.groovy中定义:grails.sitemesh.default.layout = 'main',Grails默认使用grails-app/views/layouts/application.gsp作为页面的模板。只需要在相应的级别放入模板页面,Grails将自动使用该模板。

URI约定。

所有的URI规则约定配置在UrlMappings.groovy中,默认使用RESTfull风格。

Service约定。

所有的Service类约定入在grails-app/services文件夹中,名称要求以Service结尾。所有的Service的方法默认是加事务的。默认情况,所有的service都将注册为Spring的一个bean,并且是singletons的。可以在service加入属性static scope = 'session'就可以更改其范围。bean的名称就是该Service类名第一个字母小写。

Domain约定。

所有domain类都放在grails-app/domain文件夹中,doamin类所有字段默认都被持久化,不论字段访问范围(如public,private等)。类名将为表名,类中的字段名对应表中的字段名,不论类名、类中的字段名,如果是驼峰的,Grails将使用下划线+小写代替大写。

实体的实例,包括20个实例方法:

	* Object attach()
	* void clearErrors()
	* void delete()
	* void delete(Map)
	* void discard()
	* Errors getErrors()
	* Map getProperties()
	* Boolean hasErrors()
	* Serializable ident()
	* boolean instanceOf(Class)
	* boolean isAttached()
	* Object lock()
	* Object merge()
	* Object merge(Map)
	* Object mutex(Closure)
	* Object refresh()
	* Object save()
	* Object save(Map)
	* Object save(boolean)
	* BindingResult setProperties(Object)
	* String toString()
	* boolean validate()
	* boolean validate(boolean)
	* boolean validate(List)
	* boolean validate(Map)

包含70个静态方法:

* static Integer count()
* static Criteria createCriteria()
* static void deleteAll(Object[])
* static void deleteAll(Iterable)
* static List executeQuery(String)
* static List executeQuery(String, Collection)
* static List executeQuery(String, Map)
* static List executeQuery(String, Collection, Map)
* static List executeQuery(String, Map, Map)
* static Integer executeUpdate(String)
* static Integer executeUpdate(String, Map)
* static Integer executeUpdate(String, Collection)
* static Integer executeUpdate(String, Collection, Map)
* static Integer executeUpdate(String, Map, Map)
* static boolean exists(Serializable)
* static Object find(Object)
* static Object find(String)
* static Object find(Closure)
* static Object find(Object, Map)
* static Object find(String, Map)
tatic Object find(String, Collection)
* static Object find(String, Collection, Map)
* static Object find(String, Map, Map)
* static List findAll()
* static List findAll(Object)
* static List findAll(String)
* static List findAll(Closure)
* static List findAll(Object, Map)
* static List findAll(String, Map)
* static List findAll(String, Collection)
* static List findAll(Map, Closure)
* static List findAll(String, Map, Map)
* static List findAll(String, Collection, Map)
* static List findAllWhere(Map)
* static List findAllWhere(Map, Map)
* static Object findOrCreateWhere(Map)
* static Object findOrSaveWhere(Map)
* static Object findWhere(Map)
* static Object findWhere(Map, Map)
* static Object first()
* static Object first(String)
* static Object first(Map)
* static Object get(Serializable)
* static List getAll()
* static Integer getCount()
* static PersistentEntity getGormPersistentEntity()
* static Map getValidationErrorsMap()
* static Map getValidationSkipMap()
* static Object last()
* static Object last(String)
* static Object last(Map)
* static List list()
* static List list(Map)
* static Object load(Serializable)
* static Object lock(Serializable)
* static Object merge(Object)
* static Object proxy(Serializable)
* static Object read(Serializable)
* static List saveAll(Iterable)
* static List saveAll(Object[])
* static DetachedCriteria where(Closure)
* static DetachedCriteria whereAny(Closure)
* static DetachedCriteria whereLazy(Closure)
* static Object withCriteria(Closure)
* static Object withCriteria(Map, Closure)
* static Object withDatastoreSession(Closure)
* static Object withNewSession(Closure)
* static Object withNewTransaction(Closure)
* static Object withSession(Closure)
* static Object withTransaction(Closure)
static Object withTransaction(Closure)
* static Object withTransaction(TransactionDefinition, Closure)

© 著作权归作者所有

共有 人打赏支持
翟志军

翟志军

粉丝 339
博文 76
码字总数 79851
作品 2
深圳
程序员
grails最佳实践

我工作于IntelliGrape, 一个专用Groovy&Grails开发项目的公司. 本文列举了我们Grails项目遵循的几个基本的最佳实踐, 它们通过邮件, Stack Overflow, 博客, podcasts, 和公司内部的讨论收集....

大东哥
2012/04/10
5.2K
10
Grails 1.1 Beta 2 版本发布

Grails是一个构建在Java 和Groovy 之上的动态Web应用框架 ,利用Java EE 领域的最好的breed APIs 包括Spring, Hibernate 和 SiteMesh 。允许Java 开发者利用他们使用多年的已有知识和被证实配...

红薯
2008/12/27
348
0
grails的几点体会

直入主题。 一.开发效率 本人用grails,算是新手,边对着文档,边开发。大概5天时间,开发了这个网站。www.0dabc.cn。大概一个月开发出,www.nn580.com。本人觉得,开发效率确实觉对比传统的j...

大东哥
2009/07/30
1K
1
百草园内容管理系统--g2g0

什么是百草园? 一个免费的,可定制的开源内容管理系统(CMS. 它充分利用了Java 技术的Grails 开发框架作为坚强后盾,它将常见的 Spring 和 Hibernate 等 Java 技术与当前流行的约定优于配置...

hy0228
2013/01/19
10.5K
1
Java简易MVC框架--etmvc

etmvc是基于Java技术,为WEB开发提供的一套简易MVC框架。 简易但不简单,其设计和实现借鉴业界众多的优秀框架,如struts,spring mvc,ror,grails等, 力图为Java开发人员提供一套高效的开发框...

匿名
2009/07/01
9.7K
0
连续十几小时,追逐三大所谓的web-full-stack框架,我不玩了

现在心情很差,头脑很乱,会写得有点语无伦次。 我的需求很简单: 如:有个实体名叫Product,我需要:提供一个网站后台管理,卖家管理,顾客管理,分别对这个实体crud操作。命名方式我是想这样...

大东哥
2010/12/19
5.3K
20
JFinal和grails

最近在选择快速框架的时候发现JFinal和grail是两款不错开源快速框架,grail提供了大量的插件,支持groovy快速脚本,支持约定优于配置原则等。请问JFianl相比grail的优势在哪里?...

hawkfly
2013/01/18
2.1K
11
Griffon 1.0 正式发布,JVM 应用开发框架

Griffon开发团队近日发布了Griffon 1.0正式版。 Griffon是一个用于开发基于JVM的桌面应用程序的框架,使用Groovy作为主要语言。受 Grails的启发,Griffon遵循“约定优于配置(Convention ov...

oschina
2012/06/11
1K
3
Grails 1.2参考文档速读系列

一个很好的Grails中文参考资料。 Grails 1.2参考文档速读(1):第1、2章 Grails 1.2参考文档速读(2):配置基础和环境 Grails 1.2参考文档速读(3):日志配置 Grails 1.2参考文档速读(4...

groovyland
2010/02/25
0
1
关于Grails reload gsp页面的解决办法

以前因为一直在边玩着边学习grails,一直没有仔细研究部署问题。 现,正式用grails开发一个公司的小网站,发现grails应用在打包成war文件发布时,修改gsp页面,服务器不会reload。这个问题受...

大东哥
2009/09/06
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ES15-JAVA API 索引管理

1.创建连接 创建连接demo package com.sean.esapi.client;import java.net.InetSocketAddress;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.clien......

贾峰uk
1分钟前
0
0
单点登录的设计,从单域名到多域名(经验分享)

个人实践总结,最初的的需求,多个产品线都在同一个根域名下面。 独立的用户中心分离,单独负责用户登录和用户信息获取、变更等处理逻辑。 第一步,用户登录成功,分配给用户一个memToken(令...

小海bug
2分钟前
0
0
合格前端第十二弹-TypeScript + 大型项目

写在前面 TypeScript 已经出来很久了,很多大公司很多大项目也都在使用它进行开发。上个月,我这边也正式跟进一个对集团的大型运维类项目。 项目要做的事情大致分为以下几个大模块 一站式管理...

qiangdada
6分钟前
0
0
编程学习之如何在Node.js中优化服务器端渲染?[图]

编程学习之如何在Node.js中优化服务器端渲染?[图] 在 Airbnb,我们花了数年时间将所有前端代码迁移到 React 架构,Ruby on Rails 在 Web 应用中所占的比例每天都在减少。实际上,我们很快会...

原创小博客
8分钟前
0
0
gradle学习笔记

相关文档 适合新手的 gradle 自学教程合集 Gradle教程

OSC_fly
22分钟前
0
0
Virtual Serial Port - RFC2217

Virtual Serial Port for Linux RFC-2217 The COM Port Control Protocol pyserial - RFC 2217 NetSerial - Windows Telnet COM Port - RFC Official Using Python, How do I make a virtual......

zungyiu
29分钟前
0
0
全球的IPv6部署急剧增加,中国进度较慢

导读 全球的IPv6部署继续增加,但中国在IPv6方面还需要努力,从部署图上分析,中国几乎没有几个地方是普及IPv6的。这6年来,自世界IPv6发布以来,全球网络和服务提供商的IPv6部署水平急剧增加...

问题终结者
33分钟前
0
0
好看的电影记录

星际迷航三 狂暴之路 新木乃伊 黑夜传说 铁血战士2

xd03122049
36分钟前
0
0
记录Yii2框架开发遇到微信错误提示

转载地址 记录Yii2框架开发遇到微信错误提示 微信公共号开发,提示“该公众号暂时无法提供服务,请稍后再试”,如何解决? 以前使用Yii框架的时候,并没有像Yii2,以前的Yii框架似乎用起来在...

durban
38分钟前
1
0
LSM树(Log-Structured Merge Tree)存储引擎浅析

其实每一种数据库,它都是一种抽象的数据结构的具体实现。 随着rocksDB(facebook的),levelDB(google的),以及我们熟知的hbase,他们都是使用的LSM树结构的数据库。 它的核心思路其实非常...

算法之名
52分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部