routes - niubods/playframework-notes GitHub Wiki
路由是一个负责将HTTP请求转换成对动作(控制器的一个公共静态方法)调用的组件。
一个HTTP请求被MVC框架看做是一个事件。事件的信息包括两个不部分
- 请求的路径,包括查询字符串。
- HTTP方法(GET、POST、PUT、DELETE)
REST(Representational state transfer)直译过来是“表现性状态传递”,字面意思看不出真实含义。
REST的几个关键设计原则:
- 应用程序的功能划分为资源
- 每一个资源由一个URI唯一指定
- 所有资源在客户端和资源间转移状态的时候共享统一的接口。
#
写注释
HTTP方法可以是:GET、 POST、 PUT、 DELETE、 HEAD。还支持WS
表示WebSocket请求。如果使用*
,表示匹HTTP请求的任意方法。
URI模式可以是静态字符串,也可以包含动态内容,动态内容部分要加花括号{...}
如:/clients/{id}
默认的动态内容匹配策略是匹配除了斜线/
的任意字符,当然也可以自定义匹配策略可以用正则表达式来定义匹配策略,正则表达式要加尖括号<...>
如,只接受数字:/clients/{<[0-9]+>id}
注:动态部分都是有名字的,可以从控制器的params这个map对象中取出来。
路由定义中最后一项是java方法调用,使用java方法的全限定名称。action方法必须是public static void
方法,控制器类必须定义在controllers
包中而且必须是play.mvc.Controller
的子类。
如果控制器类不是定义在controllers
包中,需要在类名前加包名,否则就不需要,因为controller
包是隐含的。
可以使用指定的参数定义已有路由的别名,比如:
GET /home Application.page(id:'home')
就是用"home"做id,定义了下面这条路由的URL别名:
GET /pages/{id} Application.page
在routes
文件中,可以用${...}
引用变量,用%{...}
定义脚本,例如:
%{ context = play.configuration.getProperty('context', '') }%
# Home page GET ${context} Secure.login GET ${context}/ Secure.login
很多路由项可以匹配相同的URL请求,如果有冲突的话,将按照在route文件中声明的顺序,匹配最前面的路由项。
例如:
GET /clients/all Clients.listAll
GET /clients/{id} Clients.show
对于这样的定义,下面的URI请求:
/clients/all
将被第一个路由项拦截,并调用 Clients.listAll(尽管第二个路由项也匹配该请求)。
使用 staticDir 作为特殊的action方法,可以将指定的文件目录公开为静态资源文件的容器。
例如:
GET /public/ staticDir:public
当请求路径与 /public/* 匹配时,Play会从 /pubic 文件夹目录中取得静态资源文件。路由优先级也适用于这种静态资源的路由项。