1. 概述
本入门教程的目的是探索Play框架并了解如何使用它创建Web应用程序。
Play是一个高效的Web应用程序框架,适用于在JVM上编译和运行代码的编程语言,主要是Java和Scala,它集成了现代Web应用程序开发所需的组件和API。
2. Play框架设置
让我们前往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 Framework应用程序中找到的文件和文件夹:
├── app → Application sources
│ ├── assets → Compiled Asset sources
│ │ ├── javascripts → Typically Coffee Script sources
│ │ └── stylesheets → Typically LESS CSS sources
│ ├── controllers → Application controllers
│ ├── models → Application business layer
│ └── views → Templates
├── build.sbt → Application build script
├── conf → Configurations files and other non-compiled resources (on classpath)
│ ├── application.conf → Main configuration file
│ └── routes → Routes definition
├── dist → Arbitrary files to be included in your projects distribution
├── lib → Unmanaged libraries dependencies
├── logs → Logs folder
│ └── application.log → Default log file
├── project → sbt configuration files
│ ├── build.properties → Marker for sbt project
│ └── plugins.sbt → sbt plugins including the declaration for Play itself
├── public → Public assets
│ ├── images → Image files
│ ├── javascripts → Javascript files
│ └── stylesheets → CSS files
├── target → Generated files
│ ├── resolution-cache → Information about dependencies
│ ├── scala-2.11
│ │ ├── api → Generated API docs
│ │ ├── classes → Compiled class files
│ │ ├── routes → Sources generated from routes
│ │ └── twirl → Sources generated from templates
│ ├── universal → Application packaging
│ └── web → Compiled web assets
└── test → source folder for unit or functional tests
3.1 app目录
该目录包含Java源代码、Web模板和编译资产的源-基本上是所有源和所有可执行资源。
app目录包含一些重要的子目录,每个子目录都打包了MVC架构模式的一部分:
- models:这是应用程序业务层,此包中的文件可能会为我们的数据库表建模,并使我们能够访问持久层
- views:所有可以呈现给浏览器的HTML模板都包含在此文件夹
- controllers:一个子目录,其中存放着我们的控制器。控制器是Java源文件,其中包含每个API调用要执行的操作,操作是处理HTTP请求并返回与HTTP响应相同的结果的公共方法
- assets:包含已编译资产(如CSS和Javascript)的子目录。上述命名约定非常灵活,我们可以创建自己的包,例如app/utils包。我们还可以自定义包命名app/cn/tuyucheng/taketoday/controllers
它还包含特定应用程序所需的可选文件和目录。
3.2 public目录
存储在public目录中的资源是静态资产,由Web服务器直接提供服务。
此目录通常包含三个子目录,分别用于存放图片、CSS和JavaScript文件。建议像这样组织资源文件,以确保所有Play应用中的一致性。
3.3 conf目录
conf目录包含应用程序配置文件,application.conf是我们将Play应用程序的大多数配置属性放置到的位置,我们将在routes中定义应用程序的端点。
如果应用程序需要任何额外的配置文件,则应将它们放在此目录中。
3.4 lib目录
lib目录是可选的,包含非托管库依赖,如果我们有任何未在构建系统中指定的jar,我们会将它们放在此目录中,它们将自动添加到应用程序类路径中。
3.5 build.sbt文件
build.sbt文件是应用程序构建脚本,在这里列出运行应用程序所需的依赖,例如测试和持久层库。
3.6 project目录
所有基于SBT配置构建过程的文件均位于project目录中。
3.7 target目录
该目录包含构建系统生成的所有文件-例如所有.class文件。
了解并探索了我们刚刚下载的Play框架Hello World示例的目录结构后,我们现在可以使用示例来了解该框架的基础知识。
4. 简单示例
在本节中,我们将创建一个非常基本的Web应用程序示例。
我们不下载示例项目并从中构建,而是看看使用sbt new命令创建Play框架应用程序的另一种方法。
让我们打开命令提示符,导航到选择的位置,然后执行以下命令:
sbt new playframework/play-java-seed.g8
为此,我们需要已经安装sbt,如第2节中所述。
上述命令首先会提示我们输入项目名称,接下来,它会要求输入将用于包的域(反向,这是Java中的包命名约定)。
使用此命令生成的应用程序具有与之前生成的应用程序相同的结构,因此,我们可以像以前一样继续运行该应用程序:
cd /path/to/folder/
sbt run
上述命令执行完成后,将在端口号9000上生成一个服务器来公开我们的API,我们可以通过http://localhost:9000访问它,然后应该在浏览器中看到“Welcome to Play”的消息。
我们的新API有两个端点,可以从浏览器中依次试用它们。第一个端点是根端点,它会加载一个带有“Welcome to Play!”消息的索引页。
第二个端点位于http://localhost:9000/assets,用于通过在路径中添加文件名来从服务器下载文件。我们可以通过在http://localhost:9000/assets/images/favicon.png获取随应用程序下载的favicon.png文件来测试此端点。
5. 操作和控制器
控制器类中的Java方法处理请求参数并产生要发送给客户端的结果,称为操作。
控制器是一个扩展play.mvc.Controller的Java类,它将可能与它们为客户端产生的结果相关的操作逻辑地分组在一起。
现在让我们转到app-parent-dir/app/controllers并关注HomeController.java。
HomeController的index操作返回一个带有简单欢迎消息的网页:
public Result index() {
return ok(views.html.index.render());
}
该网页是views包中的默认index模板:
@main("Welcome to Play") {
<h1>Welcome to Play!</h1>
}
如上所示,index页面调用main模板。然后,main模板处理页面标题和正文标签的呈现。它需要两个参数:一个用于页面标题的String和一个用于插入页面正文的Html对象。
@(title: String)(content: Html)
<!DOCTYPE html>
<html lang="en">
<head>
@* Here's where we render the page title `String`. *@
<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>
@* And here's where we render the `Html` object containing
* the page content. *@
@content
<script src="@routes.Assets.versioned("javascripts/main.js")" type="text/javascript"></script>
</body>
</html>
让我们稍微改变一下index文件中的文本:
@main("Welcome to Tuyucheng") {
<h1>Welcome to Play Framework Tutorial on Tuyucheng!</h1>
}
重新加载浏览器将会看到一个粗体标题:
Welcome to Play Framework Tutorial on Tuyucheng!
我们可以通过删除HomeController的index()方法中的render指令来完全废除模板,以便我们可以直接返回纯文本或HTML文本:
public Result index() {
return ok("REST API with Play by Tuyucheng");
}
编辑代码后,如上所示,浏览器中将只有文本。这只是纯文本,没有任何HTML或样式:
REST API with Play by Tuyucheng
我们也可以通过将文本包装在标题<h1></h1>标签中,然后将HTML文本传递给Html.apply方法来输出HTML。
让我们在路由中添加一个/tuyucheng/html端点:
GET /tuyucheng/html controllers.HomeController.applyHtml
现在让我们创建处理此端点上的请求的控制器:
public Result applyHtml() {
return ok(Html.apply("<h1>This text will appear as a heading 1</h1>"));
}
当我们访问http://localhost:9000/tuyucheng/html时,我们将看到以HTML格式显示的上述文本。
我们通过自定义响应类型来操纵响应,我们将在后面的部分中更详细地介绍此功能。
我们还看到了Play框架的另外两个重要功能。
首先,重新加载浏览器会反映我们代码的最新版本;这是因为我们的代码更改是动态编译的。
其次,Play在play.mvc.Results类中为我们提供了标准HTTP响应的辅助方法。例如,ok()方法,它返回OK HTTP 200响应以及我们作为参数传递给它的响应主体。
Results类中还有更多辅助方法,例如notFound()和badRequest()。
6. 操纵结果
Play会自动从响应主体中推断出响应内容类型,这就是为什么我们能够在ok方法中返回文本的原因:
return ok("text to display");
然后Play会自动将Content-Type标头设置为text/plain,虽然这在大多数情况下都有效,但我们可以接管控制并自定义Content-Type标头。
我们将HomeController.customContentType操作的响应自定义为text/html:
public Result customContentType() {
return ok("This is some text content").as("text/html");
}
此模式适用于所有类型的内容,根据传递给ok辅助方法的数据格式,我们可以用text/plain或application/json替换text/html。
也可以设置标头:
public Result setHeaders() {
return ok("This is some text content")
.as("text/html")
.withHeader("Header-Key", "Some value");
}
7. 总结
在本文中,我们使用Play创建了一个基本的Java Web应用程序。
Post Directory
