日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Play Framework入门引导

發(fā)布時(shí)間:2025/1/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Play Framework入门引导 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

偶然看到這篇文章,寫(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ō)尤其明顯)。

playgoogle 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最為吸引人的一點(diǎn)。修改任何java或模板代碼,都不需要重啟server,直接在瀏覽器中刷新即可看到最新效果。這曾是多少Javaer夢(mèng)想的功能。結(jié)合livereload等工具,可以實(shí)現(xiàn)光標(biāo)不離開(kāi)編輯器就能實(shí)時(shí)看到最終頁(yè)面效果的功能。
  • 無(wú)狀態(tài)Play是無(wú)狀態(tài)的,不保存與客戶(hù)端相關(guān)的數(shù)據(jù),比如它的session是以加密方式保存在cookie中的。這意味著play程序擁有良好的擴(kuò)展性,比如當(dāng)訪問(wèn)壓力過(guò)大時(shí),可以簡(jiǎn)單地多啟動(dòng)幾個(gè)play實(shí)例即可(使用不同端口+反向代理)。由傳統(tǒng)的Servlet程序則需要考慮session同步等問(wèn)題。
  • 代碼增強(qiáng):代碼增強(qiáng)是Play的重點(diǎn)功能,也是它最富于創(chuàng)新力的地方。在play導(dǎo)入我們所寫(xiě)的java源代碼時(shí),會(huì)使用javassist這個(gè)工具,根據(jù)內(nèi)置或第三方的插件的要求修改字節(jié)碼,實(shí)現(xiàn)一些原本無(wú)法實(shí)現(xiàn)的功能。比如充血模型,生成getter/setter,根據(jù)參數(shù)名自動(dòng)從request中取參數(shù),根據(jù)參數(shù)名自動(dòng)向template中設(shè)置參數(shù)等。我們可以省去很多不必要的代碼和為因Java語(yǔ)言限制而存在的設(shè)計(jì)模式,寫(xiě)出簡(jiǎn)潔清晰的代碼。由于"代碼增強(qiáng)"的存在,使得play與眾不同。
  • 模板中方法調(diào)用與url的自動(dòng)轉(zhuǎn)換:在play的模板中,需要與后臺(tái)交互(比如跳轉(zhuǎn)頁(yè)面)時(shí)很少寫(xiě)url,因?yàn)槲覀兛梢灾苯诱{(diào)用相應(yīng)的Action和參數(shù),由Play根據(jù)routes文件中的定義生成相應(yīng)的url。當(dāng)url更改時(shí),直接修改routes文件即可,不需要?jiǎng)幽0逦募.?dāng)我們寫(xiě)錯(cuò)(如方法名)時(shí),play會(huì)自動(dòng)提示編譯錯(cuò)誤。該功能讓我們重構(gòu)url時(shí)非常輕松。
  • 對(duì)restful api的良好支持:在routes文件中,通過(guò)簡(jiǎn)單的規(guī)則就可以定義出restful api的接口。通過(guò)在server端生成jsRoutes(包含了restful api的信息),在瀏覽器端可以方便地使用ajax與后臺(tái)交互。
  • 內(nèi)置基于nettyweb服務(wù)器play內(nèi)嵌了基于netty的高性能服務(wù)器,只需要一條命令即可運(yùn)行起來(lái),簡(jiǎn)單而強(qiáng)勁,推薦使用。如果因?yàn)榉?wù)器限制而必須使用傳統(tǒng)的servlet服務(wù)器的話(huà),可將play程序打包為war部署。
  • 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)置了JpaHibernate)和基于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ā)者。由于ScalaJava在語(yǔ)言特性與風(fēng)格上的巨大差別,play2-scalaplay2-java,在很多地方都不同。

    play2相對(duì)于play1,不是一次簡(jiǎn)單的版本升級(jí),而是幾乎重寫(xiě)了全部代碼。Play2Play1在很多方面都不同,不能通用。也許它本來(lái)就不該叫play2的,它與play1的區(qū)別,如同struts2struts1的區(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í)候難以忍受(在play11秒以?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上使用javajpa/ebean/morphia等,會(huì)非常麻煩。但scala自己又沒(méi)有一個(gè)足夠成熟好用的orm,這可能是阻止你使用Play2-Scala的一個(gè)重要原因。

    所以,還是如前面所說(shuō),Scala程序員選Play2-ScalaJava程序員選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í)候,Play2MVC不如LiftView-First好用。

    Play2使用了sbt,底層是akka,模板層基于scalaormPlay自己開(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)潔很多。Play2JavaapiScalaapi不在同一個(gè)包下,要注意不要引用錯(cuò)了。

    對(duì)于controlleractionPlay2play1的結(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)原因:

  • Scala的語(yǔ)法與Java不同,雖然在模板中已經(jīng)盡量簡(jiǎn)化了,但難免還是會(huì)遇到一些不好下手的問(wèn)題。
  • 模板將被轉(zhuǎn)化為Scala代碼進(jìn)行編譯。如前文所說(shuō),Play2對(duì)于Scala代碼不會(huì)進(jìn)行增強(qiáng),所以在模板中調(diào)用Java類(lèi)可能會(huì)有問(wèn)題。比如直接調(diào)用@user.articles,它不會(huì)像在Java中那樣被替換為user.getArticles,而是直接調(diào)用user.articles字段。由于代碼增強(qiáng)通常是在getter/setter上進(jìn)行的,所以這樣可能拿不到數(shù)據(jù)。如果想解決此類(lèi)lazy loading的問(wèn)題,我們必須在model中使用傳統(tǒng)的javabean方式顯式聲明getter/setter,然后在模板層中調(diào)用@user.getArticles,相當(dāng)繁瑣。
  • 所以在Play2官方推出基于java的模板前,我推薦使用兩個(gè)第三方模板插件。一是faster groovy template,二是japid,它們都已經(jīng)支持Play2,且不會(huì)有上述問(wèn)題(Japid待測(cè))。

    另外,對(duì)于不喜歡Java語(yǔ)法但又不想用scala的同學(xué),可嘗試xtendxtend代碼要比Java舒服一些,而且直接生成java源代碼,不存在編譯等問(wèn)題。

    ? ?

    Play存在的問(wèn)題

    ? ?

    雖然Play在很多方面給我們帶來(lái)的方便,但難免也會(huì)有一些問(wèn)題需要注意,這里簡(jiǎn)單提一下。

    Play1

    Play1主要存在的問(wèn)題有三個(gè):

  • 與某些第三方庫(kù)結(jié)合使用時(shí),必須寫(xiě)插件。比如morphia, ebean等。因?yàn)?/span>Play1需要對(duì)我們的Java源代碼進(jìn)行增強(qiáng),而這些庫(kù)也需要對(duì)字節(jié)碼進(jìn)行增強(qiáng)。如果不寫(xiě)插件處理classloader及字節(jié)碼,會(huì)出現(xiàn)無(wú)法運(yùn)行的情況。
  • 使用javassist修改字節(jié)碼比較繁瑣易錯(cuò)。當(dāng)Play用到一定程度,難免會(huì)需要寫(xiě)自己的插件,對(duì)字節(jié)碼進(jìn)行增強(qiáng)以實(shí)現(xiàn)特殊功能。但使用Javassist來(lái)修改字節(jié)碼,還是一件比較容易出錯(cuò)的工作,經(jīng)常要花大量的時(shí)間在調(diào)試上。特別寫(xiě)的插件需要先打包,才能在其它項(xiàng)目中使用,看到效果,非常費(fèi)時(shí)。(如果有簡(jiǎn)潔方法請(qǐng)告訴我)
  • 停止開(kāi)發(fā),只維護(hù)。官方現(xiàn)在只開(kāi)發(fā)Play2,對(duì)于Play1不再開(kāi)發(fā)新功能,只維護(hù)。如果想要增加新功能,只能靠自己或第三方插件。
  • Play2

    Play2主要有以下幾個(gè)問(wèn)題:

  • 目前不夠成熟。不論是框架本身還是插件系統(tǒng),都不太成熟。如果在大型項(xiàng)目中使用,必須自己實(shí)現(xiàn)很多功能,以及整合很多第三方庫(kù)。
  • 使用sbt作為構(gòu)建系統(tǒng)。sbt用起來(lái)也相當(dāng)繁瑣,要花不少時(shí)間才能熟練使用。而且,如果想開(kāi)發(fā)自己的構(gòu)建插件,還需要學(xué)習(xí)scalasbt那些變態(tài)的api。這對(duì)于Java程序員來(lái)說(shuō),難度實(shí)在太大。
  • Play2-scala缺少一個(gè)好用的ormPlay2-java缺少一個(gè)好用的模板層
  • Play2在某些方面與Play1相比顯得繁瑣,讓用慣Play1的人不易適應(yīng)。
  • Scala緩慢的編譯速度,常常讓人難以忍受,要求用戶(hù)的電腦配置比較高。
  • 總結(jié)

    以上是生活随笔為你收集整理的Play Framework入门引导的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。