[翻譯]Play框架1.2.7版本教程(1)

Play是一個Java Web敏捷開發的框架
http://www.playframework.com/documentation/1.2.7/homejavascript

之因此要翻譯這個教程,是由於實訓的時候敲定用這個做爲框架,因而我把相關教程翻譯給小夥伴學習學習。如今就乾脆放上來給你們分享分享css

開始項目

介紹

在這個教程中,你將經過從頭至尾開發一個真正的Web應用來學習Play框架,在這個應用中,咱們將嘗試用上你將在真實項目中須要的每樣技術,同時介紹Play應用開發的最佳實踐。html

咱們把教程分割成相互獨立的各部分。每一個部分將介紹更爲複雜的特性,並提供真實項目須要的每樣東西:驗證,錯誤處理,框架安全,自動化測試組件,一個高大上的用戶界面,一個管理面板,等等。java

在本教程中的全部代碼都能被用於你的項目。咱們鼓勵你複製粘貼代碼片斷,整份搬去用也沒所謂。jquery

項目

咱們將開發(又一個)博客引擎。這不是一個很是有想象力的選擇,可是它將容許咱們探索開發一個現代Web應用的大多數技術。git

爲了讓過程更加燃一點,咱們將對不一樣的角色(編輯者,管理員)設置不一樣的權限。數據庫

這個博客引擎將以yabe爲名。segmentfault

yabe

這個教程也已做爲範例隨下載包贈送。你能夠在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也能夠運行,這不是個問題。

安裝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

new app

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,你將看到新的應用。一個新的應用用一個標準的歡迎頁面,告訴你一切安好。

welcome

下面看看一個新應用是如何展現這個頁面的。

你的應用的主入口是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方法定義於被稱爲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監測到文件的變化,並重載了應用控制器。但由於製造了錯誤,你將看到一個編譯錯誤。

error

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命令,那麼你也應該把.classpatheclipse/排除在外。

Bazaar

這裏咱們將用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版本庫:

$ git init

建立包括下面各項的.gitignore

/tmp
/modules
/lib
/test-result
/logs

加入應用的代碼,而後提交:

$ git add .
$ git commit -m "YABE initial version"

版本1已經提交上去,如今咱們的應用已經有了個堅實的基礎。

相關文章
相關標籤/搜索