WEB开发网
开发学院软件开发Java 精通 Grails: 用定制 URI 和 codec 优化 Grails 中... 阅读

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

 2009-10-26 00:00:00 来源:WEB开发网   
核心提示: 在命令行提示符键入 grails test-app 运行测试,所看到的结果应该类似清单 12:清单 12. 测试成功运行后的输出$grailstest-app---Running2IntegrationTests...RunningtestUnderscoreCodecTests...testE

在命令行提示符键入 grails test-app 运行测试。所看到的结果应该类似清单 12:


清单 12. 测试成功运行后的输出
$ grails test-app 
------------------------------------------------------- 
Running 2 Integration Tests... 
Running test UnderscoreCodecTests... 
          testEncode...SUCCESS 
          testDecode...SUCCESS 
Integration Tests Completed in 157ms 
------------------------------------------------------- 

运行中的 Codec

UnderscoreCodec 也就绪后,您就可以支持在 URI 中包括用户和条目标题 — 比如,http://localhost:9090/blogito/blog/jsmith/this_is_my_latest_entry。

首先,调整 UrlMappings.groovy 内的 /blog 映射以支持一个可选的 $title,如清单 13 所示。还记得么,在 Groovy 内,尾部加个问号代表这是可选的。


清单 13. 在 URI 映射内允许可选标题
class UrlMappings { 
  static mappings = { 
   "/$controller/$action?/$id?"{ 
    constraints { 
  // apply constraints here 
  } 
  } 
  "/"(controller:"entry") 
  "/blog/$id/$title?"(controller:"entry", action="list") 
  "/entry/$action?/$id?/$title?"(controller:"entry") 
  "500"(view:'/error') 
 } 
} 

接下来,调整 EntryController.list 来说明新的 params.title 值,如清单 14 所示:


清单 14. 处理控制器内的 params.title
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" 
   flash.title = params.title 
   if(!params.title) params.title = "" 
 
   def author = User.findByLogin(params.id) 
   def entryList 
   def entryCount 
   if(author){ 
    def query = { 
     and{ 
      eq('author', author) 
      like("title", params.title.decodeUnderscore() + '%') 
     } 
    }  
    entryList = Entry.createCriteria().list(params, query)     
    entryCount = Entry.createCriteria().count(query) 
   }else{ 
    entryList = Entry.list( params ) 
    entryCount = Entry.count() 
   } 
    
   [ entryInstanceList:entryList, entryCount:entryCount ] 
 }  
} 

我已经在此查询内使用了 like 以让此 URI 更为灵活。例如,用户可以键入 /blog/jsmith/mastering_grails 来返回所有以 mastering_grails 开头的标题。如果您愿意更为严格一些,可以使用此查询内的 eq 方法来要求一个确切的匹配。

在 Web 浏览器内键入 http://localhost:9090/blogito/jsmith/Codecs_in_Grails 来观察运行中的这个新的 codec。您的屏幕应该类似图 4:


图 4. 按用户名和标题查看一个 blog 条目
精通 Grails: 用定制 URI 和 codec 优化 Grails 中的 URI

图片看不清楚?请点击这里查看原图(大图)。

结束语

URI 是一个 Web 应用程序的命脉。Grails 的默认设置是一个很好的开端,但是您也应习惯于定制这些 URI 以最好地满足您的 Web 站点的要求。得益于您的艰苦工作,Blogito 现在具有了 Users 和 Entries。但更为重要的是,您对 URI 使用其他内容而不是主键来查看它们。您了解了如何通过调整控制器代码创建更为友好的 URI、向 UrlMappings.groovy 添加映射以及创建一个定制 codec。

下一次,您将创建一个登录表单以便能对 Blogito Users 进行身份验证。一旦用户登录,他们就能上传一个文件用作 blog 条目的主体 — HTML、一个图像或是一个 MP3 文件。到那时,就可以享受精通 Grails 带来的乐趣了。

上一页  5 6 7 8 9 10 

Tags:精通 Grails 定制

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接