Play是一個ROR-like的Java Framework,讓你可以快速的開發網頁程式。1.0版在2009年秋天的時候發布,是一個很新的框架,它有著簡單的Patch Program,使用這些可以讓你自動生成網頁程式的骨架(雖然我覺得現在IDE都有了XD),不過它重點是讓你簡單的編寫,簡單的設定就能寫出網頁。
還有Play將所有MVC都齊全了,這就是他的最大特徵,Java Framework有一大堆,但是都是一個一個的以不同的方面為主,無論是Structs或是JSF還是連接Database部份的「Model」其實都不夠充實,「那麼就使用Hibernate這種ORM映射框架就好了」這是Java現在所推崇的,但是「如果一個Framework就能將所有的東西都齊全,後面的處理都不需要了」這種框架當然是比較好的,「只要使用一個這個,就能夠馬上開發」,這就是Play的最大特徵
先到Play的官網下載1.0.1版本。
http://www.playframework.org/
- 下載完後解壓放到有寫入權限的資料夾下(這點通常是Linux才要注意的),在Window下,我將它放在C:\下面。
- 打開Command Line Mode,cd到play的資料夾下並輸入play new sampleapp來創造新的專案,它會再次詢問專案名稱,輸入一樣的名稱即可
- 馬上開始試跑看看吧~輸入 play run sampleapp
- Play預設的HTTP Port是9000,所以打開瀏覽器瀏覽 http://localhost:9000/
接下來讓我們研究一下play/sampleapp/資料夾下的架構吧,想必用過ROR的人都覺得這些資料夾的名稱很熟悉,因為這就是ROR-like的框架嘛XD。
- app:這個資料夾是整個應用程式的本體(收藏MVC的基本部份),打開裡面就看的到三個資料夾,分別是controller, model, view
- conf:設定文件集中的地方(例如說router)
- lib:這裡存放一些Library...別跟我說不知道什麼是library
- logs:就是log..不用說明了吧
- public:這裡存放靜態網頁的東西,例如說HTML, JavaScript, CSS, 圖片等
- test:這是用來測試應用程式的資料
- tmp:暫時資料夾
為了開發方便,我們可以把Play跟IDE整合
如果想跟Eclipse整合請輸入 play eclipsify project-name
如果想跟Netbeans整合請輸入 play netbeansify project-name
Play會直接幫你轉成那個IDE的專案,再打開IDE直接開啟即可。
再來說明app資料夾
- Application.java:「controllers」裡被作成的,藉由被指定的位置被連接之後,會呼叫出這個controller裡面的特定方法來做一些必要的處理。
- main.html:這是layout的模板,大家都得跟著這個模板走就對了。
- index.html:預設的連接頁面的範本,這裡面寫的是實際的內容。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>#{get 'title' /}</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}" /> <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}" /> </head> <body> #{doLayout /} </body> </html>
觀察上面的main.html程式碼,發現title的部份是#{get 'title' /}而body的部份是#{doLayout /}
再看看index.html的程式碼,短短地三行。
#{extends 'main.html' /} #{set title:'Home' /} #{welcome /}
#extends就是看要用哪個layout
#set title就是設定剛剛main.html裡的title變數
#welcome就是body裡的東西~它會連到Framework的Homepage
來說說Application.java
package controllers; import play.mvc.*; public class Application extends Controller { public static void index() { render(); } }
controller class繼承了play.mvc.Controller來作成,裡面的方法是跟所要連接的網頁是同名的,因為我們要連接到index所以就有index方法。
這裡使用了一個render方法,這會從main.html這個模板和index.html互相結合然後給予出來。
這個「index」被稱作「動作」,我們可以這樣解釋,在預設對localhost:9000連接時index這個動作被設定要實行,然後這個應用程式準備了index這個行為來render index.html,這個index.html就被rendering了。
總之就是用名稱來互相約定該如何互相呼叫,這就是ROR類型的Framework的最大特徵,「約定勝於設定」。
來簡單說router(在conf資料夾下)
GET / Application.index GET /public/ staticDir:public * /{controller}/{action} {controller}.{action}
這裡紀錄了該如何存取網頁。
- GET / Applicaiton.index:這是存取/下的Application.index,藉由這個,存取根目錄時會實行Application這個Class裡的index方法。
- GET /public/ staticDir:public:這是存取到/public/資料夾下,把靜態的東西直接呼叫出來,並不是透過Controller來存取的。
- * /{controller}/{action} {controller}.{action}:這裡使用萬用字元*字號,意思就是說除了上面設定的那些之外,如果存取URL是/controller/action/的時候,就會用controller把action呼叫出來,例如說http://localhost:9000/application/index
這只是簡單的Router說明,Router還有更多複雜的設定和妙用。
為了等回而的Form傳遞教學,我們先在router裡加入一行
POST / Application.index
並將index.html改成
#{extends 'main.html' /}
#{set title:'Home' /}
<div>${val ? ('Hello、' + val + '!') : 'Please input your name。'}div>
<form method="post" action="@{Application.index}">
<input type="text" name="val" />
<input type="submit" value="Submit" />
form>
注意到form裡的action,就是使用controller.action的模式做連結。
將Application.java裡的index方法改成
public static void index(String val) { render(val); }
代表說每次呼叫index的時候都會去取得val並render給index.html使用
這樣我們就可以開始嘗試我們辛苦做出來的應用程式了,第一次讀取的時候可能會比較花時間,因為不管再怎樣簡單,都脫離不了Servlet的概念,這是J2EE的定義,詳細情形請上Sun網站看JavaEE tutorial或是看一下我的JSF的文章,有地方有稍微提到。
參考文章:http://codezine.jp/article/detail/4750 (日文)
No comments:
Post a Comment