天天看點

來玩Play架構02 響應

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

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

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

在開發代碼之前,先簡單介紹如何使用Eclipse,開發Play項目。

在項目的根目錄下,使用指令:

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

Java是靜态語言,可以在編譯時就決定對象的類型,是以能友善的實作代碼自動提示補齊、自動尋找類所在的包并import。在寫程式的過程中,也能有很多友好提示。

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

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

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

來玩Play架構02 響應

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

#開始的行是注釋

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

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

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

一個動作必須是一個靜态(static)的方法。一個動作傳回一個Result類型的對象。ok("Hello World!")傳回的就是這麼一個Result對象,代表了一個HTTP響應。ok()傳回的響應都是200狀态,即ok(正常回複)。在這個例子中,響應的主體内容為"Hello World!"。

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

來玩Play架構02 響應

根據network工具的監視,響應的狀态碼為200。響應的類型為text/plain。這是ok()生成Result對象時自動決定的。我可以手動控制響應類型,比如将index()的傳回語句改為:

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

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

這些方法傳回對應的狀态碼。浏覽器根據狀态碼和回複的内容,做出反應。比如收到303時,重新定向到新的URL。

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

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

練習

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

修改routes,并驗證效果。

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

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

POST方法常用于向伺服器送出資料。我将在以後深入。

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

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

當我們通路/record/1234時,id就是1234。對應的動作包含有一個參數,來接收id變量。我這裡把參數類型定義為Long。Play将負責類型的轉換。

相應的record()動作為:

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

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

如果我們通路/newRecord/abc/def,那麼name将對應字元串"abc/def"

動作、控制器、URL路由

ok()

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

如果你喜歡這篇文章,歡迎推薦。