來玩Play框架02 響應

Vamei發表於2014-05-05

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段宣告。謝謝! 

 

我上一章總結了Play框架的基本使用。這一章裡,我將修改和增加響應。

HTTP協議是按照“請求-響應”的方式工作。Play框架的核心是用動作(Action)來完成“請求-響應”。一個動作負責處理一種請求。一個專案可能要定義許多動作。複雜的網站,可能要定義上百個動作。所以,Play使用控制器(Controller)和URL路由(URL routing)來組織管理動作。控制器用於給動作分類。URL路由(routes)記錄了URL和動作的對應關係。

 

IDE

在開發程式碼之前,先簡單介紹如何使用Eclipse,開發Play專案。

在專案的根目錄下,使用命令:

play eclipse

成功後,開啟Eclipse,在File->Import中,選擇General->Existing Projects into Workspace。在Select root directory中,選擇專案的根目錄。隨後,專案被引入Eclipse。

 

Java是靜態語言,可以在編譯時就決定物件的型別,因此能方便的實現程式碼自動提示補齊、自動尋找類所在的包並import。在寫程式的過程中,也能有很多友好提示。

後面的程式碼中,如果沒有寫明import的包,可以在Eclipse環境下自動尋找。

 

理解響應

我先來介紹控制器和URL路由。我以Play預設生成的動作為例講解。你可以在Play專案中找到下面檔案。

一個請求進入伺服器後,由URL路由引導到正確的動作來處理。URL路由根據請求的方法和URL來識別這一請求,再尋找對應動作。

 

URL路由是一個檔案,即專案根目錄下的conf/routes。檔案的每一行是一條記錄,規定了某個URL的對應動作。比如:

# Home page
GET     /                           controllers.Application.index()

#開始的行是註釋

記錄分為三個部分。第一部分為請求的方法,第二個部分為請求的URL,第三個是請求的對應動作。這裡Application是一個控制器,位於app/controllers/Application.java中。一個控制器也是一個Java類。而動作index()是類的一個方法。

 

我對預設生成的Application.java略作修改。新的app/controllers/Application.java為:

package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {

    public static Result index() {
        return ok("Hello World!");
    }

}

可以注意到,作為控制器的Application,需要繼承自Controller類。

一個動作必須是一個靜態(static)的方法。一個動作返回一個Result型別的物件。ok("Hello World!")返回的就是這麼一個Result物件,代表了一個HTTP響應。ok()返回的響應都是200狀態,即ok(正常回復)。在這個例子中,響應的主體內容為"Hello World!"。

 

你可以啟動Play伺服器,訪問上面的URL(localhost:9000/)。使用Chrome的network工具監視回覆。頁面如下:

根據network工具的監視,響應的狀態碼為200。響應的型別為text/plain。這是ok()生成Result物件時自動決定的。我可以手動控制響應型別,比如將index()的返回語句改為:

return ok("Hello World!").as("text/html");

這樣,響應的主體型別為html。

 

其它狀態的響應

 

除了ok()之外,Play還提供了其他的一些便捷方法,用以生成不同狀態的響應。這些方法的名字和狀態的名字相同,比如:

return badRequest("bad request"); // 400, 壞請求
return unauthorized("You are forbidden"); // 401, 未授權
return redirect("/new");    // 303, 重新定向

這些方法返回對應的狀態碼。瀏覽器根據狀態碼和回覆的內容,做出反應。比如收到303時,重新定向到新的URL。

 

此外,我還可以直接使用status()來說明數字形式的狀態碼

return status(200, "good");

 

更多的響應生成方式可參考Results

 

練習

在上面的控制器Application中,增加一個新的動作,用於顯示

<p>See you!</p>

修改routes,並驗證效果。

 

URL路由

URL路由是由一行一行的記錄組成的。上面我們看到了GET方法,還可以是其它HTTP方法,比如POST:

POST    /somePost                   controllers.Application.somePost()

我要在Application類中增加somePost()動作來處理該請求,比如:

public static Result somePost() {
    return ok("posted");
}

POST方法常用於向伺服器提交資料。我將在以後深入。

 

url還可以有使用者定義的變數,從而讓一行記錄對應不止一個請求,比如:

GET    /record/:id            controllers.Application.record(id: Long)

上面的:id是一個名為id的變數。":"是一個提示符。id將從":"開始,直到結束或者另一個"/"。

當我們訪問/record/1234時,id就是1234。對應的動作包含有一個引數,來接收id變數。我這裡把引數型別定義為Long。Play將負責型別的轉換。

相應的record()動作為:

public static Result record(Long id) {
    return ok("record:" + id.toString());
}

可以看到,該動作與之前的動作有點不一樣,它接受一個引數,即來自url的變數。

 

除了":"之外,還有另一個提示符"*"。與":"不同,"*"表示的區間不受"/"限制。

GET    /newRecord/*name           controllers.Application.newRecord(name: String)

如果我們訪問/newRecord/abc/def,那麼name將對應字串"abc/def"

 

總結

動作、控制器、URL路由

ok()

 

歡迎繼續閱讀“Java快速教程”系列文章

 

 

相關文章