Play Framework入门引导
偶然看到這篇文章,寫(xiě)的不錯(cuò),拿來(lái)分享一下。
- 版權(quán)所有?轉(zhuǎn)載必須以鏈接形式注明作者和原始出處
原文地址:http://freewind.me/blog/20120728/965.html
=======================原文=========================
為了方便群中的Play初學(xué)者們,寫(xiě)了一篇入門(mén)引導(dǎo),以幫助初學(xué)者盡快了解Play。本文之前發(fā)在另一個(gè)網(wǎng)站,因?yàn)橛X(jué)得有些不便,還是轉(zhuǎn)到博客上。
歡迎來(lái)到play的世界,在這里你將體驗(yàn)到與傳統(tǒng)SSH開(kāi)發(fā)網(wǎng)站不一樣的感受。我將把我學(xué)習(xí)play的感受與經(jīng)驗(yàn)分享給大家,希望能對(duì)大家(特別是初學(xué)者)有所幫助。
Play是一個(gè)非常有創(chuàng)造力、讓人眼前一亮的Java web開(kāi)發(fā)框架。它把網(wǎng)站開(kāi)發(fā)中常見(jiàn)的繁瑣的任務(wù),以各種突破常規(guī)的方式簡(jiǎn)化,"不要重復(fù)你自己",讓人在開(kāi)發(fā)過(guò)程中有一種享受的感覺(jué)。使用Play實(shí)現(xiàn)功能,有時(shí)候簡(jiǎn)單地讓人難以相信(對(duì)于長(zhǎng)期使用SSH的人來(lái)說(shuō)尤其明顯)。
在play的google group中,曾經(jīng)有人說(shuō),當(dāng)?shù)匾e辦一次編程大賽,他將使用play參賽。每個(gè)參賽隊(duì)可使用任何語(yǔ)言和框架,在6小時(shí)內(nèi)實(shí)現(xiàn)指定的功能。結(jié)果他們勝利了,打敗了Ruby on rails隊(duì)。使用Play開(kāi)發(fā)網(wǎng)站,在不使用各種第三方插件的情況下(Rails強(qiáng)項(xiàng)),開(kāi)發(fā)效率與Rails在同一級(jí)別。
這里將介紹一些最讓我印象深刻的特性:
Play的版本
Play當(dāng)前的版本有點(diǎn)亂,不同版本之間差別還相當(dāng)大,這常常讓初學(xué)者一頭霧水。Play目前可分為三個(gè)版本,它們之間沒(méi)有誰(shuí)比誰(shuí)好,只有誰(shuí)比誰(shuí)適合。大家可根據(jù)自己的實(shí)際情況來(lái)選擇合適的版本來(lái)學(xué)習(xí)。
首先是Play的成名之作:Play1
Play1.x是成名之作。它是一個(gè)Java開(kāi)發(fā)框架,使用python作為構(gòu)建系統(tǒng)。內(nèi)置了Jpa(Hibernate)和基于groovy的模板系統(tǒng)。它大量使用了代碼增強(qiáng),提供了大量魔術(shù)般的功能,以提高程序員的開(kāi)發(fā)效率和代碼的簡(jiǎn)潔性。它編譯速度快,代碼簡(jiǎn)潔,讓人開(kāi)發(fā)時(shí)非常享受。Play1當(dāng)前最新版本為1.2.5,它是三者間最為成熟的一個(gè)版本,擁有大量成熟的第三方模塊供使用。這里值得一提的是群友green開(kāi)發(fā)了大量基于play1的優(yōu)秀插件,如rythm/play-morphia等,進(jìn)一步提高了play的性能及開(kāi)發(fā)效率。雖然play1目前已處于維護(hù)狀態(tài),但如果你需要在近期開(kāi)發(fā)傳統(tǒng)的信息管理類(lèi)網(wǎng)站,它仍然是最佳選擇。
關(guān)于Play2
幾個(gè)月前,Play1的開(kāi)發(fā)者加入了typesafe.com,并且play作為其官方web框架。typesafe是一個(gè)力推scala的公司,所以新推出的play2,實(shí)際上是將scala作為第一開(kāi)發(fā)語(yǔ)言的。比如play2中使用的新構(gòu)建工具sbt,是scala的標(biāo)準(zhǔn)構(gòu)建工具;play2中很多底層代碼都是用scala寫(xiě)的,由Java來(lái)調(diào)用;play2的默認(rèn)模板引擎,也是基于scala的。在play2中,處處可見(jiàn)scala的痕跡。但play2也同時(shí)提供了java api,以吸引廣大的Java開(kāi)發(fā)者。由于Scala與Java在語(yǔ)言特性與風(fēng)格上的巨大差別,play2-scala與play2-java,在很多地方都不同。
play2相對(duì)于play1,不是一次簡(jiǎn)單的版本升級(jí),而是幾乎重寫(xiě)了全部代碼。Play2與Play1在很多方面都不同,不能通用。也許它本來(lái)就不該叫play2的,它與play1的區(qū)別,如同struts2與struts1的區(qū)別(struts2其實(shí)是由另一個(gè)叫webwork的框架改名而來(lái))。Play開(kāi)發(fā)團(tuán)隊(duì)從商業(yè)利益上的考慮作出的決定(以及某種程度的不負(fù)責(zé)任),曾經(jīng)在play社區(qū)中引起激烈爭(zhēng)論,大批play1用戶(hù)表達(dá)了自己的不滿(mǎn)和對(duì)play2的失望。
Play2在開(kāi)發(fā)風(fēng)格上與Play1有所不同。如同typesafe公司名稱(chēng)所示,Play2在最大程度的利用編譯器的檢查,以求更加穩(wěn)定可靠。在Play1中一些追求簡(jiǎn)潔的魔術(shù)代碼,在Play2中取消了,相反要使用一些略顯繁瑣的代碼來(lái)實(shí)現(xiàn)相同功能。同時(shí)因?yàn)?/span>scala相當(dāng)慢的編譯速度,讓熱修改后生效的時(shí)間大大延長(zhǎng),有時(shí)候難以忍受(在play1中1秒以?xún)?nèi),play2中要5秒以上)。所以很多從play1轉(zhuǎn)向play2的用戶(hù)都非常不適應(yīng),拒絕轉(zhuǎn)向play2。
由于Play2的倉(cāng)促推出,當(dāng)前的2.0.2版不論在功能上還是穩(wěn)定性都存在相當(dāng)多的問(wèn)題,插件生態(tài)系統(tǒng)也沒(méi)有成熟(Play1的插件不能在Play2上使用)。所以當(dāng)前直接在生產(chǎn)系統(tǒng)中使用它還是有一定風(fēng)險(xiǎn)的,最好再等幾個(gè)月。
不論如何,Play2是官方支持,目前所有的開(kāi)發(fā)活動(dòng)都基于它,它是未來(lái)的趨勢(shì)。它重新組織的代碼結(jié)構(gòu)與API,相比1來(lái)說(shuō),也要精致很多。相信現(xiàn)在存在的各種問(wèn)題在未來(lái)會(huì)慢慢解決,只是需要一段時(shí)間。
Play2的賣(mài)點(diǎn)是并發(fā),因?yàn)樗讓邮褂昧?/span>scala中的akka庫(kù),對(duì)于開(kāi)發(fā)實(shí)時(shí)網(wǎng)站程序比較有優(yōu)勢(shì)。但對(duì)于傳統(tǒng)的信息系統(tǒng)類(lèi)網(wǎng)站,也許Play2很難達(dá)到Play1的程度。個(gè)人認(rèn)為,對(duì)于以開(kāi)發(fā)信息系統(tǒng)為主的團(tuán)隊(duì),使用Play1在各方面來(lái)講,都會(huì)是更好的選擇。
對(duì)于認(rèn)為新版一定好于舊版,或敢于嘗鮮而選擇了Play2的朋友,馬上要面臨一個(gè)新的問(wèn)題:
是用Play2-Scala還是Play2-Java呢?
個(gè)人認(rèn)為,這個(gè)選擇還是比較簡(jiǎn)單的。如果你是Scala程序員,來(lái)尋找Scala下的web框架,就選Play2-Scala。它比lift簡(jiǎn)單易學(xué),容易上手。如果你是Java程序員,或者主要以Java項(xiàng)目為主,請(qǐng)選擇Play2-Java。
雖然Scala在宣傳上總是以"更好的Java"來(lái)作為賣(mài)點(diǎn),但它實(shí)際上是一門(mén)與Java相差非常大的語(yǔ)言。在語(yǔ)言風(fēng)格上,Scala融合面向?qū)ο笈c函數(shù)式,強(qiáng)調(diào)數(shù)據(jù)的不變性,這都與Java不同。在難度上,Scala要比Java難很多,函數(shù)式編程和類(lèi)型系統(tǒng)會(huì)讓很多Java程序員止步,通常在六七年的編程經(jīng)驗(yàn)后再學(xué)習(xí)Scala是比較靠譜的選擇。
另外,雖然兩者都是JVM上的語(yǔ)言,但它們之間是有縫的,調(diào)用對(duì)方的庫(kù)經(jīng)常會(huì)遇到各種各樣的問(wèn)題。比如你想在Scala上使用java的jpa/ebean/morphia等,會(huì)非常麻煩。但scala自己又沒(méi)有一個(gè)足夠成熟好用的orm,這可能是阻止你使用Play2-Scala的一個(gè)重要原因。
所以,還是如前面所說(shuō),Scala程序員選Play2-Scala,Java程序員選Play2-Java。
Play2-Scala
Play2-Scala相對(duì)于Scala上的另一個(gè)成熟web框架lift來(lái)說(shuō),優(yōu)勢(shì)在于簡(jiǎn)單易學(xué)、有typesafe官方支持,前途光明。同時(shí)對(duì)于以restful api作為主要目的的程序來(lái)說(shuō),Play2提供的routes相當(dāng)好用。劣勢(shì)在于不如lift成熟,生態(tài)系統(tǒng)不如lift。在某些時(shí)候,Play2的MVC不如Lift的View-First好用。
Play2使用了sbt,底層是akka,模板層基于scala,orm是Play自己開(kāi)發(fā)的一個(gè)叫anorm的持久層。anorm的特點(diǎn)拋棄orm,直接使用jdbc,使用預(yù)定義的parser把結(jié)果集轉(zhuǎn)為對(duì)象。Anorm初看起來(lái)比較吸引人,但在實(shí)際使用過(guò)程中,異常繁瑣。對(duì)數(shù)據(jù)庫(kù)字段的一次修改,往往要牽扯到幾個(gè)地方,動(dòng)不動(dòng)就出錯(cuò),同時(shí)再加上scala奇慢無(wú)比的編譯速度,極易讓人心情煩躁。所以也有人嘗試在play2中使用squerl,好在很容易集成。當(dāng)然還是讓我們期待typesafe正在開(kāi)發(fā)的新orm:slick。
對(duì)于Scala程序員來(lái)說(shuō),Play2-Scala是一個(gè)比較好的選擇,不妨一試。
注意,如果你使用Play2-Scala,想使用Play2中提供的JPA/Ebean時(shí)請(qǐng)小心。由于Play2在代碼增強(qiáng)時(shí),只增強(qiáng)Java代碼,這將導(dǎo)致從Scala中調(diào)用它們時(shí)出現(xiàn)問(wèn)題,所以最好選擇scala中的orm。
Play2-Java
對(duì)于Java程序員來(lái)說(shuō),還是用Play2-Java比較順手。雖然相比Play1要繁瑣一些,但對(duì)于SSH等,還是要簡(jiǎn)潔很多。Play2中Java的api與Scala的api不在同一個(gè)包下,要注意不要引用錯(cuò)了。
對(duì)于controller和action,Play2與play1的結(jié)構(gòu)基本相同,依然采用靜態(tài)方法,但需要返回一個(gè)Result。注意的是,Action中的參數(shù),只能匹配在routes中的url定義中出現(xiàn)的參數(shù),而不像play1那樣,還能匹配任意query參數(shù)和post參數(shù)。
Orm方面,同時(shí)提供了JPA(hibernate)和Ebean。我個(gè)人比較推薦Ebean,相對(duì)于hibernate,它的api更加簡(jiǎn)單,不易出錯(cuò),因?yàn)樗怯?/span>jdbc的思路。在官方下載包里有一份100多頁(yè)的pdf文檔,看完就差不多了,用起來(lái)麻煩絕對(duì)比hibernate少太多。我在Play1中就通過(guò)第三方的插件使用Ebean,效果很好。也許只有一種情況不能用它,因?yàn)樗恢С?/span>sql server。
Play2基于scala的模板層,對(duì)于Java開(kāi)發(fā)者來(lái)說(shuō)是不太方便的。兩點(diǎn)原因:
所以在Play2官方推出基于java的模板前,我推薦使用兩個(gè)第三方模板插件。一是faster groovy template,二是japid,它們都已經(jīng)支持Play2,且不會(huì)有上述問(wèn)題(Japid待測(cè))。
另外,對(duì)于不喜歡Java語(yǔ)法但又不想用scala的同學(xué),可嘗試xtend。xtend代碼要比Java舒服一些,而且直接生成java源代碼,不存在編譯等問(wèn)題。
? ?
Play存在的問(wèn)題
? ?
雖然Play在很多方面給我們帶來(lái)的方便,但難免也會(huì)有一些問(wèn)題需要注意,這里簡(jiǎn)單提一下。
Play1
Play1主要存在的問(wèn)題有三個(gè):
Play2
Play2主要有以下幾個(gè)問(wèn)題:
總結(jié)
以上是生活随笔為你收集整理的Play Framework入门引导的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MyBatis——动态SQL讲解
- 下一篇: Eclipse 安装 SVN 插件的两种