1. 概述

本教程将带你快速入门 Play Framework,使用 Scala 语言。我们将从安装、项目生成开始,逐步实现自定义功能,并介绍其内置的测试机制。

如果你是 Java 开发者,也可以参考我们准备的 Play Framework Java 版入门教程

2. 环境准备

在开始之前,你需要安装以下工具:

sbt 命令行工具
✅ JDK 11 或更高版本(推荐 JDK 17)

在本文中,我们使用的是 sbt 1.9.7,搭配 Play Framework 3.0.0
⚠️ Play 2.9 与 3.0.0 非常相似,唯一的重大区别是:Play 2.9 使用 Akka,而 Play 3.0.0 使用 Apache Pekko

3. 命令行工具使用

Play Framework 提供了强大的控制台和构建工具支持。

我们可以通过 sbt 模板快速生成一个 Play 项目

sbt new playframework/play-scala-seed.g8

工具会加载依赖并提示你输入项目名和组织名:

This template generates a Play Scala project
name [play-scala-seed]:

我们将其命名为 baeldung-play-framework,组织名设为 baeldung.com,它也将作为默认包名。

进入项目目录后,运行项目:

cd baeldung-play-framework
sbt run

首次运行可能需要几分钟用于编译和构建依赖。启动完成后,访问 http://localhost:9000 即可看到默认欢迎页面:

ScalaPlayWelcomeScreen

至此,我们已经成功启动了一个 HTTP 服务器,且一行代码都没写

4. 项目结构概览

接下来,我们将项目导入 IDE 并查看目录结构。

sbt 模板自动生成了以下四个目录:

  • app/controllers:存放控制器逻辑(Scala 代码)
  • app/views:存放 HTML 模板文件
  • conf:配置目录,包含路由规则(URL 映射)
  • public:静态资源目录(如 CSS、JS、图片等)

这些目录结构清晰,符合 MVC 模式。

5. 第一次修改:热刷新体验

Play Framework 支持“刷新即生效”的开发体验 ✅

我们来尝试修改代码并刷新浏览器查看效果。

首先,在 app/views 目录下新建一个文件:firstexample.scala.html,内容如下:

@()

@main("Welcome to Introduction to Play Framework!") {
    <h1>Welcome to Introduction to Play Framework!</h1>
}

接着,打开 app/controllers/HomeController.scala,将原来的 Ok(views.html.index()) 修改为:

Ok(views.html.firstexample())

此时,Play 服务器日志不会有任何变化。但当你刷新浏览器时,页面内容就会更新:

ScalaPlayWelcomeScreen2

6. 定义新的 Action(接口)

前面我们修改了已有代码,现在我们来了解 Play 的核心机制:路由 + Action(接口)

当请求到达时,Play 会查看 conf/routes 文件,决定哪个 Controller 的哪个方法来处理请求。

实现一个带参数的接口

假设我们要定义一个接口,接收两个 URL 参数,返回它们的和。

HomeController.scala 中添加如下方法:

def printSum(first: Long, second: Long) = Action { implicit request: Request[AnyContent] =>
    val sum = first + second
    Ok(views.html.index(sum))
}

然后修改 views/index.scala.html 文件,添加参数并使用:

@(sum: Long)

@main("Add two numbers") {
    <h1>The sum is @sum!</h1>
}

最后在 conf/routes 中添加路由规则:

GET /sum/:first/:second controllers.HomeController.printSum(first: Long, second: Long)

访问 http://localhost:9000/sum/5/15 后,你会看到如下页面:

ScalaPlaySumScreen

7. 测试支持

Play Framework 内置了测试框架支持。项目生成时会自动创建测试模板。

打开 test/controllers/HomeControllerSpec.scala,可以看到基于 ScalaTest 的测试样例。

我们为新增的 /sum 接口添加一个测试用例:

"render a page that prints the sum of two numbers" in {
    val request = FakeRequest(GET, "/sum/10/20")
    val sumOfNumbers = route(app, request).get

    status(sumOfNumbers) mustBe OK
    contentType(sumOfNumbers) mustBe Some("text/html")
    contentAsString(sumOfNumbers) must include ("The sum is 30!")
}

运行测试命令:

sbt test

如果一切正常,你会看到测试通过 ✅

8. 总结

在这篇文章中,我们:

✅ 使用 sbt 创建了 Play 项目
✅ 实现了自定义页面与接口
✅ 配置了路由与参数传递
✅ 编写了简单的测试用例

完整的示例代码可以在 GitHub 上获取:https://github.com/Baeldung/scala-tutorials/tree/master/play-scala


📌 提示:Play Framework 的热加载和简洁的路由机制,使其成为开发 Web 应用的理想选择,尤其适合敏捷开发团队。


原始标题:Introduction to the Play Framework in Scala