1. 概述
本教程旨在探索 Play Framework 的核心特性,并演示如何使用它构建 Web 应用程序。
Play 是一个面向 JVM 语言(主要是 Java 和 Scala)的高生产力 Web 应用框架。它集成了现代 Web 开发所需的组件和 API,让开发者能够快速构建可扩展的应用。
2. Play Framework 环境搭建
访问 Play 官方下载页面获取最新版本(当前为 2.7)。下载 Play Java Hello World 教程的 zip 包并解压到合适位置。
在解压后的根目录中,你会发现一个 sbt
可执行文件,可直接运行应用。或者从官方页面安装 sbt
。
使用解压目录中的 sbt
运行应用:
cd /path/to/folder/
./sbt run
注意:./
表示执行当前目录下的脚本。
如果已安装 sbt
,则可直接使用:
cd /path/to/folder/
sbt run
运行后终端会显示:(Server started, use Enter to stop and go back to the console...)
。此时访问 http://localhost:9000 即可看到 Play 欢迎页面:
3. Play 应用程序结构解析
本节深入分析 Play 应用的目录结构及各文件用途。若想直接上手实践,可跳至下一节。
典型 Play 应用的目录结构如下:
├── app → 应用源代码
│ ├── assets → 编译后的静态资源源码
│ │ ├── javascripts → CoffeeScript 源文件
│ │ └── stylesheets → LESS CSS 源文件
│ ├── controllers → 控制器
│ ├── models → 业务逻辑层
│ └── views → 模板
├── build.sbt → 构建脚本
├── conf → 配置文件及非编译资源
│ ├── application.conf → 主配置文件
│ └── routes → 路由定义
├── dist → 项目分发文件
├── lib → 非托管依赖库
├── logs → 日志目录
│ └── application.log → 默认日志文件
├── project → sbt 配置文件
│ ├── build.properties → sbt 项目标记
│ └── plugins.sbt → sbt 插件(含 Play 声明)
├── public → 公共静态资源
│ ├── images → 图片文件
│ ├── javascripts → JavaScript 文件
│ └── stylesheets → CSS 文件
├── target → 生成文件
│ ├── resolution-cache → 依赖信息
│ ├── scala-2.11
│ │ ├── api → 生成的 API 文档
│ │ ├── classes → 编译后的类文件
│ │ ├── routes → 路由生成的源码
│ │ └── twirl → 模板生成的源码
│ ├── universal → 应用打包
│ └── web → 编译后的 Web 资源
└── test → 单元/功能测试目录
3.1. app
目录
包含 Java 源码、Web 模板和编译资源源码——即所有可执行资源。
关键子目录遵循 MVC 架构:
- ✅
models
:业务逻辑层,通常包含数据库表模型和持久化访问逻辑 - ✅
views
:所有可渲染至浏览器的 HTML 模板 - ✅
controllers
:控制器类,包含处理 API 请求的公开方法(Action) - ✅
assets
:CSS/JavaScript 等编译资源
可自定义包名(如
app/com/baeldung/controllers
),但建议保持约定俗成的结构。
3.2. public
目录
存放由 Web 服务器直接提供的静态资源,通常包含三个子目录:
images
:图片文件javascripts
:JavaScript 文件stylesheets
:CSS 文件
⚠️ 建议所有 Play 应用统一采用此组织方式。
3.3. conf
目录
包含应用配置文件:
application.conf
:主配置文件(数据库、日志等)routes
:路由定义文件(声明所有接口)
其他配置文件也应放置于此目录。
3.4. lib
目录
存放未托管依赖(未在构建系统中声明的 jar 包),会自动添加到类路径。
3.5. build.sbt
文件
应用构建脚本,用于声明依赖(如测试库、持久化框架等)。
3.6. project
目录
包含所有 SBT 构建配置文件。
3.7. target
目录
存放构建系统生成的文件(如 .class
文件)。
熟悉目录结构后,我们通过实例深入框架核心。
4. 快速上手示例
本节创建一个基础 Web 应用,掌握 Play 框架核心概念。
除了下载示例项目,我们还可以用 sbt new
命令创建应用:
sbt new playframework/play-java-seed.g8
需提前安装
sbt
(参考第 2 节)。
命令执行过程中会提示:
- 项目名称(默认
play-java-seed
) - 域名(按 Java 包名倒序,如
com.example
)
生成的应用结构与之前相同,运行方式一致:
cd /path/to/folder/
sbt run
应用启动后将在 9000 端口暴露接口,访问 http://localhost:9000 显示 "Welcome to Play"。
新应用默认提供两个接口:
- 根接口
/
:显示欢迎页("Welcome to Play!") - 资源接口
/assets
:通过路径下载文件(如 http://localhost:9000/assets/images/favicon.png)
5. 控制器与动作
控制器中处理请求参数并返回响应的 Java 方法称为动作(Action)。控制器是继承 play.mvc.Controller
的类,用于逻辑分组相关动作。
查看 app/controllers/HomeController.java
:
public Result index() {
return ok(views.html.index.render());
}
index
动作返回包含欢迎消息的 Web 页面,对应 views
包中的默认模板:
@main("Welcome to Play") {
<h1>Welcome to Play!</h1>
}
index
模板调用 main
模板(处理页面结构):
@(title: String)(content: Html)
<!DOCTYPE html>
<html lang="en">
<head>
@* 渲染页面标题 *@
<title>@title</title>
<link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
<link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")">
</head>
<body>
@* 渲染页面内容 *@
@content
<script src="@routes.Assets.versioned("javascripts/main.js")" type="text/javascript"></script>
</body>
</html>
修改 index
模板内容:
@main("Welcome to Baeldung") {
<h1>Welcome to Play Framework Tutorial on Baeldung!</h1>
}
刷新浏览器后显示:
Welcome to Play Framework Tutorial on Baeldung!
移除模板渲染,直接返回纯文本或 HTML:
public Result index() {
return ok("REST API with Play by Baeldung");
}
浏览器将显示无格式的纯文本:
REST API with Play by Baeldung
可通过
Html.apply
返回 HTML 内容(如<h1>
标签)。
添加 /baeldung/html
接口(在 routes
文件):
GET /baeldung/html controllers.HomeController.applyHtml
实现控制器方法:
public Result applyHtml() {
return ok(Html.apply("<h1>This text will appear as a heading 1</h1>"));
}
访问 http://localhost:9000/baeldung/html 将看到 HTML 格式的标题。
至此,我们掌握了两个关键特性:
- 热重载:代码修改后刷新浏览器即时生效(Play 自动编译)
- 响应助手:
play.mvc.Results
类提供标准 HTTP 响应方法(如ok()
返回 200 状态码)
其他助手方法:
notFound()
、badRequest()
等。
6. 响应定制
Play 默认支持内容协商——根据响应体自动推断 Content-Type
。例如:
return ok("text to display"); // 自动设置 Content-Type: text/plain
但我们可以手动指定响应类型:
public Result customContentType() {
return ok("This is some text content").as("text/html");
}
同样适用于
text/plain
、application/json
等类型。
自定义请求头:
public Result setHeaders() {
return ok("This is some text content")
.as("text/html")
.withHeader("Header-Key", "Some value");
}
7. 总结
本文介绍了 Play Framework 的基础概念,并演示了如何快速构建 Java Web 应用。完整源码可在 GitHub 获取。
⚠️ 踩坑提示:开发时注意热重载依赖
sbt
的文件监控,若修改未生效可尝试重启服务器。