HTTP路由
路由是一个负责将HTTP请求转换成对动作(控制器的一个公共静态方法)调用的组件。
一个HTTP请求被MVC框架看做是一个事件。事件的信息包括两个不部分
- 请求的路径,包括查询字符串。
- HTTP方法(GET、POST、PUT、DELETE)
关于REST
REST(Representational state transfer)直译过来是“表现性状态传递”,字面意思看不出真实含义。
REST的几个关键设计原则:
- 应用程序的功能划分为资源
- 每一个资源由一个URI唯一指定
- 所有资源在客户端和资源间转移状态的时候共享统一的接口。
路由文件语法
[@conf/routs@]文件用来配置应用的路由规则,每一条路由由HTTP方法 + URI模式 + Java方法组成。可以使用[@#@]写注释
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@]包是隐含的。
静态参数
可以使用指定的参数定义已有路由的别名,比如:
bc. GET /home Application.page(id:’home’)
就是用”home”做id,定义了下面这条路由的URL别名:
bc. GET /pages/{id} Application.page
变量和脚本
在[@routes@]文件中,可以用[@${…}@]引用变量,用[@%{…}@]定义脚本,例如:
bc.. %{ context = play.configuration.getProperty(‘context’, ‘’) }%
Home page
GET ${context} Secure.login
GET ${context} Secure.login
路由优先级
很多路由项可以匹配相同的URL请求,如果有冲突的话,将按照在route文件中声明的顺序,匹配最前面的路由项。
例如:
bc. GET /clients/all Clients.listAll
GET /clients/{id} Clients.show
对于这样的定义,下面的URI请求:
bc. /clients/all
将被第一个路由项拦截,并调用 Clients.listAll(尽管第二个路由项也匹配该请求)。
处理静态资源
使用 staticDir 作为特殊的action方法,可以将指定的文件目录公开为静态资源文件的容器。
例如:
bc. GET /public/ staticDir:public
当请求路径与 /public/* 匹配时,Play会从 /pubic 文件夹目录中取得静态资源文件。路由优先级也适用于这种静态资源的路由项。