The Web Layer

The Web Layer
一个控制器要"处理请求(handles request)","创建或准备响应(response)","判断请求的范围"。
从另外一个方面讲,每个响应都会创建一个新的控制器。一个控制器能够产生响应(response)或者代理生成一个页面(view)。
创建一个控制器很简单。他的名称以Controller 结尾,还有把他放在grails/controller的目录下。


理解Controllers和Actions
创建Controller
在项目的根目录使用create-controller [name]命令创建。
grails create-controller book
class BookController { … }


创建一个actions
一个控制器的属性每一个都是代码块。每个属性的名称映射一个uri。
class BookController {
def list = { // do controller logic
// create model return model
}
}
URI是/root/book/list

默认的Action
有几个规则:
当action中没有定义明确的uri,你定义一个index属性,所有的请求将由它处理。
要么你就明确定义defaultAction 属性
def defaultAction = "list"

控制器和范围(scopes)
*servletContext javax.servlet.ServletContext
*session HttpSession
*request HttpServletRequest
*params 从CGI引入的一个参数
*flash

访问这些变量
def find = {
def findBy = params["findBy"]
def appContext = request["foo"]
def loggedUser = session["logged_user"] }
class BookController {
def find = {
def findBy = params.findBy
def appContext = request.foo
def loggedUser = session.logged_user }
}

使用Flash scope
flash是一个临时的存储变量,仅仅在两个request之间传递。

Models和视图
模型本质就是一个map,在返回时候,给view层使用。
有以下几种方式放回一个map的实例
def show = {
[ book : Book.get( params.id ) ]
}

class BookController {
List books
List authors
def list = {
books = Book.list()
authors = Author.list()
}
}
上面这些代码是线程不安全的。
使用Spring ModeAndView
import org.springframework.web.servlet.ModelAndViewdef index = {
def favoriteBooks = … // get some books just for the index page, perhaps your favorites // forward to the list view to show them
return new ModelAndView("/book/list", [ bookList : favoriteBooks ])
}

选择视图:
class BookController {
def show = {
[ book : Book.get( params.id ) ]
}
}
上面的代码并没有明确指定返回的视图,Grails怎么知道的了?是因为grails使用了约定。
grails将会自动查找grails-app/views/book/show.gsp(而实际上它会先查找jsp,因为grails 能够使用jsp)

如果你喜欢指定返回的页面和模型(render):
def show = {
def map = [ book : Book.get( params.id ) ]
render(view:"display", model:map)
}
定位在grails-app/views/book/display.gsp
这里默认的会查找book/display.gsp
如果想让它返回其他页面,看下面代码
def show = {
def map = [ book : Book.get( params.id ) ]
render(view:"/shared/display", model:map)
}
定位在grails-app/views/shared/display.gsp
返回一个简单的response
render "Hello World!"
// write some markup
render {
for(b in books) {
div(id:b.id, b.title)
}
}
// render a specific view
render(view:'show')
// render a template for each item in a collection
render(template:'book_template', collection:Book.list())
// render some text with encoding and content type
render(text:"<xml>some xml</xml>",contentType:"text/xml",encoding:"UTF-8")


Redirects 和 chaining
class OverviewController {
def login = {} def find = {
if(!session.user)
redirect(action:login)

}
}

redirect使用的是HttpServeltResponse
在同一个控制类中:
redirect(action:login)
在不同的action中
redirect(controller:'home',action:'index')
URI
redirect(uri:"/login.html")
url
redirect(url:"http://grails.org")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值