通过grails-app/conf下的UrlMappings.groovy可以很容易的管理项目URL的配置文件。
class UrlMappings {
static mappings = {
}
}
基本URL配置
“/student”(controller:”student”, action:”list”)
首先前面的就是我们的URL的部分,当然是相对于项目的根URL的,那么当我们访问http://baseURL/student的时候就会转向student controller中的list action。当然,如果你已经配置了student controller的默认action为list的话,这里也可以简写为:
“/student”(controller:”student”)
默认情况下你的action是index,你可以通过在controller中设置你需要的默认action:
static defaultAction = “list”
上面的配置还有一种写法:
“/student” {
controller = “student”
action = “list”
}
映射到View
static mappings = {
“/”(view:”/index”) // 映射到根目录下的index.gsp
}
static mappings = {
“/aboutus”(controller:”site”,view:”aboutUs”) // 映射到controller下的某视图
}
映射到返回代码
static mappings = {
“403″(view: “/errors/forbidden”)
“404″(view: “/errors/notFound”)
针对不同的异常mapping到不同的controller或action
static mappings = {
“403″(view: “/errors/forbidden”)
“404″(view: “/errors/notFound”)
针对不同的异常mapping到不同的controller或action
“500″(controller: “errors”, action: “illegalArgument”,
exception: IllegalArgumentException)
“500″(controller: “errors”, action: “nullPointer”,
exception: NullPointerException)
“500″(controller: “errors”, action: “customException”,
exception: MyException)
“500″(view: “/errors/serverError”)
}
带参数URL
static mappings = {
“/student/$name”(controller:”student”)
}
注意到上面配置中特殊的地方就是$name,Grails会将URL中$name位置的内容当成参数放在params里面。假设StudentController有如下Action:
class StudentController {
def index = { render params.name }
}
如果访问/student/andrew的时候andrew会被显示在返回页面中,当然URL中可以包括很多的这种参数。我们也可以在URL使用可选变量
static mappings = {
“/$year/$month?/$day?”(controller:”student”, action:”list”)
}
映射不同的HTTP请求
‘/test/httpmethod’{
controller=’testUrlMappings’
action=[GET:'getAction', POST:'postAction']
}
通配符的使用
static mappings = {
“/site/*.html”(controller:”html1″)//1
“/site/$name.html”(controller:”html2″)//2
“/site/**.html”(controller:”html3″)//3
“/site/$name**.html”(controller:”html4″)//4
}
下面配置的1和2都会将类似/site/aboutus.html转发到指的controller中,不同的是我们可以在2的controller中通过params.name得到与通配符所匹配的值,这里是aboutus。3和4里面包含两个*号,也就是两级的通配,所以类似/site/aboutus.html和/site/exernal/aboutus.html的URL都会被转发到指定的controller中。
在Mapping中使用Constraints
“/$company/$insidername?” {
controller = {
(request.serverName.startsWith(‘insidertrading‘)) ? ‘trades’ : false
}
action=”company”
constraints {
company(validator: {
!['css', 'images','js','dashboard','newsletter'].contains(it)
})
}
}
命名的URLMappings
‘/test/${name}/httpmethod’{
controller=’testUrlMappings’
action=[GET:'getAction', POST:'postAction']
}
在这种情况下,如果我们使用
<g:link controller='testUrlMappings' action='getAction' params="[name:12]">
是不能正确的解析出我们配置的URL的。虽然我们可以通过类似:
<a href="${application.contextPath}/testUrlMappings/${name}/ httpmethod ">
的方式使用我们的URL,但是这种方式在维护起来不是很方便,所以这不是理想的方式。我们可以采用命名URLMappings来解决这个问题,例如,
name nameTest:”/test/${name}/httpmethod”{
controller=’testUrlMappings’
action=[GET:'getAction', POST:'postAction']
}
然后在使用的地方可以采用如下写法,这样我们就得到了URLMapping中所设置的URL了
<g:link mapping=”nameTest” params=”[name:15]“>
对于有一些不想做Mapping的URL,我们可以使用excludes来将其排除在外。如下代码所示:
static excludes = ['/sitemap.xml', '/robots.txt', '/plan.html', '/']
最后欢迎大家访问我的个人网站:1024s