1. 程式人生 > >Play framework框架(一)

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

檔案;相反它直接處理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.indexcontrollers.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" %*

今天到此為止。。。