Grails中的約定
Grails是一個約定勝于配置的框架。以下是Grails在controller,servic,domain等方面的約定。
Controller和View的約定
-
所有的Controller類的命名都以
</li>Controller
結尾,并放在grails-app/controllers文件夾中 -
Controller中所有的
</li>public
方法,都可以被web請求訪問 -
在一個空的Controller中加入
</li>static scffold = true
或者static scaffold = <領域類的類名>
,運行時將會動態生成相應的controller腳手架和GSP頁面。 -
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) </ul>
-
如果一個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]) }
-
可以從
params
map中拿到web請求的參數,或者調用某個重載了bindData
的方法 -
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將自動使用該模板。
另外,
</li>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
混入。
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)