2010/01/25

「Play!」快速上手(1)

Play!是什麼?

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/


  1. 下載完後解壓放到有寫入權限的資料夾下(這點通常是Linux才要注意的),在Window下,我將它放在C:\下面。
  2. 打開Command Line Mode,cd到play的資料夾下並輸入play new sampleapp來創造新的專案,它會再次詢問專案名稱,輸入一樣的名稱即可
  3. 馬上開始試跑看看吧~輸入 play run sampleapp
  4. 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