Play官方文档翻译2: HTTP routing

play:http://www.playframework.com/documentation/2.3.x/JavaRouting

下一篇:

内容:

内置的HTTP路由
router翻译进来的http请求,路由到一个action.

一个http请求可以看作是一个MVC框架的事件,这个事件包含2个主要的信息:
请求路径,比如/clients/1542, /photos/list,包含查询字符串。
HTTP的方法,(GET, POST, …)
Routes定义在conf/routes文件里,意味着你可以在浏览器里看到路由错误。

The routes file
conf/routes就是路由使用的配置文件,
每一个包含了HTTP方法和URI模式,以及调用的方法。

下面是一些例子:
GET   /clients/:id          controllers.Clients.show(id: Long)
在action call中,类型在名字之后。
每一个route以http方法开始,然后是uri模式,最后是方法定义。
#表示添加注释
# Display a client.
GET   /clients/:id          controllers.Clients.show(id: Long)
The HTTP method  (GET, POST, PUT, DELETE, HEAD).
The URI pattern

Static path
比如
GET   /clients/all          controllers.Clients.list()

动态部分
GET   /clients/:id          controllers.Clients.show(id: Long)
可以有多个动态部分。

Dynamic parts spanning several /
如果你想一个动态部分来对应多于一个的URI路径片段(以/隔开的),你可以使用下面的模式
GET   /files/*name          controllers.Application.download(name)
这里,如果一个请求:GET /files/images/logo.png, name就是images/logo.png

动态部分
也可以使用下面的方式 $id<regex> syntax:
GET   /items/$id<[0-9]+>    controllers.Items.show(id: Long)

如果方法不定义任何参数,仅仅定义方法名。
GET   /                     controllers.Application.homePage()

如果方法定义了参数,对应的参数值将在请求URI中寻找,或者URI路径或者查询字符串。
# Extract the page parameter from the path.
# i.e. http://myserver.com/index
GET   /:page                controllers.Application.show(page)
Or:
# Extract the page parameter from the query string.
# i.e. http://myserver.com/?page=index
GET   /                     controllers.Application.show(page)
还一个例子
public static Result show(String page) {
    String content = Page.getContentOf(page);
    response().setContentType("text/html");
    return ok(content);
}
参数类型
对于string类型的参数,参数类型是可选的,
如果你希望转化类型,你需要明确定义:
GET   /clients/:id          controllers.Clients.show(id: Long)
这样的话,方法可能就是:
public static Result show(Long id) {
    Client client = Client.findById(id);
    return ok(views.html.Client.show(client));
}
注意:
Note: The parameter types are specified using a suffix syntax. Also The generic types are specified using the [] symbols instead of <>, as in Java. For example, List[String] is the same type as the Java List<String>.

Parameters with fixed values
Sometimes you’ll want to use a fixed value for a parameter:

# Extract the page parameter from the path, or fix the value for /
GET   /                     controllers.Application.show(page = "home")
GET   /:page                controllers.Application.show(page)

给定默认值的参数

你可以提供一个默认值如果请求中没有附带值得话

# Pagination links, like /clients?page=3
GET   /clients              controllers.Clients.list(page: Int ?= 1)
Optional parameters
You can also specify an optional parameter that does not need to be present in all requests:

# The version parameter is optional. E.g. /api/list-all?version=3.0
GET   /api/list-all         controllers.Api.list(version ?= null)
Routing priority
Many routes can match the same request. If there is a conflict, the first route (in declaration order) is used.

反向路由
router可以用来在一个java call中产生一个URL,这可以集中所有的URI模式,可以优化工程。
对于每一个controller来说,router产生一个‘reverse controller’,有同样的action方法,同样的签名
但是返回一个play.mvc.call而不是play.mvc.Result.

The play.mvc.Call定义了一个HTTP call,提供HTTP方法和URI.

package controllers;

import play.*;
import play.mvc.*;

public class Application extends Controller {

    public static Result hello(String name) {
        return ok("Hello " + name + "!");
    }

}
如果你在 conf/routes file中这样定义:
# Hello action
GET   /hello/:name          controllers.Application.hello(name)
你可以将url引到hello方法,通过下面的方法:
// 重定向到/hello/Bob
public static Result index() {
    return redirect(controllers.routes.Application.hello("Bob"));
}
注意: 每个controller包有一个routes子包,
所以controllers.admin.Application.hello 对应着 controllers.admin.routes.Application.hello.

 

你可能感兴趣的:(play)