设计应用的一个方面是规划HTTP请求的URL规范,超链接,HTTP表单以及可能的公用API接口。在Play这是通过路由配置,然后在控制器中实现相应的接口。
Play应用中的路由配置可以Controller类构成了MVC框架中的控制层,如下图所示:
在Play应用中Controller为定义了HTTP接口的Scala类,而你的路由配置决定了给定的HTTP请求调用哪个Controller中定义的方法,这些Controller中的方法称为Action(动作),因此Play 的MVC框架也称为基于“动作”的MVC模型,一个Controller定义了一组相关的Action方法。
除了处理HTTP请求之外,动作方法也负责生成HTTP响应。大部分情况,你通过合成HTMLView模板来生成HTTP响应,但一个HTTP响应也可能是一个HTTP错误或者返回其它格式的数据,比如文本,XML或是JSON格式的数据,或者是二进制类型比如图像。
以URL为中心的设计方法
设计Web应用的一个好的开端是定义HTTP接口–它的URL定义。它的其它两种设计方法–以数据为中心或者以UI为中心的设计另外一种变通方式,以URL为中心的设计不代表它比其它两种方式要好,它可能对一些开发人员可能感觉更有效。有时最好的一种方法是同时使用三种设计方式的一种折中方法。
以URL为中心的设计方法意味着区分应中的资源,然后定义这些资源上可能的操作,然后定义一系列的URL以支持访问和操作这些资源。一旦定义好HTTP接口,然后就可以开发基于这些HTTP接口的用户界面部分,并添加数据模型。下图显示了这个设计过程:
这种设计方式通常是定义符合REST规范的HTTP接口,有时间我们将详细介绍这方面的知识。
配置HTTP请求到Controller类中Action方法的路由
在Play中路由的配置非常灵活,比如:我们可能定义和产品分类相关的URL可能有:
4 | GET /products?filter = zinc |
5 | GET /product/ 5010255079763 |
6 | GET /product/ 5010255079763 /edit |
7 | PUT /product/ 5010255079763 |
为了实现这个方案,你在conf/routes中定义这些路由方案:
1 | GET / controllers.Application.home() |
2 | GET /products controllers.Products.list(page : Int ? = 1 ) |
3 | GET /product/ : ean controllers.Products.details(ean : Long) |
4 | GET /product/ : ean/edit controllers.Products.edit(ean : Long) |
5 | PUT /product/$ean<\d{ 13 }> controllers.Products.update(ean : Long) |
路由的语法结构定义如下:
后面将详细介绍路径配置文件的语法,这里可以看到定义从HTTP请求到Controller类中方法是多么的直接,并且支持HTTP请求参数到Controller中action方法参数类型的定义,这种方法称为数据绑定。
将HTTP数据绑定到Scala对象
实现HTTP请求到Controller中Action方法的映射只是路由工作的一半任务,Action方法通常带有参数,因此你需要能够把HTTP请求中的数据映射到Action的参数,下图显示了前面例子中请求产品详细信息的请求如果映射到Action方法的过程:
生成不同类型的HTTP响应
Controller不仅处理HTTP请求,同时也生成HTTP响应,大部分情况为返回HTML页面,但也支持其它类型的HTTP响应,比如文本,XML,JSON或是图像等。Play使用Scala对象来处理HTTP数据,也提供了多种Scala类型来处理不同类型的HTTP响应,你可以在Controller的方法中使用这些Scala类型来生成不同类型的HTTP响应。后面我们分别介绍这些类型来支持文本,HTML,JSON或是图像。