精通 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')
}
}
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 ]
}
}
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
相关文章