時間 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.