The Web Layer

xiaoxiao2022-06-12  52

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")
转载请注明原文地址: https://www.6miu.com/read-4933888.html

最新回复(0)