快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
将空白转变为下划线。要实现此目的,需要创建一个定制 codec(即 编码-解码器 的简写)。

创建 grails-app/utils/UnderscoreCodec 并添加清单 10 所示代码:

清单 10. 一个定制 codec

class UnderscoreCodec {   static encode = {target->    target.replaceAll(" ", "_")   }   static decode = {target->    target.replaceAll("_", " ")   } }

Grails 提供了几个开箱即用的内置 codec:HtmlCodec、UrlCodec、Base64Codec 和 JavaScriptCodec。HtmlCodec 是所生成的 GSP 文件内的 encodeAsHtml() 和 decodeHtml() 方法的源代 码。

您也可以向其中添加您自己的 codec。Grails 使用 grails-app/utils 目录内任何一个具有 Codec 后缀的类来将 encodeAs() 和 decode() 方法添加到 String。在本例中,Blogito 内的所有 String 都 魔法般地具有了两个新方法:encodeAsUnderscore() 和 decodeUnderscore()。

通过在 test/integration 内创建 UnderscoreCodecTests.groovy 可以验证这一点,如清单 11 所示 :

清单 11. 测试一个定制 codec

class UnderscoreCodecTests extends GroovyTestCase  {   void testEncode() {    String test = "this is a test"    assertEquals "this_is_a_test", test.encodeAsUnderscore()   }   void testDecode() {    String test = "this_is_a_test"    assertEquals "this is a test", test.decodeUnderscore()   } }

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

时间:2011-08-02 IBM Scott Davis

在命令行提示符键入 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) par

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号