http路由
在一般的网站框架中,http路由(以下简称路由)是一个组件。而它的功能是将每个从客户端获得的http请求转化为相应action
(指Controler的一个方法,一般是静态的)呼唤-CALL。
对于MVC框架来说,一个http请求会被视为一个事件。这个事件包含种信息。
1.请求路径,举例说(/clients/list) ,当然也包括查询字段。
2.http请求方法(GET,POST,PUT......),在下面会有详细的介绍。
编译好的路由在MVC框架中会存放在conf/routs文件里面
。这样你就可以在浏览器里看到错误信息。
路由文件:
所谓路由文件,在大多数的web框架中,都是conf/routes这个文件。它是一个供路由而设的配置文件。在这个文件里面,主要是一个列表,它列出了所有app的路径。每一个路径都包括一个请求方法和一个与呼唤action有关的URI。举例:
GET / clients /: id controllers . Clients . show ( id : Long )
如上:一个路由定义包括GET(请求方法)、URI( clients /: id )、一个对呼唤定义( controllers . Clients . show ( id : Long ) ) 。
当然,你也可以在路由文件中添加组件,只需要在前面加一个#
#Display a client
GET / clients /: id controllers . Clients . show ( id : Long )
http方法:
http方法有(GET,POST,PUT,DELETE,HEAD),其中,前面两个最常见。 HTTP请求格式
对于MVC框架来说,一个http请求会被视为一个事件。这个事件包含种信息。
1.请求路径,举例说(/clients/list) ,当然也包括查询字段。
2.http请求方法(GET,POST,PUT......),在下面会有详细的介绍。
编译好的路由在MVC框架中会存放在conf/routs文件里面
。这样你就可以在浏览器里看到错误信息。
路由文件:
所谓路由文件,在大多数的web框架中,都是conf/routes这个文件。它是一个供路由而设的配置文件。在这个文件里面,主要是一个列表,它列出了所有app的路径。每一个路径都包括一个请求方法和一个与呼唤action有关的URI。举例:
GET / clients /: id controllers . Clients . show ( id : Long )
如上:一个路由定义包括GET(请求方法)、URI( clients /: id )、一个对呼唤定义( controllers . Clients . show ( id : Long ) ) 。
当然,你也可以在路由文件中添加组件,只需要在前面加一个#
#Display a client
GET / clients /: id controllers . Clients . show ( id : Long )
http方法:
http方法有(GET,POST,PUT,DELETE,HEAD),其中,前面两个最常见。 HTTP请求格式
当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成:
l
请求方法URI协议/版本
l
请求头(Request Header)
l
请求正文
下面是一个HTTP请求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
URI模式:
URI模式是路由里面的请求路径。可以有动态的请求路径。
对于静态的URI: GET / clients / all controllers . Clients . list ()
对于动态的URI: GET / clients /: id controllers . Clients . show ( id : Long )
动态路由需要在方法后加上一个client的参数,在上例的路径前面有。一个动态的URI是可以有多个动态部分的。
如果你想你的动态部分更加,你可以使用斜杠“/”分割,比如:
URI模式:
URI模式是路由里面的请求路径。可以有动态的请求路径。
对于静态的URI: GET / clients / all controllers . Clients . list ()
对于动态的URI: GET / clients /: id controllers . Clients . show ( id : Long )
动态路由需要在方法后加上一个client的参数,在上例的路径前面有。一个动态的URI是可以有多个动态部分的。
如果你想你的动态部分更加,你可以使用斜杠“/”分割,比如:
GET /files/*name controllers.Application.download(name)
在这里,请求包括了name文件里面的所有文件。
同样,你也可以用正则表达式来定义你的动态部分,语法:$id<regex>
例如: GET / clients / $id <[ 0 - 9 ]+> controllers . Clients . show ( id : Long )
GET /clients/$id<[0-9]+> controllers.Clients.show(id: Long)
呼唤一个action
路由的最后一部分是一个呼唤。这个部分是必须定义而且能有效地去呼唤一个action方法。
如果该方法没有任何参数,只需要定义整一个方法名即可。
GET / controllers.Application.homePage()
如果该方法定义了参数,则这些参数将会从请求URI或者查询字段中找到。
# Extract the page parameter from the path.
# i.e. http://myserver.com/index
GET /:page controllers.Application.show(page)
或者
# Extract the page parameter from the query string.
# i.e. http://myserver.com/?page=index
GET / controllers.Application.show(page)
具体的show方法定义如下
public
static
Result
show
(
String
page
)
{ String content = Page.getContentOf(page);
response().setContentType("text/html");
return ok(content);
}
参数类型:
上述例子中的参数是String类型,事实上参数可以多种类型的。
如基本的(int,float,double,long等),对象(Interger,double等)
参数可以同时赋值,例如:
# Pagination links, like /clients?page=3GET /clients controllers.Clients.list(page: Integer ?= 1)
甚至,可以不需要用上所有在组件中已经定义的参数。比如:
# The version parameter is optional. E.g. /api/list-all?version=3.0
GET /api/list-all controllers.Api.list(version ?= null)
反向路由:
我们已经知道,路由可以通过一个JAVA CALL来产生一个URI。这样,所有的URI模式都可以放到一个简单的configuration文件里面。对于每一个Controller,路由都会产生对应的反向路由。它和路由一样有同样的action方法,同样的标记,但返回的是一个CALL而不是RESULT。
最后,我们举个例子:
如果有一个Controller:
package controllers;
import play.*;
import play.mvc.*;
public class Application extends Controller {
public static Result hello(String name){
return ok("Hello " + name + "!");
}
}
在conf/rotues文件里面:
# Hello action
GET /hello/:name controllers.Application.hello(name)