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 文件夹目录中取得静态资源文件。路由优先级也适用于这种静态资源的路由项。