65.9K
CodeProject 正在变化。 阅读更多。
Home

Play Framework 简介

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2014年5月20日

CPOL

7分钟阅读

viewsIcon

11767

Play Framework 简介

前言

此技巧快速介绍了 Play! Framework 最有趣的功能,使其成为Web应用程序开发的吸引力框架。它还概念性地探讨了使用 Play! 设计应用程序的一些最佳实践。

引言

信息技术正以惊人的速度发展。硬件、处理器、网络、通信协议、编程语言、范式、测试模式、部署架构、应用程序模型等都在不断变化。因此,典型的 IT 专业人员/开发人员的职业生涯已经因跟上这种演变而过度劳累。

此外,Web 应用程序也取得了长足的进步,过去的静态企业网页已重塑为动态交互式和有用的应用程序。它们在世界范围内日益普及并对业务至关重要,是企业战略不可或缺的一部分。构建这些应用程序也变得越来越复杂和耗时。

这就是 Web 应用程序框架发挥作用的地方,使用它们来构建/部署/测试应用程序可以克服上述一些挑战。

Web 应用程序框架到底是什么?

那么,让我们回答这个基本问题。

维基百科将 Web 应用程序框架 (WAF) 定义为:

“一种旨在支持动态网站、Web 应用程序、Web 服务和 Web 资源开发的软件框架。该框架旨在减轻 Web 开发中执行常见活动所带来的开销。例如,许多框架提供数据库访问、模板框架和会话管理库,并且它们通常促进代码重用。”

为什么我们需要框架呢?

除了维基百科定义中提到的原因外,当前的 Web 框架列表还提供了许多其他优点,其中一些如下所述:

  • 由于内置的自动化功能和支持,加快了开发周期。
  • 支持最佳实践并利用新兴的影响力技术,如云计算。
  • 支持利用基于新型多核处理器架构,提供越来越好的性能。
  • 支持各种形状和大小的无处不在的浏览器,并推行 BYOD(自带设备)文化。

现在让我们看看 Play! 框架。

什么是 Play! 框架?

同样来自维基百科,定义如下:

“Play 是一个开源 Web 应用程序框架,用 Scala 和 Java 编写,遵循模型-视图-控制器 (MVC) 架构模式。它旨在通过约定优于配置、热代码重新加载和在浏览器中显示错误(用于调试的开发模式)来优化开发人员生产力。”

Play! 框架的特点?

下面列出了一些最引人注目的功能:

  1. 明智的“约定优于配置”设计,使开发人员摆脱了当代流行框架引入的“配置 XML 困境”。
  2. 热代码重新加载,允许您在自己喜欢的 IDE 中更改代码,并在浏览器 UI 页面上点击重新加载,以触发自动编译-打包-部署-运行循环,从而实现更快的增量开发。
  3. 基于推送的 MVC 堆栈,具有模板、持久化和测试引擎,可促进出色的代码重用、可插拔性和 TDD 风格的开发。
  4. 非常适用于企业持续集成设置,如 Jenkins、Calimoucho 和 GIT 等 CM 工具。
  5. 无共享响应式服务器端框架,使开发现代 BYOD 风格的 RESTful 应用程序变得容易。还支持资产编译器和 WebSocket。
  6. 具有云感知能力,并通过其专用附加模块支持 NOSQL。
  7. 通过开箱即用的附加模块,支持从简单到联邦的安全。
  8. 支持使用传统语言(如果需要,可以使用 Java)以及 Scala 等新型编程语言进行编码,以利用面向性能的响应式代码。

注意:新语言还利用多核处理器在可能时调度并行处理,使用不可变对象,并使用基于 actor 的本地化并发设计,从而消除并发状态设计和代码的痛苦。)

使用 Play Framework 的设计考虑

这一切都始于 MVC 和模块化思维。

模型

Play 中的模型对象并不完全像其他地方那样愚蠢。模型有责任维护其完整性。getter-setter 越少,模型对象越幂等……您的模型设计就越好!共享状态和并发处理线程是您应该尽可能避免的事情。

此外,避免使用常见的 Java 反模式贫血领域模型,以便您将数据与所需的行为本地化,并将它们封装到知道如何保持其完整性的有用对象中。

此外,您可能会发现单个模型对象可能无法在不变得过于臃肿的情况下容纳您的业务逻辑。在这种情况下,您可以使用泛化-特化模式,将特定用途的逻辑保存在子类对象中,以获得更清晰的设计。

避免模型对象直接服务于最终用户调用……这应该由控制器来完成。此外,表示层代码,例如 HTML 片段、文本字体格式细节等,不应成为模型状态或模型数据的一部分。

控制器

控制器提供了一个放置应用程序行为和导航方面的地方。设计能够映射到应用程序功能的控制器,而应用程序功能本身又通过模块化进行划分,从长远来看,在更易于维护和错误定位方面会带来很好的回报。Play! 中另一个经常被误用的概念——控制器链式调用——同样也是一个糟糕的主意!在单个或多个控制器中拥有复杂的分支逻辑以获得更高阶的动作抽象无论如何都是一个糟糕的主意!避免这样做的诱惑。

使用不可变库(在 Java 或 Scala 中)通常会带来更好的设计、可伸缩性和性能,并进一步推动“响应式设计”事业。

Play! 允许的另一个方面是指定 URL 到特定控制器方法的路由,从而可以以非常 RESTful 的范例将功能精细地映射到底层代码。这极大地有助于更好地构建、调试和扩展 RESTful 应用程序。

控制器应该创建模型实例并根据用户操作或业务逻辑的需要操作状态。它们不应包含数据库特定代码,也不应包含 SQL 等数据库特定命令。

View

Play! 中的视图负责以所需的格式或特定的 UI 样式向最终用户呈现模型状态。因此,它们只应包含呈现代码。它们应避免显式的 GET 和 PUT 等 HTTP 请求,因为这是控制器的职责。它们还应避免显式的 SQL 语句来获取数据。它们可以使用控制器方法来完成此操作。

Play! 中的模板引擎为进入 Play! 世界的 Java 开发者提供了类似 Java-JSP 的标签和其他好东西(无论是 Java 还是 Scala)。隐式使用会话、flash、请求、参数、消息、输出等对象。

Play! 中的模板为设计 UI 模块并根据需要动态组装它们提供了一种极好的方法。选择它们来从头开始构建您的应用程序,而不是构建带有动态 DOM 操作的单体。使用它们来构建局部视图以实现有效的重用。

另一个最佳实践是解耦您的 RESTful 服务器端 API,并使用 JSON 对象作为“粘合剂”,利用 JQuery/AngularJS/ExpressionJS/D3j.s 等构建一个丰富而强大的 UI。这有助于从长远来看设计、构建、扩展您的应用程序,以适应新的设备和计算环境。

其他一些最佳实践

在 Play! Controller 对象中,结果被设计为不可变。这可以通过结合缓存来加以利用。这可以帮助您进一步扩展您的应用程序。

无论当时是否需要,将会话对象用于存储各种数据是一种常见的错误做法。这会导致巨大的内存膨胀和整体性能下降。Play! 不支持会话对象,而是使用 cookie 来维护浏览器状态。这使得 Play 应用程序从第一次部署周期开始就具备集群就绪性和可伸缩性。

使用异步编程模型进一步帮助您的应用程序在实际生活中进行扩展。Play! 在底层使用 Akka 来支持使用 Actor 的异步模型。使用异步范式,它在底层使用 Futures 和 Promises,以提供比通常的同步代码显著更高的性能和可伸缩性。

还可以使用 Play! 附加模块,如 GAE、PDF-generator、MongoDB、Secure Social(如 OpenID、Oauth 等),以利用最佳实践并使您的应用程序适应新的持久性 (persistence) 和 UI 接口。

© . All rights reserved.