快速业务通道

精通Grails: 用定制URI和codec优化Grails中的URI - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
>

${entryInstance.author} 在 User 类上调用 toString() 方法。也可以使用 ${entryInstance.author.name} 来显示您所选择的字段。还可以使用此语法随心所欲地遍历这些类的嵌 套结构。

现在,我们就可以看看所做的这些变更的实际效果了。键入 grails run-app 并在 Web 浏览器内访问 http://localhost:9090/blogito/。屏幕应该类似于图 1:

图 1. 显示了新添加的作者的条目

现在 Blogito 可以支持多个用户,下一步是让读者能按作者来查看这些条目。

精通Grails: 用定制URI和codec优化Grails中的URI(4)

时间:2011-08-02 IBM Scott Davis

按作者显示条目

我们的最终目的就是支持像 http://localhost:9090/blogito/entry/list/jdoe 这样的 URI。注意到 ,User.login 出现在此 URI 内,而不是主键。在这个过程中,还需要对分页(pagination)做稍许调整 。

EntryController.list 的搭建(scaffolded)行为不允许按 User 过滤。清单 5 显示了 list 闭包 的默认实现:

清单 5. 默认的 list 实现

def list = {    if(!params.max) params.max = 10    [ entryInstanceList: Entry.list( params ) ] }

若要支持在路径的末尾允许出现一个可选的用户名,还需要对之进行扩展。编辑 grails- app/controllers/EntryController.groovy 并添加一个新的 list 闭包,如清单 6 所示:

清单 6. 按作者限制此列表

class EntryController {   def scaffold = Entry    def list = {     if(!params.max) params.max = 10     flash.id = params.id     if(!params.id) params.id = "No User Supplied"     def entryList     def entryCount     def author = User.findByLogin(params.id)     if(author){      def query = { eq(''author'', author) }      entryList = Entry.createCriteria().list(params, query)      entryCount = Entry.createCriteria().count(query)     }else{      entryList = Entry.list( params )      entryCount = Entry.count()     }     [ entryInstanceList:entryList, entryCount:entryCount ]   } }

精通Grails: 用定制URI和codec优化Grails中的URI(5)

时间:2011-08-02 IBM Scott Davis

您应该注意到的第一件事情是,若终端用户没有提供 params.max 和 params.id 二者的值,就用默认 值填充。现在,先不要担心 flash.id — 我稍后在探讨有关分页问题的时候还会对之进行详细讨论。

params.id 值通常是一个整型 — 确切的说是主键。我们一般习惯于 /entry/show/1 和 entry/edit/2 这样的 URI。我本可以在 grails-app/conf/UrlMappings.groovy 内设置一个映射以便返 回一个描述性更好的名称,比如 params.name 或 params.login,但现有的映射已经获取了操作名称后的 路径元素并将其存储在 params.id 内。我只是充分利用了现有的行为。在 URLMapper.groovy 内,如清 单 7 所示,可以看到返回 params.id 的默认映射:

清单 7. UrlMappings.groovy 内的默认映射

class UrlMappings {    static mappings = {     "/$controller/$action?/$id?"{      constraints {}    }    //snip   } }

由于这不是 User 的主键,所以不能像往常那样使用 User.get(params.id)。相反,必须使用 User.findByLogin(params.id)。

如果找到了一个匹配的 User,就需要创建一个查询块。这就需要用到 Hibernate Criteria Builder 。在本例中,我们限制了列表只包含匹配某特定作者的那些条目。同样地,我们注意到 GORM 也允许您从

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号