原文:http://zetcode.com/java/play/

这是 Play 框架的入门教程。 我们使用 Play 创建简单的 Web 应用。 本教程使用 Play 版本 2.5。

Play 是一个用 Scala 和 Java 编写的开源 Web 应用框架。 Play 由 Guillaume Bort 于 2007 年创建。Play 受 ASP.NET MVC,Ruby on Rails 和 Django 的极大启发。 Play 与 Dropwizard,Ninja 框架或 Jodd 等其他框架一起属于下一代 Java Web 框架。

使用模型视图控制器(MVC)架构模式构建播放。 传统的 MVC 模式将应用分为三个部分:模型,视图和控制器。 该模型表示应用中的数据。 视图是数据的视觉表示。 最后,控制器处理并响应事件(通常是用户操作),并可以调用模型上的更改。 这个想法是通过引入一个中间组件:控制器,将数据访问和业务逻辑与数据表示和用户交互分开。

为了优化开发者的生产力,它使用约定而非配置和热代码重载。 优于配置的约定是一种软件设计范式,软件框架使用它来减少设置项目所需的工作。 诸如 Ruby on Rails 或 Play 之类的框架将合理的默认值用于项目结构,将对象属性与表列相关联或为视图命名。 该范式也称为约定编码。

Play 的主要功能

以下是 Play 的主要功能列表:

  • Play 默认情况下将 JBoss Netty 用于 Web 服务器。
  • 它使用 Scala SBT 构建工具来构建应用。
  • 这是一个 RESTful 框架。
  • 它具有基于 JPA 的持久层。
  • 它使用 Scala 作为模板引擎。
  • 它是一个完整的栈框架,其中包含许多常见开发任务的库,例如 JSON 解析,验证,持久性或认证。

Play 放弃了 Java Web 开发中使用的许多传统方法。 它不使用 servlet,也不会将项目打包到 WAR 档案中。 它不使用巨大的整体 Web 应用服务器(JBoss,Glassfish)和 XML 配置文件。

安装 Play

Play 是 Maven 仓库中可用的一系列库。 可以使用任何构建工具来创建 Play 应用。 默认情况下,Play 使用 Sbt 构建工具(默认的 Scala 构建工具)创建 Play 应用。

要创建 Play 应用,我们使用称为激活器的工具。 激活器包括一个 Sbt 构建工具,一组和项目模板以及一个用于管理项目的 Web 界面。 两个重要的种子模板是 Scala 开发者使用的play-scals和 Java 开发者使用的play-java

从 Play 框架的项目页面中,我们下载了激活器。 我们建议下载整个脱机发行版。 下载发行版后,我们将包解压缩到所选目录。 我们将其放入主目录的bin子目录中。

  1. $ export PATH=$PATH:~/bin/activator-dist-1.3.10/bin/

我们将激活器的bin目录添加到PATH变量中。

创建 Play 应用

现在,我们将创建一个新的 Play 应用。

  1. $ activator new first play-java

该命令创建一个名为first的新 Play Java 应用。

  1. $ cd first
  2. $ tree
  3. .
  4. ├── app
  5. ├── controllers
  6. ├── AsyncController.java
  7. ├── CountController.java
  8. └── HomeController.java
  9. ├── filters
  10. └── ExampleFilter.java
  11. ├── Filters.java
  12. ├── Module.java
  13. ├── services
  14. ├── ApplicationTimer.java
  15. ├── AtomicCounter.java
  16. └── Counter.java
  17. └── views
  18. ├── index.scala.html
  19. └── main.scala.html
  20. ├── bin
  21. ├── activator
  22. └── activator.bat
  23. ├── build.sbt
  24. ├── conf
  25. ├── application.conf
  26. ├── logback.xml
  27. └── routes
  28. ├── libexec
  29. └── activator-launch-1.3.10.jar
  30. ├── LICENSE
  31. ├── project
  32. ├── build.properties
  33. └── plugins.sbt
  34. ├── public
  35. ├── images
  36. └── favicon.png
  37. ├── javascripts
  38. └── hello.js
  39. └── stylesheets
  40. └── main.css
  41. ├── README
  42. └── test
  43. ├── ApplicationTest.java
  44. └── IntegrationTest.java

应用的源代码位于app目录中。 bin目录包含激活器工具。 build.sbt是应用构建脚本。 conf目录包含配置文件和其他未编译的资源。 project目录具有 sbt 配置文件。 public目录包含公共资产,例如静态 HTML 文件,JavaScript 文件,图像或 CSS 文件。 test目录是用于单元测试或功能测试的源文件夹。 在构建应用时,将生成新目录。 例如,target目录包含框架生成的文件。

  1. $ activator run

在项目目录中,我们使用activator run命令运行该应用。 该应用中已经包含一些简单的代码。

Play 框架简介 - 图1

图:第一个 Play 应用

默认情况下,应用在端口 9000 上进行监听。 请注意,由于应用是动态编译的,因此存在一些延迟。

现在,我们将对应用进行一些修改。

routes

  1. # Routes
  2. # This file defines all application routes (Higher priority routes first)
  3. # ~~~~
  4. # An example controller showing a sample home page
  5. GET / controllers.HomeController.index
  6. # An example controller showing how to use dependency injection
  7. GET /count controllers.CountController.count
  8. # An example controller showing how to write asynchronous code
  9. GET /message controllers.AsyncController.message
  10. # Map static resources from the /public folder to the /assets URL path
  11. GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)

conf/routes文件中,我们定义了应用的所有路由。 路由器是将每个传入 HTTP 请求转换为操作调用的组件,该操作调用是控制器类中的公共方法。 我们可以看到根路由/调用了HomeControllerindex()方法。

HomeController.java

  1. package controllers;
  2. import play.mvc.Controller;
  3. import play.mvc.Result;
  4. import views.html.index;
  5. /**
  6. * This controller contains an action to handle HTTP requests
  7. * to the application's home page.
  8. */
  9. public class HomeController extends Controller {
  10. public Result index() {
  11. return ok(index.render("First application"));
  12. }
  13. }

我们修改HomeController类。 index()方法返回ok(),生成 HTTP 200 OK 结果。 索引操作调用render()方法,该方法告诉 Play 渲染模板。 使用模板是生成 HTTP 响应的最常见方法。 我们没有明确指定应选择哪个模板,因此 Play 选择默认模板:views/index.scala.html

index.scala.html

  1. @(message: String)
  2. @main("Welcome to Play") {
  3. @message
  4. }

我们修改文件以包含上面的代码。 该模板也称为主模板。

main.scala.html

  1. @(title: String)(content: Html)
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <title>@title</title>
  6. </head>
  7. <body>
  8. @content
  9. </body>
  10. </html>

这是主模板,从索引模板调用。 它用字符串数据填充标题和内容。

Play 框架简介 - 图2

图:第一个 Play 应用 2

现在,文档已删除,仅显示该消息。

简单的表单

我们创建一个可以使用 HTML 表单的应用。

  1. $ activator new myform play-java

创建一个新的 Play 应用。

  1. $ tree app
  2. app
  3. ├── controllers
  4. └── Application.java
  5. ├── filters
  6. ├── services
  7. └── views
  8. ├── greet.scala.html
  9. ├── index.scala.html
  10. └── main.scala.html
  11. 4 directories, 4 files

我们删除app子目录中的所有现有文件。 我们创建一个 Java 文件和三个 HTML 文件。

routes

  1. # Routes
  2. GET / controllers.Application.index
  3. GET /greet controllers.Application.greet

routes文件中,我们有两个 GET 请求。

Application.java

  1. package controllers;
  2. import play.data.FormFactory;
  3. import play.mvc.Controller;
  4. import play.mvc.Result;
  5. import views.html.index;
  6. import javax.inject.Inject;
  7. public class Application extends Controller {
  8. @Inject
  9. FormFactory formFactory;
  10. public Result index() {
  11. return ok(index.render("Enter your name:"));
  12. }
  13. public Result greet() {
  14. String name = formFactory.form().bindFromRequest().get("name");
  15. StringBuilder sb = new StringBuilder("Hello ");
  16. sb.append(name);
  17. return ok(sb.toString());
  18. }
  19. }

我们有一个Application控制器。

  1. @Inject
  2. FormFactory formFactory;

我们注入FormFactory,它是用于创建表单的帮助程序类。

  1. public Result index() {
  2. return ok(index.render("Enter your name:"));
  3. }

index()操作将呈现一个页面,告诉用户输入其名称。

  1. String name = formFactory.form().bindFromRequest().get("name");

我们将名称请求参数绑定到name变量。

  1. StringBuilder sb = new StringBuilder("Hello ");
  2. sb.append(name);
  3. return ok(sb.toString());

我们构建并返回一条消息。

index.scala.html

  1. @(message: String)
  2. @main("My form") {
  3. @message
  4. <form action="@routes.Application.greet", method="get">
  5. <input type="text" name="name" />
  6. <button>Submit</button>
  7. </form>
  8. }

index.scala.html文件中,我们有一个 HTML 表单,用于发送 GET 请求。

greet.scala.html

  1. @(message: String)
  2. @main("My form") {
  3. @message
  4. }

greet.scala.html文件显示生成的消息。

main.scala.html

  1. @(title: String)(content: Html)
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <title>@title</title>
  6. </head>
  7. <body>
  8. @content
  9. </body>
  10. </html>

main.scala.html文件是主模板文件,它与其他两个模板文件合并。

这是 Play 框架的简介。 您可能还需要查看相关的教程:Stripes 教程Java MVC 教程Spark Java 入门Jtwig 教程Java 教程SQL 查询标签教程