首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

play2.0文档-面临java开发者(2)

2012-06-26 
play2.0文档-面向java开发者(2)?HTTP routing内置的HTTP routerrouter?组件的功能是把收到的HTTP request

play2.0文档-面向java开发者(2)

?

HTTP routing
内置的HTTP router

router?组件的功能是把收到的HTTP request 转换成对action的调用(controller 里的一个 static,public 方法).

一个HTTP请求被MVC框架看作是一个事件,这个事件包含两个主要的信息:

  • 请求路径(例如?/clients/1542,?/photos/list),包括查询字符串.
  • HTTP 方法(GET, POST, ...).

    Routes 是在?conf/routes?文件中定义的,它会被编译,也就是说你可以直接在浏览器中看到route的错误。

    play2.0文档-面临java开发者(2)

    routes 文件语法

    conf/routes?是router使用的配置文件。这个文件列出了应用程序所需要的所有routes。每个route由一个HTTP方法和一个与action调用相关联的 ?URI pattern??组成。

    来看一下route是怎样定义的:

    GET   /clients/:id          controllers.Clients.show(id: Long)  

    注意在对action的调用中,参数类型在参数名称的后面,这有点像scala的定义方式。

    每个route的开头是 HTTP方法,后面跟着 URI pattern?,最后面定义了会调用哪个action。

    你也可以在route文件中添加评论,用?#?来标识:

    # Display a client. GET   /clients/:id          controllers.Clients.show(id: Long)  

    HTTP 方法

    ?

    HTTP方法可以是HTTP支持的任何一种有效的方法(GET,?POST,PUT,?DELETE,?HEAD).

    URI pattern

    URI pattern表示route的请求路径. 这个请求路径的某些部分可以是动态的。

    静态路径

    例如,为了提取与?GET /clients/all?相匹配的请求,你可以这样定义:

    GET   /clients              controllers.Clients.list()

    动态部分

    如果你想定义一个通过id来获取一个client的路由,你就需要添加一个动态的部分:

    GET   /clients/:id          controllers.Clients.show(id: Long)  

    注意一个URI?pattern?可以有不止一个动态部分.

    对于动态部分的默认匹配策略是由正则表达式?[^/]+?定义的,这意味着任何被定义成?:id?的动态部分将会被准确的匹配到一个URI的路径部分。

    跨越多个/的动态部分

    如果你想用一个动态部分来捕获多个独立的URI路径段, 你可以使用正则表达式的*id?语法来定义一个动态部分:

    GET   /files/*name          controllers.Application.download(name)  

    对于一个像?GET /files/images/logo.png 的请求来说,name的动态部分将会捕获?images/logo.png 这个值

    自定义的正则表达式动态部分

    你也可以使用$id<regex>?语法来为动态部分定义自己的正则表达式:

    GET   /clients/$id<[0-9]+>  controllers.Clients.show(id: Long)  

    调用action的产生器方法

    route定义的最后一部分是调用。这部分必须定义一个有效的对action方法的调用。

    如果方法没有定义任何参数,就只需给出一个合法的方法名:

    GET   /                     controllers.Application.homePage()

    ?

    如果action方法定义了参数,相对应的参数值需要从请求的URI中寻找,或者从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)

    这是一个 在?controllers.Application?中定义的与show方法对应的controller

    public static Result show(String page) {   String content = Page.getContentOf(page);   response().setContentType("text/html");   return ok(content); }

    参数类型
    对于String类型,参数类型是可选的。如果你想把收到的参数转换成指定的scala类型,你可以显示的添加上。
    GET   /client/:id           controllers.Clients.show(id: Long)

    并且在controller中相应的action方法参数也需要使用相同的类型。

    public?static?Result?show(Long?id)?{

    ? Client?client?=?Client.findById(id);?

    ? return?ok(views.html.Client.show(client));

    }

    注意:参数类型是使用后缀语法定义的,泛型是使用[] 符号定义,而不是像java一样使用<>定义。例如,

    List[String]和Java??List<String>是同一种类型


    带有固定值的参数

    有时候你可能想使用固定值作为参数:

    # 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: Integer ?= 1)

    路由优先级

    许多routes可以匹配相同的请求,如果有冲突的话就会使用声明中的第一个route。

    反转路由

    router可以根据一个java调用来产生一个URL。这使得在一个配置文件里集中配置所有你的URI pattern变得可能,这样,当你做重构是就会更加自信。

    对于routes文件中的每一个controller,router都会在?routes 包里生成一个'反转controller', 它有相同的action方法,相同的特征,但是返回的却是一个?play.mvc.Call而不是?play.mvc.Result。

    ?play.mvc.Call?定义了一个HTTP 调用,而且还提供了HTTP方法和URI.

    举个例子,如果你创建一个像这样的controller:

    package controllers;?

    import play.*;?

    import play.mvc.*;?

    public class Application extends Controller {

    public static Result hello(String name) {

    return ok("Hello " + name + "!");

    }

    }

    And if you map it in the?conf/routes?file:

    然后你在conf/routes文件中配置映射关系:

    # Hello action GET   /hello/:name          controllers.Application.hello(name)

    你就可以通过使用controllers.routes.Application?反转 controller把?URL反转到?hello?action 方法

    // Redirect to /hello/Bob?

    public?static?Result?index()?{?

    ??return?redirect(controllers.routes.Application.hello("Bob"));

    }

    ?

  • 热点排行