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.

相關文章
相關標籤/搜索