时间 2014-08-27 21:30:57 引路蜂移动软件原文 http://www.imobilebbs.com/wordpress/archives/5357api
Play中的控制器(Controller)是用来处理HTTP请求(以URL标识的资源),例如在一个Play应用中咱们能够定义以下一些URL:浏览器
/products /product/5010255079763 /product/5010255079763/edit
使用Play应用的路由配置,咱们能够把这些URL映射到某个Controller的方法,一个URL对应一个方法。缓存
Controller类和Action方法ruby
根据前面定义的URL,咱们能够先开始定义一个Products控制类,它将包含四个Action方法分别来处理不一样的请求:list, details, edit和update,以下图:cookie
好比其中的list方法,用来处理/products HTTP请求,返回一个产品列表等。mvc
一个控制类在Play应用中,是一个派生于play.api.mvc.Controller类的对象,这个类提供了不少帮助编写Action方法的函数,尽管小的应用可能只须要使用一个Controller,当大多数状况使用多个Controller,每一个Controller包含多个相关的Action方法。框架
一个Action为Controller中定义的一个方法,它返回一个类型为play.api.mvc.Action的对象,你可使用以下方法来定义一个Action方法:wordpress
def list = Action { request => NotImplemented}
这定义了一个由Request => Result 的函数,用来处理一个HTTP请求并返回HTTP响应。这里NotImplemented为预约义的一个函数,它返回一个501 HTTP响应代表该方法还没有实现。Action方法也可使用参数,它传入解析后的HTTP请求中的参数。好比,若是你须要实现分页,你使用了一个pageNumber做为参数:函数
def list(pageNumber: Int) = Action { NotImplemented}
一般Action函数体中根据请求,读取或者跟新数据模型(Data Model),而后显示页面。 下面列出了咱们以前须要定义的几个函数的框架:ui
package controllers import play.api.mvc.{Action, Controller} object Products extends Controller { def list(pageNumber: Int) = Action { NotImplemented } def details(ean: Long) = Action { NotImplemented } def edit(ean: Long) = Action { NotImplemented } def update(ean: Long) = Action { NotImplemented } }
这四个Action方法,对应到下面三个URL
/products /product/5010255079763 /product/5010255079763/edit
没有第四个URL,这是由于其中update的URL也是有第二个URL,但它使用HTTP PUT方法,而不是使用GET方法,(有兴趣的能够参考REST设计),咱们可使用不一样的HTTP方法对同一个URL标识的资源进行不一样的操做。一般Web 浏览器可能只支持 GET和POST方法,若是你须要使用PUT 和 DELETE方法 的请求,你须要使用不一样的客户端,好比使用Javascript代码。
注:按照惯例,咱们一般使用复数名词做为Controller的类名称,好比以前的Products,而定义DataModel时,可能使用其单数形式好比Product。
Play应用中,一般使用Object来定义一个Controller对象,这是由于Controller不保存任何状态,它的做用是将多个Action分组,这也是你能看到的无状态的MVC模型的一个方面。所以在一个Controller对象中不要使用var来定义成员,它的成员只可使用val来定义。
HTTP以及Controller层面上的部分Scala API
Play应用将controllers, actions, request,和 response做为 trait来定义,它们都定义在play.api.mvc 包中。
注意:只引入play.api 包 ,play.mvc中定义的类和Scala Play应用无关(Java Play相关类)
下面一些trait和类封装了HTTP相关的一个概念,好比请求,响应和cookie
play.api.mvc.Cookie—HTTP cookie: 保存在客户端少许数据,能够做为请求的一部分。
play.api.mvc.Request—HTTP 请求: HTTP 方法, URL, headers, body,以及 cookies
play.api.mvc.RequestHeader—Request 元数据: 一个 name-value 对
play.api.mvc.Response—一个HTTP 响应, with headers and a body;
play.api.mvc.ResponseHeader—Response 元数据: a name-value 对
Controller API也定义本身的一些概念,好比Call,其它一些表明了额外的控制器功能,好比Flash,下面列出一些相关的类或trait:
play.api.mvc.Action— 一个函数,处理来自客户端的请求而后返回结果
play.api.mvc.Call— 一个HTTP 请求: 包含一个HTTP方法和URL
play.api.mvc.Content—一个HTTP 响应 ,包含content type和消息体
play.api.mvc.Controller—Controller 对象的基类
play.api.mvc.Flash— 一个临时数据存储,只对下一个请求有效,其它功能相似于Session。
play.api.mvc.Result— Action处理请求以后的返回值类型
play.api.mvc.Session—一组键-值, 保存在Cookie中
组合使用Action
有些时候,在多个Action方法中可能须要一些公用的函数,这可能会致使重复代码,好比访问控制,或者缓存一个返回结果以提升响应速度。一个经常使用的方法,是就这些公用的代码抽取出来定义成函数,好比:
def list = Action {// Check authentication.// Check for a cached result.// Process request...// Update cache. }
但使用Scala咱们有更好的方法,这意味着咱们能够将多个Action方法组合起来使用,好比:
def list = Authenticated { Cached { Action { // Process request... } } }
这个例子,咱们使用Action建立了一个函数,而后又传给Cached,紧接着又传给Authenticated.