Play Framework Web开发教程(22): Controllers–HTTP和Scala

http://www.tuicool.com/articles/eQvEbe

Play Framework Web开发教程(22): Controllers–HTTP和Scala之间的接口

时间 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

201400827001

好比其中的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.

相关文章
相关标签/搜索