技术开发 频道

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

  运行中的 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 条目  

0
相关文章