Play是一個Java Web敏捷開發的框架
http://www.playframework.com/documentation/1.2.7/homejavascript
之因此要翻譯這個教程,是由於實訓的時候敲定用這個做爲框架,因而我把相關教程翻譯給小夥伴學習學習。如今就乾脆放上來給你們分享分享css
在這個教程中,你將經過從頭至尾開發一個真正的Web應用來學習Play框架,在這個應用中,咱們將嘗試用上你將在真實項目中須要的每樣技術,同時介紹Play應用開發的最佳實踐。html
咱們把教程分割成相互獨立的各部分。每一個部分將介紹更爲複雜的特性,並提供真實項目須要的每樣東西:驗證,錯誤處理,框架安全,自動化測試組件,一個高大上的用戶界面,一個管理面板,等等。java
在本教程中的全部代碼都能被用於你的項目。咱們鼓勵你複製粘貼代碼片斷,整份搬去用也沒所謂。jquery
咱們將開發(又一個)博客引擎。這不是一個很是有想象力的選擇,可是它將容許咱們探索開發一個現代Web應用的大多數技術。git
爲了讓過程更加燃一點,咱們將對不一樣的角色(編輯者,管理員)設置不一樣的權限。數據庫
這個博客引擎將以yabe爲名。segmentfault
這個教程也已做爲範例隨下載包贈送。你能夠在samples-and-tests/yabe/文件夾下找到成品代碼。瀏覽器
首先,確保你已經安裝了Java平臺。Play須要Java 5或以上的版本。緩存
因爲咱們將須要頻繁使用命令行,最好仍是使用類Unix的操做系統。若是你用的是Windows,那也沒問題;就是打命令的時候須要打多一點。
咱們將假定你已經有Java和Web開發(特別是HTML,CSS和Javascript)經驗。不過,你不須要熟悉JavaEE全部組件。Play是一個全棧Java框架,它提供了或者封裝了你將須要的所有Java API。沒用必要知道如何配置JPA實體管理器或部署一個JavaEE組件。
你將須要一個文本編輯器。若是更喜歡使用大而全的Java IDE,好比Eclipse或NetBeans,你固然能夠用它。不過即便使用簡單的文本編輯器,好比Textmate,Emacs或Vim,你也能夠玩轉Play。由於框架自己會處理好編譯和部署的過程。咱們很快就會看到這一點了……
在教程的後面,咱們將使用Lighttpd和MySQL來展現如何在生產環境部署一個Play應用。但即便你沒用安裝這些,play也能夠運行,這不是個問題。
安裝過程如絲般順滑。從下載頁面下載最新的二進制包,而後在你喜歡的地方解壓它。
若是你用的是Windows,最好避免在路徑中混入空格。好比c:\play就是個比c:\Documents And Settings\user\play更好的選擇。
爲了方便操做,你須要添加Play文件夾到你的系統路徑中。這樣你就不須要在play命令前面敲一大通路徑名了。要想檢查安裝是否成功,打開一個新的命令行窗口,敲下play
;應該會出來play的基本使用幫助。
如今Play已經安好了,是時候開始寫博客應用。建立一個Play應用很是簡單,僅須要play命令行工具。以後會生成Play應用的基本架構。
打開一個新的命令行並敲入:
~$ play new yabe
它會提醒輸入應用的全名。輸入Yet Another Blog Engine。
play new
命令建立了一個新的文件夾yabe/外加一系列文件和文件夾。其中包括下面各部分:
app/ 包括應用的核心,劃分爲models,controllers和views文件夾。它也能夠包括其餘Java的包。這是.java
源代碼文件所在之處。
conf/ 包括全部的應用配置文件,特別是主application.conf文件,路由定義文件和用於國際化的信息文件。
lib/ 包括全部可選的Java庫,好比標準的.jar
。
public/ 包括全部能夠公開的資源,好比Javascript文件,樣式表和圖片。
test/ 包括全部的應用測試。測試能夠是Java的JUnit測試或者Selenium測試。
由於Play只使用UTF-8編碼,故全部的文本文件都須要使用UTF-8編碼。確保你的文本編輯器已經作了相應的配置。
若是你開發過Java應用,你可能會奇怪.class
文件到哪兒去了。答案是……沒有.class
文件了:Play並不使用任何class
文件;相反它直接處理Java源代碼。實際上咱們使用Eclipse的編譯器來即時編譯Java源代碼。
這致使了開發過程當中的兩點重要的改進。第一個,Play會自動監測Java源代碼的改變並在運行時自動重載。第二個,當一個Java異常發生時,Play能向你展現更好的錯誤報告 - 帶對應的源代碼的哦~
事實上Play在應用的tmp/文件夾下有字節碼的緩存,但只用於加速從新啓動項目的過程。若是須要,你能夠用
play clean
清空緩存。
如今看一下新建立的應用。回到命令行,切換到新建立的yabe/文件夾並輸入play run
。Play將加載應用,並在localhost:9000
啓動一個服務器。
用瀏覽器打開http://localhost:9000,你將看到新的應用。一個新的應用用一個標準的歡迎頁面,告訴你一切安好。
下面看看一個新應用是如何展現這個頁面的。
你的應用的主入口是conf/routes
文件。這個文件定義了應用中全部合法的URL。若是你打開這個文件,就會看到第一個'route':
GET / Application.index
這裏簡單地告訴Play,當服務器收到對/
路徑的一個GET請求,它要調用Java方法Application.index
。在這個例子中,Application.index
是controllers.Application.index
的縮寫,由於controllers
包是默認在內的。
當你建立單個Java應用時,你一般用main方法定義一個單一入口:
public static void main(String[] args) { ... }
Play應用有多個入口,每一個URL對應一個。咱們稱之爲action
方法。action
方法定義於被稱爲controllers
的類中。
讓咱們看一下controllers.Application
控制器長什麼樣子。打開yabe/app/controllers/Application.java
:
package controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }
注意控制器類拓展了play.mvc.Controller
。這個類提供了許多對控制器有用的方法,好比咱們在index action用到的render()
。
這個index action被定義爲public static void
方法。action方法都須要這樣定義。你能夠看到這些方法都是static的,由於控制器類永遠不會實例化。它們同時也是public的,這樣框架才能調用它們來響應URL請求。它們老是返回void。
這個index action很簡單:它調用render()
方法來渲染模板。使用模板是大多數狀況下生成HTTP響應的方式。(但不是惟一的方式)
模板是位於/app/views
的文本文件。由於咱們沒有指定一個模板,這個action就會使用默認的Application/index.html
。
打開/yabe/app/views/Application/index.html
看看模板長啥樣:
#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}
模板的內容簡單明瞭。事實上,你看到的所有是Play標籤。Play標籤就像是JSP標籤。#{welcome /}標籤生成了你看到的歡迎信息。
#{extends /}標籤告訴Play,這個模板是繼承自另外一個叫main.html
的模板。模板繼承是強大的特性,它容許你經過重用組件來建立複雜的Web頁面。
打開/yabe/app/views/main.html
:
<!DOCTYPE html> <html> <head> <title>#{get 'title' /}</title> <meta charset="${_response_encoding}"> <link rel="stylesheet" media="screen" href="@{'/public/stylesheets/main.css'}"> #{get 'moreStyles' /} <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}"> <script type="text/javascript" charset="${_response_encoding}" src="@{'/public/javascripts/jquery-1.5.2.min.js'}"></script> #{get 'moreScripts' /} </head> <body> #{doLayout /} </body> </html>
你看到靠近底部的#{doLayout /}標籤了嗎?這是插入Application/index.html
的內容的地方。
咱們來看看Play如何自動從新加載控制器文件。打開yabe/app/controllers/Application.java
,刪掉render()
後面的分號(來製造一個錯誤)
public static void index() { render() }
在瀏覽器刷新頁面。你能夠看到Play監測到文件的變化,並重載了應用控制器。但由於製造了錯誤,你將看到一個編譯錯誤。
Ok,如今更正錯誤,作一個真正的修改:
public static void index() { System.out.println("Yop"); render(); }
此次,Play正確地重載了控制器,替換掉JVM中的舊代碼。每次請求/
都會在控制檯輸出'Yop'信息。
你能夠移開那行輸出代碼,如今修改yabe/app/views/Application/index.html
模板,替換掉歡迎信息:
#{extends 'main.html' /} #{set title:'Home' /} <h1>A blog will be here</h1>
若是Java代碼改變了,只需刷新頁面,就能看到修改結果。
咱們尚未開始寫博客應用呢。你能夠選擇使用文本編輯器或者IDE,好比Eclipse或NetBeans。若是你想使用IDE,參閱配置你喜歡的IDE。
在開始碼代碼以前還要作多一件事。做爲博客引擎,咱們須要一個數據庫。爲了便於開發,Play內置了一個叫H2的數據庫。固然若是須要,咱們也能夠切換到一個更加健壯的數據庫。你能夠選擇設置數據是存儲在內存中,仍是在文件系統中(這樣即便應用從新啓動,你的數據也會保留)。
在一開始,咱們將對應用模型作許多測試和改動。所以,最好選擇存儲在內存中,這樣每次啓動,都不會跟舊數據有任何牽連。
打開yabe/conf/application.conf
,解除這一行的註釋:
db=mem
正如你在註釋中看到的同樣,你能夠容易地配置任何JDBC數據庫,甚至配置鏈接池。
這個教程是按照純內存數據庫撰寫的;如何在其餘數據庫使用JPA的內容超出了本教程的範疇。
如今,回到瀏覽器並刷新歡迎頁面。Play將自動啓動數據庫。檢查下面的一行是否出如今應用日誌中:
INFO ~ Connected to jdbc:h2:mem:play
當你開發一個項目時,最好使用版本控制系統(VCS)來存儲你的源代碼。若是發生什麼問題,它容許你還原到上一個版本。同時它使得多人協做變得更方便,而且容許簽出應用的各個版本。
當在VCS中存儲Play應用代碼時,記住把tmp/
,modules/
,lib/
,test-result/
和logs
文件夾排除在外。
若是你正在使用Eclipse,和play eclipsify
命令,那麼你也應該把.classpath
和eclipse/
排除在外。
這裏咱們將用Bazaar做爲例子。Bazaar是一個分佈式版本控制系統。
如何安裝Bazaar超出了本教程的範疇,但不管是何種系統,安裝都很簡單。一旦你安裝好了,切到博客文件夾,並輸入命令初始化應用版本:
$ bzr init $ bzr ignore tmp $ bzr ignore modules $ bzr ignore lib $ bzr ignore test-result $ bzr ignore logs
如今咱們能夠提交咱們的博客引擎的第一個版本:
$ bzr add $ bzr commit -m "YABE initial version"
Git是另外一個分佈式版本控制系統,查看它的文檔來獲取更多信息。
在應用的根目錄下建立一個git版本庫:
$ git init
建立包括下面各項的.gitignore
:
/tmp /modules /lib /test-result /logs
加入應用的代碼,而後提交:
$ git add . $ git commit -m "YABE initial version"
版本1已經提交上去,如今咱們的應用已經有了個堅實的基礎。