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.