`
klcwt
  • 浏览: 190116 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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")












分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics