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 即可看到默认欢迎页面:
至此,我们已经成功启动了一个 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 服务器日志不会有任何变化。但当你刷新浏览器时,页面内容就会更新:
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 后,你会看到如下页面:
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 应用的理想选择,尤其适合敏捷开发团队。