1. 程式人生 > >play框架01--介紹

play框架01--介紹

概論:

Play框架顛覆了臃腫的企業級Java EE規範,以Restful為目標並專注於開發效率,是Java敏捷開發的最佳參考方案。開發者只要具備Java以及資料庫的相關基礎知識就可以輕鬆上手,從而讓Web應用開發變得更加容易,提高專案催化速度。

      作為Full Stack的Java Web應用框架,Play包括了所有開發中涉及的領域:NIO應用容器,無狀態MVC模型,Hibernate資料持久化,Groovy模板引擎,以及建立Web應用所需要的各種工具類。需要注意的是,這裡雖然使用了Groovy,但只是將其作為頁面模板語言,和Freemaker、Velocity使用自己定義的語言是同樣的道理。Groovy的成熟以及它和Java的相似性決定了採用Groovy遠遠好於定義自己的模板語言。


1、特性

1.2.1 無縫整合現有開發環境#

      Play1.x是基於Java的Web開發框架,允許開發者使用自己常用的整合開發工具(如Eclipse)和類庫。如果讀者已經以Java作為開發方向,那麼無須進行開發語言、IDE或者類庫的切換,要做的就是在更加高效的Java環境中開發Web應用。


1.2.2 熱過載和修改Bug#

      Java在過去因為開發效率低下而臭名昭著,主要是因為其重複和乏味的編譯-打包-部署週期。因此在設計框架的時候對這些因素都進行了重新考量,目標是讓Play應用的開發過程變得更加高效。

      Play框架會自動編譯Java原始檔,而不用重新啟動Web伺服器將程式碼熱載入至JVM。這樣做的好處是:當代碼修改完儲存後,框架自動編譯並重載修改後的類,只需重新整理瀏覽器就可以檢視更改的結果,就像在LAMP或者Rails環境中開發一樣。另外一個好處是:開發的時候甚至可以只用簡單的文字編輯器,而不使用功能完備的Java IDE進行開發。

1.2.3 簡單的無狀態MVC架構#

      一端是資料庫,另一端是Web瀏覽器,為什麼我們需要在這兩者之間儲存狀態?

      有狀態並且基於元件的Java Web框架能夠更加容易地儲存頁面狀態,但這同樣帶來了很多其他的問題:如果使用者在新的瀏覽器視窗中重新開啟應用會發生什麼?使用者按了後退按鈕又會是什麼結果?

      無共享架構是很多Web應用框架所提倡的(ROR,Django等)。由於瀏覽器變得越來越強大,我們並不需要技巧性地構建HTTP模型來建立偽造的狀態,只需在客戶端使用Ajax或者離線儲存技術就可以很容易地解決狀態問題。無共享架構的另一優勢是使頁面的呈現更加平滑,更容易地實現區域性頁面更新(或者漸進式的頁面處理流程)。


1.2.4 HTTP到程式碼的對映#

      如果讀者使用過其他的Java Web框架(比如說Struts)可能會發現,這些框架的底層實現其實是對HTTP協議做了進一步封裝,所以它們提供的Java API和自身的理念會讓人覺得很不自然。Play框架在設計過程中換了一種思維方式,即Web應用框架也應該提供完整、直接的方式去訪問HTTP————這也是Play框架和其他Java Web框架最根本的差異。

      HTTP,Request/Response模式,Rest架構風格,HTTP內容協商(Content–type negotiation),URI等等,所有這些都是Play框架的主要概念。如果使用者需要將URI繫結到指定的Java方法呼叫,只需要在路由檔案中以如下方式進行配置:

GET    /clients/{id}        Clients.show

      如果Ajax,REST以及管理頁面之間的“前進/後退”操作是日常開發中需要頻繁考慮的需求,那麼Play框架無疑是最佳的選擇,因為針對這些問題它都提供了非常優秀的解決方案。

生命週期

  Play是一個完全無狀態的,只面向請求/響應的框架,所有HTTP請求都具有相同的處理流程:

  1. 框架接收HTTP請求。
  2. 路由元件找到最匹配的規則,接受並處理請求,隨後呼叫相應的Action方法。
  3. 執行Action中的應用程式碼。
  4. 如果需要生成複雜的檢視,使用模板檔案進行渲染。
  5. Action方法的返回結果(HTTP響應程式碼以及內容)被轉換為HTTP響應。


1.2.5 高效的模板引擎#

      也許讀者已經深深地感受到了JSP和表示式語言背後的理念,但是為什麼在建立標籤庫的時候需要如此多的配置檔案?為什麼不能直接訪問底層的模型物件?JSP中太多的限制確實讓開發者感到失望,受JSP啟發又不被其約束,Play框架提供了自定義的模板引擎機制。

      開發者再也不需要編寫這些令人厭倦的程式碼了:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 
<c:choose>
   
<c:when test="${emails.unread != null && fn:size(emails.unread)}">
        You have ${fn:size(emails.unread)} unread email(s)!
   
</c:when>
   
<c:otherwise>
        You have no unread emails!
   
</c:otherwise>
</c:choose>

      相信開發者更傾向於用以下方式來書寫模板程式碼:

You have ${emails.unread ?: 'no'} ${emails.unread?.pluralize('email')} !

      Play模板引擎使用的表示式語言為Groovy,它提供了與Java一致的語法。Play主要使用模板機制來渲染HTML,當然也可以生成其他的文件格式,比如e-mail messages,JSON等等。


1.2.6 內建JPA支援#

      JPA(Java Persistence API)是Java中最簡潔的物件關係對映(object-relational mapping即ORM)API。如果讀者以前瞭解或者使用過JPA,就會發現與其他框架相比,在Play中使用會更加方便。這是因為Play框架對其做了進一步封裝,不需要任何配置,Play會自動開啟JPA實體管理器(EM),一旦程式碼被呼叫就自動進行持久化操作。

      此外,實體如果繼承Play提供的play.db.jpa.Model類,操作程式碼將會更加簡潔,更加美觀:

public static void messages(int page) {
   
User connectedUser = User.find("byEmail", connected()).first();
   
List<Message> messages = Message.find(
       
"user = ? and read = false order by date desc",
        connectedUser
   
).from(page * 10).fetch(10);
    render
(connectedUser, messages);
}

1.2.7 Full Stack應用框架#

      Play框架的最初設計受到實際Java Web開發的啟發,包含了所有建立主流Web應用所需要的工具:

  • 通過JDBC提供關係資料庫支援。
  • 使用Hibernate進行物件關係對映(JPA)。
  • 使用分散式Memcached整合快取支援。
  • 以JSON或者XML的形式提供web service支援。
  • 基於OpenID的分散式使用者資訊驗證。
  • Web應用可以部署在任何應用伺服器上(Tomcat,Jboss,GAE,Cloud等)。
  • 影象處理API(驗證碼)。

      此外Play還提供了很多實用的模組。開發者可以結合這些模組構建Web應用,這使得我們可以以更加簡單,更加直接的方式重用Java程式碼、模板以及靜態資源(比如JavaScript和CSS檔案)。


1.2.8 Play的特性總結#

  1. 自動編譯和過載:當編輯Java檔案並儲存後,重新整理瀏覽器就能立即檢視結果。使用Play開發不需要手動編譯、部署以及重新啟動Web伺服器等操作。
  2. 無狀態模型:Play是真正的無共享框架,為REST而準備。它可以將同一個應用的多個例項分別部署在多臺伺服器上,因而擴充套件性非常強。
  3. 高效的模板引擎:基於表示式語言Groovy的清晰模板引擎,提供了模板的繼承、匯入以及標籤自定義等功能。
  4. 快速解決錯誤:當錯誤發生時,Play會在瀏覽器中顯示出錯程式碼塊並提示問題發生的確切位置。
  5. Full Stack:提供建立Web應用所需的全部功能,集成了Hibernate、OpenID、Memcached等第三方類庫。
  6. 純Java:Play採用Java編寫程式碼,可以方便地使用任何Java類庫,並且能夠非常好地和Eclipse、Netbeans等IDE整合,只需通過命令生成匹配的專案檔案即可。
  7. 基於非阻塞的IO模型:允許建立基於長輪詢和WebSocket的主流Web應用。
  8. 有趣並且高效:省去了Java應用重啟的時間,提高了應用的開發效率。

轉載https://blog.csdn.net/zyhlal/article/details/53020044

https://blog.csdn.net/zyhlal/article/details/53020044