§Play 2.2 的新功能
§Java 和 Scala 的新結果結構
以前,結果可以是純粹或非同步、分塊或簡單。由於必須處理所有這些不同的類型,因此動作組成和篩選器難以實作,因為通常有需要套用至所有結果類型的功能,但必須實作程式碼才能遞迴解開非同步結果,並將相同的邏輯套用至分塊和簡單結果。
它也造成 Play 中非同步和同步動作之間的人為區別,這會造成混淆,導致人們認為 Play 可以以同步和非同步模式運作。事實上,Play 是 100% 非同步的,唯一能區分結果是否非同步傳回的因素,是動作處理期間是否需要執行其他非同步動作,例如 IO。
因此,我們簡化了 Java 和 Scala 中結果的結構。現在只有一個結果類型,SimpleResult
。Result
超類別在許多地方仍然有效,但已不建議使用。
在 Java 應用程式中,這表示動作現在只要傳回 Promise<SimpleResult>
,如果他們希望在要求期間執行非同步處理,而 Scala 應用程式可以使用 async
動作建構器,如下所示
def index = Action.async {
val foo: Future[Foo] = getFoo()
foo.map(f => Ok(f))
}
§更佳的緩衝和保持連線控制
Play 如何以及何時緩衝結果現在在 Scala API 中表達得更好,SimpleResult
有個新的屬性稱為 connection
,類型為 HttpConnection
。
如果設為 Close
,一旦傳送主體,回應就會關閉,而且不會嘗試緩衝。如果設為 KeepAlive
,Play 會盡力嘗試讓連線保持存活,符合 HTTP 規格,如果未指定傳輸編碼或內容長度,就會緩衝回應。
§新的動作組成和動作建構器方法
我們現在提供 ActionBuilder
特質給 Scala 應用程式,讓動作堆疊的建構更強大。例如
object MyAction extends ActionBuilder[AuthenticatedRequest] {
def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[SimpleResult]) = {
// Authenticate the action and wrap the request in an authenticated request
getUserFromRequest(request).map { user =>
block(new AuthenticatedRequest(user, request))
} getOrElse Future.successful(Forbidden)
}
// Compose the action with a logging action, a CSRF checking action, and an action that only allows HTTPS
def composeAction[A](action: Action[A]) =
LoggingAction(CheckCSRF(OnlyHttpsAction(action)))
}
產生的動作建構器可以用於內建的 Action
物件,搭配選用的剖析器和要求參數,以及非同步變體。傳遞給動作的要求參數類型會是建構器指定的類型,在上述情況中為 AuthenticatedRequest
def save(id: String) MyAction(parse.formUrlEncoded) = { request =>
Ok("User " + request.user + " saved " + request.body)
}
§改良的 Java 承諾 API
Java Promise 類別已改良,讓其功能更接近 Scala 的 Future 和 Promise。特別是,執行內容現在可以傳遞到 Promise 的方法中。
§Iteratee 函式庫執行內容傳遞
現在呼叫 Iteratee、Enumeratee 和 Enumerator 的方法時需要執行內容。為 Iteratee 函式庫公開執行內容可以更精細地控制執行發生在哪裡,而且在某些情況下可以提升效能。
執行內容可以隱含地提供,這表示對使用 Iteratees 的程式碼影響不大。
§sbt 0.13 支援
有各種可用性和效能改善。
其中一項可用性改善是我們現在支援 build.sbt
檔案來建構 Play 專案,例如 samples/java/helloworld/build.sbt
import play.Project._
name := "helloworld"
version := "1.0"
playJavaSettings
playJavaSettings
現在宣告 Java 專案所需的一切。類似地,playScalaSettings
存在於 Play Scala 專案。查看範例專案以取得此新建置組態的範例。請注意,使用 build.scala 搭配 play.Project
的先前方法仍受支援。
如需有關 sbt 0.13 變更的更多資訊,請參閱其 發行說明
§新的 stage 和 dist 任務
stage 和 dist 任務已徹底修改,以便使用 原生封裝器外掛程式。
使用原生封裝器的優點在於,除了常規 zip 檔案外,現在還可以支援許多類型的檔案,例如 tar.gz、RPM、OS X 磁碟映像、Microsoft 安裝程式 (MSI) 等。此外,現在也提供 Windows 批次指令碼和 Unix 指令碼給 Play 使用。
可以在 部署應用程式 文件中找到更多資訊。
§內建 gzip 支援
Play 現在內建支援 gzip 壓縮所有回應。如需如何啟用此功能的資訊,請參閱 設定 gzip 編碼。
§文件 JAR
Play 的發行版現在將其文件儲存在 JAR 檔案中,而不是目錄中。JAR 檔案提供對工具的更好支援。
就像在 Play 2.1 中一樣,當您 在開發模式下執行 Play 應用程式 時,您可以透過拜訪特殊的 /@documentation
位址來檢視文件。
如果您想要存取原始檔案,現在可以在發行版中包含的 play-docs
JAR 檔案中找到它們。
下一步:遷移指南
在此文件發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件指南 後,請隨時提交拉取請求。有問題或建議要分享?請前往 我們的社群論壇 與社群展開對話。