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