Tomás Lin在其博客中公布了一套面试Grails开发人员的题目,本站将陆续公布问题的答案。今天公布的是控制器部分的试题回答。
控制器篇
- 请解释一下Grails中,Controller与Service的区别。
- Controller属于Web层的范畴,主要作用是为View的显示做好准备工作,或是针对请求准备好响应的数据。每次请求创建新实例
- 服务层的作用是封装复杂业务逻辑,尤其是这种逻辑涉及到多个Domain Class的时候。
- 什么是flash对象?在Grails应用中,flash对象有替代用法么?
Flash对象是在会话中临时保存的map,可用于下一次请求。在下一次请求结束后,该对象会自动清除。
可以使用chain代替flash,用法:
chain(action:"a", model:[one:1],params:[p:"v"])
params.list(friendName)
首先在grails-app/conf/Config.groovy中,使用grails.mime.types告诉Grails需要支持哪些HTTP请求类型,这个属性缺省已经配置:
grails.mime.types = [
html: ['text/html','application/xhtml+xml'],
xml: ['text/xml', 'application/xml'],
text: 'text/plain',
js: 'text/javascript',
rss: 'application/rss+xml',
atom: 'application/atom+xml',
css: 'text/css',
csv: 'text/csv',
all: '*/*',
json: ['application/json','text/json'],
form: 'application/x-www-form-urlencoded',
multipartForm: 'multipart/form-data'
]
在Controller中可根据HTTP请求的类型,确定返回的内容:
import grails.converters.*
class BookController {
def books def list = {
this.books = Book.list()
withFormat {
html bookList:books
js { render "alert('hello')" }
xml { render books as XML }
}
}
}
可以使用grails.converters.XML或者grails.converters.deep.XML。
缺省情况下,redirect()方法是用的是302重定向。但是如果要修改可使用如下方法:
redirect(action: "list")
//变更为
response.setStatus(301)
response.setHeader("Location", "list")
请记住:Grails Filter != JEE Filter。Grails实际上就是grails-app/conf下以Filters结尾的Groovy类。Grails的Filter同样有Filter链的概念,它本质上是由多个filter定义组成,定义顺序=执行顺序。Filter应用的范围可以是针对Controller和Action。

最新评论
9 周 6 小时之前
9 周 1 天之前
11 周 5 天之前
11 周 5 天之前
17 周 2 天之前
17 周 4 天之前
19 周 3 天之前
20 周 1 天之前
20 周 2 天之前
20 周 5 天之前