作者: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快速教程”系列文章