精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用Play框架快速進行Java Web應用開發(fā)

開發(fā) 后端
Play 框架是一個完整的 Web 應用開發(fā)框架,覆蓋了 Web 應用開發(fā)的各個方面。Play 框架在設計的時候借鑒了流行的 Ruby on Rails 和 Grails 等框架,又有自己獨有的優(yōu)勢。

雖然目前有很多種 Java Web 應用開發(fā)框架,但Play 框架是一種新興的框架,可以幫助開發(fā)人員高效的構建Web 應用。51CTO在《Play!——另一個Java Web應用框架》介紹過Play 框架是一個full-stack(全棧的)Java Web應用框架,包括一個簡單的無狀態(tài)MVC模型,具有Hibernate的對象持續(xù),一個基于Groovy的模板引擎,以及建立一個現(xiàn)代Web應用所需的所有東西。

Play的關鍵特性:

1、一個非常簡單的開發(fā)周期。此框架自動編譯和重新裝載源文件的任何改變。

2、智能捆綁HTTP參數(shù)到Java方法參數(shù)。

3、基于Apache Mina的快速HTTP服務器。

4、一個基于Groovy的強大的模板引擎,具有多層繼承,定制用戶標簽的能力,等。

5、優(yōu)秀的錯誤報告功能:當發(fā)生異常,此框架會直接顯示出錯代碼,甚至是模板代碼。

本文詳細介紹了 Play 框架的使用,包括模型層、控制層、視圖層和 HTTP 路由等內容。通過本文的介紹,開發(fā)人員可以了解到如何用 Play 框架來快速開發(fā) Web 應用。

使用 Play 框架可以方便和高效的開發(fā)出 Java Web 應用。通過 Play 框架提供的命令行工具,可以快速的創(chuàng)建出一個 Web 應用的基本骨架。它的 Java 代碼動態(tài)編譯機制,使得修改代碼之后,不需要重啟服務器就可以直接看到修改之后的結果,調試起來非常方便。它使用 JPA 規(guī)范來完成領域對象的持久化,可以很方便的使用不同的關系數(shù)據(jù)庫作為后臺存儲。使用 Play 框架可以很容易的構建使用 REST 架構風格的應用。它使用 Groovy 作為視圖層模板使用的表達式語言。模板之間的繼承機制也可以避免代碼的重復。總的來說,Play 框架非常適合快速 Web 應用開發(fā)。

Play 框架采用經(jīng)典的 MVC 架構,把 Web 應用分成模型層、控制層和視圖層三個層次。每個層次對應的文件被存放在不同的目錄下面,方便組織和管理。使用 Play 框架的 Web 應用具有相同的目錄結構,如 圖 1所示。

使用 Play 框架的 Web 應用的目錄結構 

圖 1. 使用 Play 框架的 Web 應用的目錄結構

如 圖 1所示,應用自身的文件被放在 app目錄下面,三個子目錄分別存放的是 MVC 模式的三個層次的內容。其中 models和 controllers目錄下面是 Java 源文件,而 views目錄下面則是視圖層使用的模板文件。conf目錄下面存放的是應用的配置文件、HTTP 路由文件和國際化所需的消息文件。public目錄則是存放 Web 應用的靜態(tài)文件,包括 JavaScript、CSS 和圖像文件等。lib目錄存放所需的額外的 Java 庫。test目錄存放的是測試結果。

開發(fā)環(huán)境

本文中使用的 Play 框架的版本是 1.0.3.1,使用的集成開發(fā)環(huán)境是 Eclipse 3.6, 使用 Dojo 作為 JavaScript 框架。在 Play 框架官方網(wǎng)站(見 參考資料)下載 Play 框架的壓縮包之后,解壓到某個目錄,并把該目錄下面的 bin目錄添加到環(huán)境變量中。接著啟動一個命令窗口,運行 play new developers_notebook就可以創(chuàng)建出一個新的名為 developers_notebook的 Web 項目。在項目目錄的父目錄下面,運行 play eclipsify developers_notebook就可以創(chuàng)建出來 Eclipse 工程。通過 Eclipse 導入此工程就可以在 Eclipse 里面進行開發(fā)了。Play 框架的 support目錄下的 eclipse目錄下有個名為 org.playframework.playclipse的 Eclipse 插件,將此插件復制到 Eclipse 的 plugins目錄就可以安裝。運行 play run就可以運行此 Web 應用,訪問 http://localhost:9000就可以看到。每次在 Eclipse 里面修改了代碼之后,不需要重新啟動應用,只需要刷新頁面就能看到更新之后的結果。這是 Play 框架的一個非常方便的特性。

本文中的示例應用稱為“開發(fā)人員記事本”。開發(fā)人員可以用它來記錄開發(fā)過程中的一些注意事項。下面首先介紹 Play 框架中的模型層。

模型層

模型層包含的是 Web 應用中的領域對象。Play 框架推薦的實踐是模型層的對象不應該是僅包含 getter/setter 方法的簡單 Java Beans,而應該有自己的業(yè)務邏輯。Play 框架中應用的模型層類可以是任何的 Java 類。與一般的 Java Beans 不同的是,模型層類使用聲明為 public的域作為對象的屬性。Play 框架會自動生成相應的 getter/setter 方法。這樣可以使得代碼更加簡潔。開發(fā)人員也可以提供自己的 getter/setter 方法實現(xiàn)。

領域對象持久化

領域對象的實例一般需要持久化下來。最常見的持久化方式就是使用關系數(shù)據(jù)庫。Play 框架使用 JPA 規(guī)范來進行領域對象的持久化。具體的后臺實現(xiàn)使用的是 Hibernate。開發(fā)人員只需要使用 JPA 規(guī)范定義的標注,就可以聲明領域的持久化行為。比較好的做法是將領域對象類繼承自 Play 框架提供的 play.db.jpa.Model類。play.db.jpa.Model類提供了一個域 id作為對象的標識符,也是對應的數(shù)據(jù)庫表中的主鍵。play.db.jpa.JPASupport類是 play.db.jpa.Model的父類,提供了一些實用方法用來完成從領域對象到數(shù)據(jù)庫之間的映射。表 1中列出了一些重要的方法,包括常用的增刪改查操作。

表 1. play.db.jpa.JPASupport API 說明

play.db.jpa.JPASupport API 說明

表 1中列出的方法中,find()和 all()方法的返回值是 play.db.jpa.JPASupport.JPAQuery類的實例,表示一個領域對象實例的查詢結果。對于此查詢結果,可以進行進一步的操作。具體的操作,如 表 2所示。

表 2. play.db.jpa.JPASupport.JPAQuery API 說明

play.db.jpa.JPASupport.JPAQuery API 說明

使用 表 2中給出的方法,就可以在領域對象類中添加一些非常實用的方法,而不需要把這些方法添加到額外的服務層中。在示例應用中,Note這個領域對象類表示的是用戶添加的記錄。代碼清單 1中給出了 Note類中的一些實用方法。

清單 1. 領域對象類中的實用方法

  1. // 創(chuàng)建新的領域對象 Note 的實例,edit() 方法的使用與 create() 類似 
  2.  Map<String, String[]> params = new HashMap<String, String[]>();  
  3.  params.put("note.title", new String[] {"My note"});  
  4.  params.put("note.content", new String[] {"My note's content"});  
  5.  Note.create(Note.class, "note", params).save(); 
  6.  
  7.  // 使用 find() 來進行查找 
  8.  List<Note> notes = Note.find("byTitle", "My note").fetch(); 
  9.  
  10.  // 使用 findById() 來查找單個實例 
  11.  Note note1 = Note.findById(1); 
  12.  
  13.  // 使用 delete() 來刪除對象實例 
  14.  Note.delete("byTitle", "My note"); 
  15.  
  16.  // 返回查詢結果中的第 2 到第 11 條記錄。 
  17.  Note.find("byTitle", "My note").from(1).fetch(10); 

在介紹完 Play 框架的模型層之后,下面介紹控制層。

控制層

Play 框架中的控制層是模型層和視圖層之間的橋梁。控制層負責接收 HTTP 請求并返回相應的響應。一般來說,控制層的典型實現(xiàn)是接收到 HTTP 請求之后,從請求中獲取一些參數(shù),再調用服務層對應的處理方法。服務層的方法會對領域對象進行操作,完成具體的業(yè)務邏輯。最后,某種格式的響應被返回給請求者,如 HTML 頁面、JSON 數(shù)據(jù)和 XML 數(shù)據(jù)等。Play 框架的控制層實現(xiàn)使得完成這樣的典型場景變得非常簡單。

Play 框架中的每個控制器都是一個普通的 Java 類,繼承自 play.mvc.Controller類,在包 controllers中。控制器類中的每個公開的靜態(tài)方法都表示一個動作。每個動作負責完整的請求 / 響應的流程,也就是說,所有前面提到的所有請求 / 響應的過程都需要在每個動作中來完成。

參數(shù)綁定

在控制層實現(xiàn)中很繁瑣但是必不可少的操作就是解析 HTTP 請求中的參數(shù)。不同的 Web 開發(fā)框架會提供自己的參數(shù)解析方式。Play 框架也提供了相應的支持。Play 框架可以解析 HTTP 請求中查詢字符串和 URI 路徑中包含的以及請求體中以 格式編碼的參數(shù)。所有這些參數(shù)都放在 params對象中,其中包含 get()、getAll()和 put()等方法用來獲取和設置參數(shù)的值。除了這種傳統(tǒng)的使用方式之外,Play 框架還支持直接把參數(shù)的值綁定到動作方法的參數(shù)上面。比如一個動作方法的聲明是 show(String username),那么請求中的參數(shù) username的值會在 show()方法被調用時作為實際參數(shù)傳遞進去。Play 框架會負責完成相應的類型轉換。值得一提的是對于日期類型(java.util.Date)的參數(shù),Play 框架支持多種類型的日期格式的轉換。比如動作方法的聲明是 display(Date postedAt),而請求的格式可能是 /display?postedAt=2010-09-22,Play 框架會自動完成相應的類型轉換。

除了常見的基本數(shù)據(jù)類型之外,Play 框架還支持直接綁定領域對象的實例。比如動作方法的聲明是 create(Note note),可以在參數(shù)中直接指定對象實例的屬性的值。請求的格式可能是 /create?title=Note123&content=Good。Play 框架會負責創(chuàng)建一個 Note類的實例,并根據(jù)參數(shù)的值設置該實例的屬性 title和 content的值。這種綁定方式不僅支持簡單對象,還支持嵌套對象和列表。比如 /create?tags[0]=ajax&tags[1]=web可以設置列表類型屬性 tags的值。

Play 框架的這種綁定方式還支持文件對象,使得上傳文件變得非常簡單。只需要在表單中添加文件上傳的控件(<input type="file">)并使用 multipart/form-data編碼來提交請求,在動作方法的參數(shù)中就可以獲取到上傳文件對應的 java.io.File對象。比如動作方法的聲明可能是 upload(File picture)。上傳的文件被保存在臨時目錄中,在請求完成之后會被自動刪除。可以在動作方法中完成對上傳文件的操作。

返回響應結果

在控制層的動作方法完成了與業(yè)務邏輯相關的處理之后,需要把響應返回給客戶端。響應的結果可能是正確完成,也可能是出現(xiàn)錯誤。Play 框架提供了方便的實現(xiàn)用來返回不同類型的響應。使用 play.mvc.Controller類提供的不同方法就可以生成這些響應內容。

◆請求正確完成,HTTP 狀態(tài)代碼為 200。使用 ok()方法生成不帶內容的響應。使用 render()方法來生成使用模板的響應。使用 renderText()方法生成 text/plain類型的純文本響應。使用 renderXml()方法生成 text/xml類型的 XML 格式的響應。使用 renderJSON()方法生成 application/json類型的 JSON 格式的響應。使用 renderBinary()方法生成二進制內容的響應。

◆跳轉到新的頁面,HTTP 狀態(tài)代碼為 3XX。使用 redirect()方法來跳轉到新的 URL。使用 notModified()方法來返回狀態(tài)代碼 304。

◆HTTP 狀態(tài)代碼 4XX。使用 unauthorized()方法返回狀態(tài)代碼 401。使用 forbidden()方法返回狀態(tài)代碼 403。使用 notFound()方法返回狀態(tài)代碼 404。

◆服務器內部錯誤,HTTP 狀態(tài)代碼 5XX。使用 error()方法返回狀態(tài)代碼 500。

從上面列出的方法可以看出,Play 框架使用一些有意義的方法名稱替換掉了難以記憶的 HTTP 狀態(tài)代碼,使用起來更加方便。同時,對于常見的響應格式,包括 HTML、XML、JSON 和二進制內容,都提供了相應的方法,使得開發(fā)人員不會遺漏掉響應中 Content-Type的聲明。

方法攔截

控制層的方法通常需要執(zhí)行一些橫切的邏輯,比如用戶認證、加載通用信息和記錄日志等。在 Spring 框架中,這些橫切的邏輯是通過面向方面編程(AOP)的支持來實現(xiàn)的。Play 框架提供了更加簡單易用的方法攔截支持,通過簡單的標注就可以定義一些執(zhí)行攔截操作的方法。這些方法必須非公開的靜態(tài)方法。Play 框架支持的方法攔截標注有 @Before、@After、@Finally和 @With等四種。

用 @Before標注的方法在動作方法執(zhí)行之前被調用。@After標注的方法在動作方法執(zhí)行之后被調用。@Finally標注的方法在動作方法的響應結果已經(jīng)成功生成之后被調用。這三個標注都支持額外的兩個屬性:priority表示標注的方法的優(yōu)先級,0 為最高;unless是一個字符串數(shù)組,表示不適用此攔截方法的動作方法的名稱。如 @Before(unless="index")表示此攔截方法不會應用在動作方法 index()上。

如果控制器類中存在繼承體系結構的話,父類中聲明的攔截方法對于所有子類的動作方法都是適用的。在有些情況下,開發(fā)人員可能希望把攔截方法定義在不同的類體系結構中。由于 Java 不支持多繼承,無法通過繼承的方式來應用來自不同類體系結構上的攔截方法。針對這種情況,Play 框架提供了 @With標注。在控制器類 ControllerA中定義的攔截方法可以通過 @With標注來應用到另外一個控制器類 ControllerB上,而且不通過繼承方式來實現(xiàn)。只需要在 ControllerB中聲明 @With(ControllerA.class)即可。

在介紹完 Play 框架的控制層之后,下面介紹視圖層。

視圖層

Web 開發(fā)框架的使用者都習慣于使用某種模板技術來生成 HTML 頁面,這些技術包括常見的 JSP、ASP 和 PHP 等。Play 框架也提供了自己的模板技術,可以用來動態(tài)的創(chuàng)建 HTML、XML、JSON 以及其它文本類型的內容。Play 框架的模板技術使用的是 Groovy 語言。Groovy 語言的靈活性和簡潔性使得 Play 框架的模板簡單而且易用。在模板中可以混用靜態(tài)內容和生成動態(tài)內容的各種元素。在模板中可以使用的動態(tài)元素如 表 3所示。

表 3. 模板中可用的動態(tài)元素

表 3. 模板中可用的動態(tài)元素

Play 框架中的標簽的作用相當于 JSP 中的標簽。Play 框架本身提供一些常用的標簽,開發(fā)人員也可以根據(jù)需要開發(fā)自己的標簽。Play 框架內置提供的標簽說明如 表 4所示。

表 4. Play 框架提供的標簽

Play 框架提供的標簽

在模板中可以使用來自不同地方的變量。首先是在模板生成的時候,由控制器中的動作方法通過 renderArgs對象來添加的。如 renderArgs.put("username", "Alex")就把一個變量 username添加到了模板中。其次是一些隱含的變量,如 request表示當前的 HTTP 請求,session表示當前的會話,params表示請求中的參數(shù)和 out表示用來輸出響應的 java.io.Writer對象。最后就是可以通過 #{set}來設置變量。

模板的繼承

Play 框架中可以使用 #{extends}和 #{doLayout}來實現(xiàn)模板之間的繼承。模板的繼承機制對于實現(xiàn)靈活的頁面布局很有幫助。一個模板可以定義清楚頁面的基本布局結構,其它模板可以繼承此模板并添加具體的內容。這樣就可以避免在不同模板中重復相同的頁面元素。
在父模板中可以包含任意的內容。在需要由子模板填充的位置,使用 #{doLayout /} 進行聲明即可。在子模板中通過 #{extends} 來聲明所繼承的模板。如 #{extends 'main.html'} 就聲明繼承自模板 main.html。當子模板被生成之后,將包含父模板中的內容。而子模板中只需要定義擴展的內容即可。

自定義標簽

Play 框架自身提供的標簽只能解決一些常見的需求,很多時候開發(fā)人員需要根據(jù)需要開發(fā)出自己的標簽。一個標簽的定義非常簡單,就是一個模板文件。模板文件被存放在 app/views/tags目錄下,文件的名稱就是標簽的名稱。在標簽對應的模板里面,開發(fā)人員可以添加任意的內容。標簽也是支持傳入?yún)?shù)的。在標簽對應的模板文件中可以用在參數(shù)名稱前面加上 _ 的方式來引用參數(shù)的值。比如一個標簽在使用時的方式是 #{myTag name:'Alex' /},那么在該標簽的模板文件中,就可以用 ${_name}來引用參數(shù) name 的值。有些標簽是支持在使用的時候添加標簽體的,如 #{anotherTag} 測試文字 #{/anotherTag}。對于這種情況,在標簽的模板文件中可以用 #{doBody} 來引用標簽體中的內容。

在介紹完 Play 框架的視圖層之后,下面介紹 HTTP 路由。

HTTP 路由

在前面介紹過,Play 框架中的控制器用來接受 HTTP 請求并返回相應的響應。這個過程的重要一環(huán)就是 HTTP 請求的 URI 與控制器之間的映射關系。Play 框架提供了靈活的 HTTP 路由功能來完成這個映射。路由信息被保存在 config/routes 文件中,采用簡單的方式進行聲明。每條路由記錄包含 3 個元素,分別是 HTTP 方法的名稱、匹配的 URI 模式以及對應的控制器動作方法。路由記錄表示的含義是當使用給定的 HTTP 方法來請求對應模式的 URI 的時候,控制器動作方法就會被調用。

Play 框架支持的 HTTP 方法有 GET、POST、PUT、DELETE 和 HEAD。使用通配符 *可以匹配任何方法。在 URI 模式的聲明中可以使用正則表達式來表示復雜的映射規(guī)則。URI 模式中還可以使用 {...}來聲明動態(tài)的部分。每個動態(tài)部分都是有名稱的,可以在控制器動作方法中通過 params對象來獲取。比如,/notes/home 這樣的 URI 模式會匹配 /notes/home,但是 /notes/{id} 可以匹配 /notes/123 和 /notes/abc,而且 URI 模式中 /notes/ 后面的部分可以作為參數(shù) id 的值被獲取到。URI 模式 /notes/{<[0-9]+>id} 使用了正則表達式,只會匹配 /notes/后面緊跟的全是數(shù)字的情況。在聲明控制器的動作方法的時候,需要使用帶名稱空間的全名,如 myapp.Notes.show。有些動作方法是帶參數(shù)的,可以在聲明的時候預先綁定一些參數(shù)值,這樣可以方便的添加一些 URI 別名。比如動作方法 Notes.show() 有一個參數(shù) id 用來指明要顯示的內容的 ID。如果參數(shù) id 的值為 0,則會顯示所有內容的一個列表。這樣的話,就可以定義一個類似 GET /notes/all Notes.show(id:0) 的路由聲明。這樣暴露出來的 URI 更加簡潔和易于記憶。

在路由文件中的路由聲明是按照從上到下的優(yōu)先級來進行匹配的。比較具體的 URI 模式應該放在比較通用的模式之前。對于靜態(tài)文件,可以通過一個特殊的動作方法 staticDir 進行聲明。比如 GET /files staticDir:files 就聲明了 files目錄中包含的是靜態(tài)文件。

在介紹完 HTTP 路由之后,下面介紹 Play 框架獨特的無狀態(tài)的體系結構。

無狀態(tài)的體系結構

HTTP 協(xié)議本身就被設計成無狀態(tài)的,采用請求 / 響應的模式。不同的請求之間并不存在相互關系。但是這種架構模式在開發(fā)某些 Web 應用的時候不是很方便。有些應用要求用戶進行認證登錄之后才能進行某些操作。同樣的 URL,認證和未認證用戶看到的內容是不同的。而且用戶認證成功之后,他應該在一段時間內保持這種認證狀態(tài)。否則的話,用戶每次都需要輸入用戶名和密碼才能訪問受限的內容。對于這種情況,很多 Web 開發(fā)框架提供了會話的支持,允許應用保存一些與會話相關的數(shù)據(jù)。Java Servlet 規(guī)范中的 javax.servlet.http. HttpSession就是一種會話的接口。應用的服務器會負責維護每個會話相關的數(shù)據(jù)。這些數(shù)據(jù)可以通過一個會話 ID 來進行標識。這個標識會利用瀏覽器的 cookie 機制保存在瀏覽器端,也可以作為請求 URL 的參數(shù)來傳遞。服務器端通過此標識來識別每個會話。在處理相應的請求的時候,就可以根據(jù)會話 ID 來獲取保存在服務器端上的會話數(shù)據(jù)。會話機制的問題是會影響應用的可伸縮性。如果一個應用使用多臺服務器的話,就需要額外的機制來保證同一用戶在不同機器上面的會話是同步的。而無狀態(tài)的實現(xiàn)則不存在這個問題,對于某一個請求,由不同機器來處理的結果都是相同的。

Play 框架的設計架構就是無狀態(tài)的。它沒有提供服務器端的機制用來維護跨多個請求的數(shù)據(jù)。如果確實需要保存這樣的數(shù)據(jù)的話,可以考慮下面幾種方案:

◆保存在 Session 或 Flash 作用域中。Play 框架中仍然有會話的機制,但是并沒有提供在服務器端保存會話數(shù)據(jù)的能力。會話數(shù)據(jù)是保存在瀏覽器的 cookie 中的,由瀏覽器在每次請求的時候自動發(fā)送。通過這種方式來達到維護會話數(shù)據(jù)的目的。由于會話數(shù)據(jù)是保存在 cookie 中,其大小是有限制的,一般不能超過 4K 字節(jié),而且只能保存字符串類型的數(shù)據(jù)。Flash 作用域和會話一樣,也是通過 cookie 來保存的。所不同的是,F(xiàn)lash 作用域中的數(shù)據(jù)只在下次請求中是有效的。

◆保存在持久化的數(shù)據(jù)存儲中,如數(shù)據(jù)庫中。如果需要在多個請求中使用同一個領域對象的話,可以把這個對象的 ID 保存在 Session 或 Flash 作用域中,而在控制器動作方法中使用此 ID 來從數(shù)據(jù)庫中查詢相應的對象。

◆保存在暫時性數(shù)據(jù)存儲中,如緩存中。Play 框架內置了緩存的支持,通過調用類 play.cache.Cache 就可以對緩存進行操作。與使用持久化存儲類似,緩存中的鍵的值可以保存在 Session 或 Flash 作用域中。

對于熟悉了 Java Servlet 規(guī)范的開發(fā)人員來說,需要一些時間來適應 Play 框架的這種無狀態(tài)的體系結構。不過這種結構對于應用的可伸縮性來說,確實是非常有好處的。

介紹完無狀態(tài)的體系結構之后,下面介紹一些其它話題。

其它話題

測試

Play 框架對應用的測試也提供了良好的支持。Play 框架一共支持三種類型的測試,分別是單元測試、功能測試和界面測試。單元測試主要用來測試應用的模型層代碼。單元測試用例的 Java 類繼承自 play.test.UnitTest ,可以使用 JUnit 4 提供的標注和斷言。功能測試主要用來測試應用的控制層代碼。功能測試用例的 Java 類繼承自 play.test.FunctionalTest。在測試用例中,可以通過 GET()、POST()、PUT()、DELETE() 和 makeRequest()等方法來發(fā)出 HTTP 請求,也可以直接調用控制器中的動作方法。除此之外,還可以使用一些與 HTTP 響應相關的斷言。如 assertStatus()、assertContentType() 和 assertHeaderEquals()分別用來驗證 HTTP 狀態(tài)代碼、內容類型和 HTTP 頭。界面測試使用 Selenium 工具來進行。開發(fā)人員可以使用 Selenium 的語法來編寫測試用例,也可以使用 Play 框架提供的 #{selenium}標簽。

在進行測試的時候,需要準備一些測試數(shù)據(jù)。測試數(shù)據(jù)可以用 YAML 的格式保存在文本文件中,并通過 play.test.Fixtures.laod()方法來加載這些數(shù)據(jù)到數(shù)據(jù)庫中。當測試結束之后,可以通過 deleteAll()方法來刪除這些數(shù)據(jù)。

在測試的時候,需要用 play test命令以測試模式啟動應用,再用瀏覽器訪問 http://localhost:9000/@tests進行測試。

任務調度

在 Web 應用開發(fā)中,有時候會需要定期執(zhí)行一些調度任務,比如數(shù)據(jù)庫備份和數(shù)據(jù)同步等。這些任務不是通過 HTTP 請求來觸發(fā)的,而是定時執(zhí)行的。Play 框架提供了內置的任務調度支持的能力。創(chuàng)建新任務的時候,只需要繼承自 play.jobs.Job類,并覆寫 doJob()方法即可。如果要創(chuàng)建的任務有返回結果的話,覆寫 doJobWithResult()方法即可。任務創(chuàng)建完成之后,可以選擇不同的調度方式。一種方式是在應用啟動的時候執(zhí)行一次。只需要在任務的 Java 類上添加標注 @OnApplicationStart即可。對于定期執(zhí)行的任務,Play 框架提供了兩個標注:一個是 @Every,用來按照固定的時間間隔調度任務,如 @Every("1h")聲明任務每個小時執(zhí)行一次;另外一個是 @On,用來聲明描述調度策略的 CRON 表達式。

安全

Play 框架提供了對 Web 應用安全性方面的支持,可以防范一些常見的攻擊方式。前面提到過,Play 框架中的會話數(shù)據(jù)是保存在瀏覽器的 cookie 中的。這些數(shù)據(jù)是經(jīng)過簽名的,可以防止被惡意攻擊者所篡改。應用中的重要數(shù)據(jù)也不應該保存在會話中。Play 框架中的模板在輸出 HTML 內容的時候,會自動對內容進行轉義,可以防范跨站點腳本攻擊。對于 SQL 注入攻擊,開發(fā)人員應該盡量使用提供的 find()方法來查詢領域對象。對于自己創(chuàng)建的查詢語句,應該在語句中使用占位符并進行參數(shù)綁定,而不是通過字符串相加的方式來創(chuàng)建。為了防范跨站點請求偽造,Play 框架中的控制器的動作方法都可以使用 checkAuthenticity()方法來聲明調用此方法時的請求中必須包含合法的令牌。這個令牌用來確保當前請求是由應用自身發(fā)出的,而不是被偽造的。通過 session.getAuthenticityToken()方法可以生成一個只對當前會話有效的令牌,需要在請求的時候附帶此令牌。如果是通過頁面上的表單來提交請求的話,Play 框架也提供了一個標簽 #{authenticityToken /}用來生成一個包含了令牌的隱藏域,可以直接在模板中使用。

總結

Play 框架作為一個優(yōu)秀的 Java Web 應用開發(fā)框架,可以幫助開發(fā)人員快速高效的構建 Web 應用。它為開發(fā)人員提供了一個良好的基礎架構,并屏蔽了很多底層的實現(xiàn)細節(jié)。開發(fā)人員可以用一個簡單的視角來看待 Web 應用開發(fā),而不需要關心過多的細節(jié)。Web 開發(fā)人員可以熟悉 Play 框架,并在開發(fā)中選用這個框架。

【編輯推薦】

  1. Java Web應用開發(fā)中的一些概念
  2. 理想的Java Web開發(fā)框架
  3. Java Web Servlet學習淺談
  4. 新一代Java Web開發(fā)框架JSF框架
  5. 現(xiàn)代Java Web開發(fā)框架分析

 

責任編輯:佚名 來源: developerworks
相關推薦

2011-11-08 10:36:42

Java

2009-05-12 09:54:09

JavaRestCoC

2018-05-04 15:27:22

Spring Boo Web開發(fā)

2024-10-14 10:12:37

Python Web框架Python

2012-01-13 11:02:27

JavaWebOpenXava

2011-12-16 09:49:38

Java

2011-09-09 17:01:42

框架

2024-09-29 16:36:16

2020-03-30 09:00:00

WebJava框架

2012-02-22 15:51:22

JavaPlay Framew

2009-09-03 16:52:44

Java Web開發(fā)框

2009-06-18 12:06:30

Java Web開發(fā)框

2020-07-24 07:00:00

Laravel框架Web應用開發(fā)

2019-11-25 11:20:08

FlutterWeb應用軟件開發(fā)

2012-02-23 13:13:00

JavaPlay Framew

2010-04-20 09:14:33

Struts

2009-06-22 11:50:00

J2EE Web應用快速開發(fā)

2023-06-27 08:34:32

2009-05-08 09:32:27

JavaWeb編程框架

2016-01-27 09:39:13

JoobyJava Web流程
點贊
收藏

51CTO技術棧公眾號

成人公开免费视频| 最近2019年手机中文字幕 | 午夜国产福利视频| 亚洲青青久久| 亚洲成人av在线电影| 久久婷婷人人澡人人喊人人爽| 欧美国产一级片| 欧美国产专区| 在线电影av不卡网址| 91精品久久久久久久久久久| 国产色视频一区| 青花影视在线观看免费高清| 精品久久97| 欧美日韩dvd在线观看| 免费网站永久免费观看| 精品视频一二三| 国产又黄又大久久| 日韩美女在线播放| 久久久精品国产sm调教| 欧美亚洲精品在线| 日韩av在线网址| 图片区乱熟图片区亚洲| 欧美艳星kaydenkross| 亚洲精品视频一区二区| 日韩av图片| 性插视频在线观看| 国产成人自拍网| 国产美女久久精品| 无码人妻久久一区二区三区| 国模大胆一区二区三区| 日韩中文在线观看| brazzers精品成人一区| 成人免费直播在线| 日韩一级免费一区| 性欧美videossex精品| 国产精品人人爽人人爽| 亚洲春色一区二区三区| 久久福利资源站| 国产精品第一视频| 日本熟女毛茸茸| 99riav1国产精品视频| 九色91av视频| 国产探花在线免费观看| 亚洲成人精品| 不卡av在线播放| 久久av红桃一区二区禁漫| 一区二区三区视频免费观看| 亚洲成人激情图| 熟女人妻一区二区三区免费看| 亚洲一区二区av| 欧美三级日韩在线| 99视频在线视频| 韩日一区二区| 欧美午夜理伦三级在线观看| 久久午夜夜伦鲁鲁一区二区| 精品国产免费人成网站| 一本到高清视频免费精品| 男人操女人逼免费视频| 国产免费拔擦拔擦8x高清在线人| 亚洲一区二区三区中文字幕| youjizz.com在线观看| gogo高清在线播放免费| 亚洲一区免费在线观看| 午夜免费福利小电影| 蜜桃视频www网站在线观看| 午夜精品成人在线视频| 99999精品视频| 亚洲性色av| 在线观看亚洲精品视频| 午夜免费福利视频在线观看| 欧美黄页免费| 日韩精品一区二区三区视频| 扒开伸进免费视频| 一区二区三区四区在线看| 国产一区二区三区视频在线观看| 老司机福利在线观看| 亚洲精品国产成人影院| 欧美激情精品久久久久久大尺度 | 日韩成人精品一区| 久久资源免费视频| 中文字幕一区二区三区手机版| 国产日韩欧美三区| 国产欧美 在线欧美| 亚洲第一色网站| 久久久亚洲国产美女国产盗摄| 午夜欧美一区二区三区免费观看| 久操视频在线播放| 午夜精品影院在线观看| 日韩肉感妇bbwbbwbbw| 无码国模国产在线观看| 亚洲精品国产欧美| 日本美女黄色一级片| 久久精品—区二区三区舞蹈| eeuss国产一区二区三区四区| 亚洲福利视频专区| 91麻豆制片厂| 亚洲黄色影片| 国产一区二区视频在线观看| 亚洲精品一区二区三区四区| 久久精品无码一区二区三区| 熟妇熟女乱妇乱女网站| 性感女国产在线| 91精品国产综合久久精品性色 | 久久婷婷色综合| 亚洲免费视频播放| 另类激情视频| 日韩欧美综合一区| 欧美黄色高清视频| 亚洲激情影院| 亚洲aⅴ日韩av电影在线观看 | 日韩视频欧美视频| 91看片在线播放| 久久se精品一区精品二区| 国内精品视频免费| 影院在线观看全集免费观看| 色老汉一区二区三区| 无码国产精品久久一区免费| 精品视频免费| 欧美在线视频一区| 国产18精品乱码免费看| 亚洲视频综合在线| 免费看污黄网站| 日韩大尺度在线观看| 欧美高清视频免费观看| 99成人精品视频| 久久婷婷国产综合国色天香| 丁香六月激情婷婷| 欧美黄色一级| 日韩在线欧美在线| 久久久国产免费| 久久综合九色综合欧美就去吻| 三级在线免费观看| 看片一区二区| 中文字幕亚洲无线码a| 日日噜噜噜噜人人爽亚洲精品| 高清shemale亚洲人妖| www.黄色网址.com| 99er精品视频| 久久天堂av综合合色| 亚洲熟妇无码久久精品| 国产欧美日本一区视频| 男人的天堂日韩| 国产乱码精品一区二区亚洲| 欧美专区在线视频| 青青草观看免费视频在线| 韩曰欧美视频免费观看| 国产精品第七页| 亚洲伦伦在线| 久久久久久久有限公司| 美女网站在线看| 亚洲欧美日韩国产精品| 中文字幕一区二区人妻电影| 久久久久99精品一区| 国产精彩免费视频| 欧美日韩水蜜桃| 国产欧美 在线欧美| 国产原创在线观看| 欧美一区二区三区四区五区 | 中文国产一区| 九色91在线视频| 中文在线资源| 在线日韩日本国产亚洲| 96日本xxxxxⅹxxx17| 亚洲色欲色欲www| 亚洲热在线视频| 最新日韩av| 欧美一级日本a级v片| 91大神在线观看线路一区| 深夜福利91大全| 国产黄色免费大片| 天天色综合天天| 欧洲美一区二区三区亚洲| 美女一区二区三区| 国产三级中文字幕| 欧美18xxxx| 国产精品wwww| 在线观看电影av| 国产丝袜一区视频在线观看| 波多野结衣电车| 亚洲精选免费视频| 成人自拍爱视频| 日本不卡久久| xxxx日本黄色| 国产精品久久国产愉拍| 日韩福利二区| 高清久久精品| 91国产精品91| 在线观看a视频| 欧美成人一区二区| 日韩视频在线一区| jizzjizz日本少妇| 国产成人免费在线观看不卡| 男人日女人下面视频| 日韩av二区| 国产伦精品一区二区| 草莓视频成人appios| 欧美日韩国产二区| 国产尤物视频在线| 日韩欧美国产高清| 国产一级片免费视频| 亚洲精品国产无套在线观| 在线免费观看成年人视频| 久久精品免费观看| 成人毛片视频网站| 你懂的视频一区二区| 欧美日韩系列| ady日本映画久久精品一区二区| 国产精品黄视频| 国产在线观看www| 久久不射热爱视频精品| 国产高清视频免费最新在线| 精品成人a区在线观看| 中文字幕在线观看免费| 亚洲va欧美va国产va天堂影院| 亚洲一卡二卡区| 国产精品黄网站| 成人在线小视频| 午夜无码国产理论在线| 97国产成人精品视频| 久久久久久久久免费视频| 亚洲区在线播放| 日韩一级在线播放| 日韩一区二区三区av| 中文字幕在线播放av| 日本高清不卡在线观看| 欧美精品亚洲精品日韩精品| 亚洲黄网站在线观看| 日本二区三区视频| 欧美激情在线一区二区| 国产伦精品一区二区三区妓女 | 五月天激情播播| 日韩激情av在线| 青青在线视频免费| 香蕉久久夜色精品国产| 欧美综合在线播放| 狠久久av成人天堂| 免费在线看黄色片| 好吊一区二区三区| 国产午夜精品视频一区二区三区| 国产精品久久久久蜜臀| 亚洲国产精品www| 欧美色就是色| 视频在线一区二区三区| av亚洲免费| 日韩欧美亚洲区| blacked蜜桃精品一区| 欧洲在线视频一区| 成人羞羞在线观看网站| 亚洲精品成人久久久998| 精品免费视频| 中文字幕一区二区三区5566| 97久久夜色精品国产| 伊人精品久久久久7777| 99久久夜色精品国产亚洲狼| 伊人久久大香线蕉午夜av| 国产精品麻豆久久| 日本一本草久p| 欧美日本一区| 日韩视频免费播放| 国产视频一区欧美| 成人性做爰aaa片免费看不忠| 日本最新不卡在线| 午夜av中文字幕| 国产91色综合久久免费分享| 精品久久久久久无码人妻| k8久久久一区二区三区| a毛片毛片av永久免费| 国产日韩成人精品| 三上悠亚在线观看视频| 一区二区三区免费观看| 中文字幕一区二区三区手机版| 高跟丝袜一区二区三区| 在线免费观看av片| 日韩一区二区电影在线| 午夜国产在线视频| 一区二区三区www| av在线官网| 91国内在线视频| 国产福利一区二区三区在线播放| 成人国内精品久久久久一区| 综合激情久久| 欧美一区二区视频17c| 91久久夜色精品国产按摩| 99re6这里有精品热视频| 国产精品综合| 在线观看国产福利| 成人国产精品免费观看动漫| 国产aⅴ激情无码久久久无码| 中文字幕一区二区三区在线不卡| 久久久久亚洲av无码专区| 欧美视频一二三| ,一级淫片a看免费| 亚洲精品www久久久| av在线电影网| 午夜伦理精品一区| 久久精品xxxxx| 加勒比在线一区二区三区观看| 不卡日本视频| 日本欧美视频在线观看| 麻豆成人av在线| a级一a一级在线观看| 国产精品不卡在线观看| 在线观看亚洲欧美| 56国语精品自产拍在线观看| 深夜福利视频在线免费观看| 久久久精品亚洲| 丝袜美腿诱惑一区二区三区| 97人人香蕉| 久久国产中文字幕| 极品美女扒开粉嫩小泬| 国产酒店精品激情| 麻豆视频免费在线播放| 欧美日韩国产激情| www.成人精品| 日韩在线中文字| 伊人色综合一区二区三区影院视频| 亚洲一区二区久久久久久| 欧美亚洲在线日韩| 亚洲熟妇av一区二区三区| 成人激情动漫在线观看| 蜜桃av.com| 欧洲一区在线观看| 青青草超碰在线| 午夜精品一区二区三区在线视 | 姬川优奈av一区二区在线电影| 成人区精品一区二区| 亚洲国产成人精品女人| 天天综合网日韩| 国产欧美一区二区三区沐欲| 欧产日产国产69| 日韩精品中文字幕视频在线| caoprom在线| 福利精品视频| 亚洲欧美综合国产精品一区| 国产三级精品三级在线| 国产精品福利一区| 亚洲天堂免费av| 在线不卡国产精品| 成人开心激情| 亚洲蜜桃av| 久久精品国产免费| 欧美美女性生活视频| 欧美日韩高清一区二区不卡| 成年人在线免费观看| 国产精品一区二区三区免费视频| 精品久久影视| 三级视频中文字幕| 中文字幕成人av| 在线观看中文字幕av| 久久精品国产精品| 精品国产三区在线| h无码动漫在线观看| 国产成人精品亚洲日本在线桃色| 欧美黄色免费观看| 亚洲第一黄色网| 人人草在线视频| 欧洲av一区| 久久精品国产99| 放荡的美妇在线播放| 欧美成人激情免费网| 麻豆蜜桃在线观看| 日韩电影在线播放| 国产精品自产自拍| 国产一级特黄毛片| 亚洲精品少妇网址| 久久人体av| 2022中文字幕| 26uuu精品一区二区在线观看| 天天射天天干天天| 日韩亚洲欧美成人| jizz18欧美18| 农村妇女精品一二区| 中文字幕一区二区三区在线播放| 国产av无码专区亚洲av麻豆| 国内精品免费午夜毛片| 国产欧美一区| 婷婷激情小说网| 五月天激情小说综合| porn亚洲| 国产精品久久久久久久久久直播 | 久久久精彩视频| 青青草原综合久久大伊人精品优势| 亚洲女人久久久| 亚洲国产精品小视频| 78精品国产综合久久香蕉| 国内自拍中文字幕| 日本一区二区免费在线观看视频 | 人人干视频在线| 亚洲国产精品成人综合色在线婷婷| av中文字幕在线免费观看| 欧美在线视频免费| 亚洲成人tv| 色一情一交一乱一区二区三区| 在线播放中文一区| 午夜影院在线播放| 超碰人人爱人人| 亚洲国产精品高清| 婷婷伊人综合中文字幕| 成人在线免费观看视视频| 国产亚洲一区在线|