Play framework框架(一)
開始專案
專案
我們將開發一個部落格引擎。這不是一個非常有想象力的選擇,但是它將允許我們探索開發一個現代Web應用的大多數技術。為了讓過程更加燃一點,我們將對不同的角色(編輯者,管理員)設定不用的許可權。
這個部落格引擎將以yabe為名。
前提
首先,確保你已經安裝了Java平臺。Play需要Java 5或以上的版本。
安裝Play
安裝過程如絲般順滑。從下載頁面下載最新的二進位制包,然後在你喜歡的地方解壓它。
如果你用的是Windows,最好避免在路徑中混入空格。比如c:\play就是個比c:\Documents And Settings\user\play 更好的選擇。
為了方便操作,你需要新增Play資料夾到你的系統路徑中。這樣你就不需要在play命令前面敲一大通路徑名了。要想檢查安裝是否成功,開啟一個新的命令列視窗,敲下play
;應該會出來play的基本使用幫助。
建立專案
現在Play已經安好了,是時候開始寫部落格應用。建立一個Play應用非常簡單,僅需要play命令列工具。之後會生成Play應用的基本架構。
開啟一個新的命令列並敲入:
~$ play new yabe
它會提醒輸入應用的全名。輸入yabe。
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
這導致了開發過程中的兩點重要的改進。第一個,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
方法定義於被稱為controller
的類中。
讓我們看一下controllers.Application
控制器張什麼樣子。開啟yabe/app/controllers/Application.java
package controllers;
import play.mvc.*;
public class Application extends Controllers {
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/stylesheet/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("yoyoyoyo");
render();
}
這側,Play正確的過載了控制器,替換掉JVM中的舊程式碼。每次請求/都會在控制器輸出臺“yoyoyoyo”資訊。
你可以移開那行程式碼,現在修改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/app/application.conf
,解除這一行的註釋:
db=em
正如你在註釋中看到的一樣,你可以冗餘的配置任何JDBC資料庫,甚至配置連結池。
現在回到瀏覽器並重新整理歡迎頁面。Play將自動啟動資料庫。檢查下面一行是否出現在應用日誌中:
INFO ~ Connected to jdbc:h2:mem:play
補充
如果執行play run
命令出現下面提示:
解決辦法:
找到play\framework\build.bat
修改
java -Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M %DEBUG_PARAM% %JAVA_OPTS% -Dfile.encoding=UTF-8 -Dinput.encoding=Cp1252 -Dplay.version="%PLAY_VERSION%" -Dsbt.ivy.home="%~dp0..\repository" -Dplay.home="%~dp0." -Dsbt.boot.properties="%fp%sbt/sbt.boot.properties" %PLAY_OPTS% -jar "%~dp0sbt\sbt-launch.jar" %*
為
java -XX:+CMSClassUnloadingEnabled %DEBUG_PARAM% -Dfile.encoding=UTF8 -Dplay.version="%PLAY_VERSION%" -Dsbt.ivy.home="%~dp0..\repository" -Dplay.home="%~dp0." -Dsbt.boot.properties="file:///%p%sbt/sbt.boot.properties" -jar "%~dp0sbt\sbt-launch.jar" %*
今天到此為止。。。