文档

§Play 2.2 中的新功能

§Java 和 Scala 的新结果结构

以前,结果可以是纯文本或异步的,分块的或简单的。处理所有这些不同类型使得操作组合和过滤器难以实现,因为通常需要对所有类型的结果应用功能,但代码必须实现以递归地解包异步结果,并将相同的逻辑应用于分块和简单结果。

它还在 Play 中创建了异步操作和同步操作之间的人为区别,这会导致混淆,让人们认为 Play 可以以同步和异步模式运行。实际上,Play 是 100% 异步的,唯一区别于结果是否异步返回的是在操作处理期间是否需要执行其他异步操作,例如 IO。

因此,我们简化了 Java 和 Scala 中结果的结构。现在只有一种结果类型,SimpleResultResult 超类在许多地方仍然有效,但已弃用。

在 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 规范,如果未指定传输编码或内容长度,则缓冲响应。

§新的操作组合和操作构建器方法

我们现在为 Scala 应用程序提供了一个 ActionBuilder 特征,它允许更强大的操作堆栈构建。例如

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 构建器可以像内置的 Action 对象一样使用,并支持可选的解析器和请求参数,以及异步变体。传递给 Action 的请求参数的类型将是构建器中指定的类型,在本例中为 AuthenticatedRequest

def save(id: String) MyAction(parse.formUrlEncoded) = { request =>
  Ok("User " + request.user + " saved " + request.body)
}

§改进的 Java Promise API

Java Promise 类已得到改进,以使其功能更接近 Scala 的 Future 和 Promise。特别是,现在可以将执行上下文传递到 Promise 的方法中。

§Iteratee 库执行上下文传递

现在在调用 Iteratee、Enumeratee 和 Enumerator 的方法时需要执行上下文。为 Iteratee 库公开执行上下文可以更细粒度地控制执行发生的位置,并在某些情况下可以提高性能。

执行上下文可以隐式提供,这意味着对使用 Iteratee 的代码影响很小。

§sbt 0.13 支持

已经进行了各种可用性和性能改进。

一项可用性改进是,我们现在支持用于构建 Play 项目的 build.sbt 文件,例如 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 任务

stagedist 任务已完全改造,以使用 Native Packager 插件

使用 Native Packager 的好处是,除了常规的 zip 文件之外,现在还可以支持许多类型的存档,例如 tar.gz、RPM、OS X 磁盘映像、Microsoft 安装程序 (MSI) 等等。此外,现在还为 Play 提供了 Windows 批处理脚本和 Unix 批处理脚本。

有关更多信息,请参阅 部署应用程序 文档。

§内置 gzip 支持

Play 现在内置支持对所有响应进行 gzip 压缩。有关如何启用此功能的信息,请参阅 配置 gzip 编码

§文档 JAR

Play 的发行版现在将文档存储在 JAR 文件中,而不是目录中。JAR 文件为工具提供了更好的支持。

就像在 Play 2.1 中一样,您可以在 开发模式下运行 Play 应用程序 时,通过访问特殊的 /@documentation 地址查看文档。

如果您想访问原始文件,现在可以在发行版中包含的 play-docs JAR 文件中找到它们。

下一步:迁移指南


发现此文档中的错误?此页面的源代码可以在 这里 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区开始对话。