技术开发 频道

玩转Java Web应用开发:Play框架

  模板的继承

  Play 框架中可以使用 #{extends} 和 #{doLayout} 来实现模板之间的继承。模板的继承机制对于实现灵活的页面布局很有帮助。一个模板可以定义清楚页面的基本布局结构,其它模板可以继承此模板并添加具体的内容。这样就可以避免在不同模板中重复相同的页面元素。

  在父模板中可以包含任意的内容。在需要由子模板填充的位置,使用 #{doLayout /} 进行声明即可。在子模板中通过 #{extends} 来声明所继承的模板。如 #{extends 'main.html'} 就声明继承自模板 main.html。当子模板被生成之后,将包含父模板中的内容。而子模板中只需要定义扩展的内容即可。

  自定义标签

  Play 框架自身提供的标签只能解决一些常见的需求,很多时候开发人员需要根据需要开发出自己的标签。一个标签的定义非常简单,就是一个模板文件。模板文件被存放在 app/views/tags目录下,文件的名称就是标签的名称。在标签对应的模板里面,开发人员可以添加任意的内容。标签也是支持传入参数的。在标签对应的模板文件中可以用在参数名称前面加上 _ 的方式来引用参数的值。比如一个标签在使用时的方式是 #{myTag name:'Alex' /},那么在该标签的模板文件中,就可以用 ${_name} 来引用参数 name 的值。有些标签是支持在使用的时候添加标签体的,如 #{anotherTag} 测试文字 #{/anotherTag}。对于这种情况,在标签的模板文件中可以用 #{doBody} 来引用标签体中的内容。

  在介绍完 Play 框架的视图层之后,下面介绍 HTTP 路由。

  HTTP 路由

  在前面介绍过,Play 框架中的控制器用来接受 HTTP 请求并返回相应的响应。这个过程的重要一环就是 HTTP 请求的 URI 与控制器之间的映射关系。Play 框架提供了灵活的 HTTP 路由功能来完成这个映射。路由信息被保存在 config/routes 文件中,采用简单的方式进行声明。每条路由记录包含 3 个元素,分别是 HTTP 方法的名称、匹配的 URI 模式以及对应的控制器动作方法。路由记录表示的含义是当使用给定的 HTTP 方法来请求对应模式的 URI 的时候,控制器动作方法就会被调用。

  Play 框架支持的 HTTP 方法有 GET、POST、PUT、DELETE 和 HEAD。使用通配符 *可以匹配任何方法。在 URI 模式的声明中可以使用正则表达式来表示复杂的映射规则。URI 模式中还可以使用 {...} 来声明动态的部分。每个动态部分都是有名称的,可以在控制器动作方法中通过 params 对象来获取。比如,/notes/home 这样的 URI 模式会匹配 /notes/home,但是 /notes/{id} 可以匹配 /notes/123 和 /notes/abc,而且 URI 模式中 /notes/ 后面的部分可以作为参数 id 的值被获取到。URI 模式 /notes/{<[0-9]+>id} 使用了正则表达式,只会匹配 /notes/后面紧跟的全是数字的情况。在声明控制器的动作方法的时候,需要使用带名称空间的全名,如 myapp.Notes.show。有些动作方法是带参数的,可以在声明的时候预先绑定一些参数值,这样可以方便的添加一些 URI 别名。比如动作方法 Notes.show() 有一个参数 id 用来指明要显示的内容的 ID。如果参数 id 的值为 0,则会显示所有内容的一个列表。这样的话,就可以定义一个类似 GET /notes/all Notes.show(id:0) 的路由声明。这样暴露出来的 URI 更加简洁和易于记忆。

  在路由文件中的路由声明是按照从上到下的优先级来进行匹配的。比较具体的 URI 模式应该放在比较通用的模式之前。对于静态文件,可以通过一个特殊的动作方法 staticDir 进行声明。比如 GET /files staticDir:files 就声明了 files 目录中包含的是静态文件。

  在介绍完 HTTP 路由之后,下面介绍 Play 框架独特的无状态的体系结构。

0
相关文章