Play 框架是一个完整的 Web 应用开发框架,覆盖了 Web 应用开发的各个方面。Play 框架在设计的时候借鉴了流行的 Ruby on Rails 和 Grails 等框架,又有自己独有的优势。使用 Play 框架可以方便和高效的开发出 Java Web 应用。通过 Play 框架提供的命令行工具,可以快速的创建出一个 Web 应用的基本骨架。它的 Java 代码动态编译机制,使得修改代码之后,不需要重启服务器就可以直接看到修改之后的结果,调试起来非常方便。它使用 JPA 规范来完成领域对象的持久化,可以很方便的使用不同的关系数据库作为后台存储。使用 Play 框架可以很容易的构建使用 REST 架构风格的应用。它使用 Groovy 作为视图层模板使用的表达式语言。模板之间的继承机制也可以避免代码的重复。总的来说,Play 框架非常适合快速 Web 应用开发。
Play 框架采用经典的 MVC 架构,把 Web 应用分成模型层、控制层和视图层三个层次。每个层次对应的文件被存放在不同的目录下面,方便组织和管理。使用 Play 框架的 Web 应用具有相同的目录结构,如 图 1 所示。
如 图 1 所示,应用自身的文件被放在 app
目录下面,三个子目录分别存放的是 MVC 模式的三个层次的内容。其中 models
和 controllers
目录下面是 Java 源文件,而 views
目录下面则是视图层使用的模板文件。conf
目录下面存放的是应用的配置文件、HTTP 路由文件和国际化所需的消息文件。public
目录则是存放 Web 应用的静态文件,包括 JavaScript、CSS 和图像文件等。lib
目录存放所需的额外的 Java 库。test
目录存放的是测试结果。
本文中使用的 Play 框架的版本是 1.0.3.1,使用的集成开发环境是 Eclipse 3.6, 使用 Dojo 作为 JavaScript 框架。在 Play 框架官方网站(见 参考资料 )下载 Play 框架的压缩包之后,解压到某个目录,并把该目录下面的 bin
目录添加到环境变量中。接着启动一个命令窗口,运行 play new developers_notebook
就可以创建出一个新的名为 developers_notebook
的 Web 项目。在项目目录的父目录下面,运行 play eclipsify developers_notebook
就可以创建出来 Eclipse 工程。通过 Eclipse 导入此工程就可以在 Eclipse 里面进行开发了。Play 框架的 support
目录下的 eclipse
目录下有个名为 org.playframework.playclipse
的 Eclipse 插件,将此插件复制到 Eclipse 的 plugins
目录就可以安装。运行 play run
就可以运行此 Web 应用,访问 http://localhost:9000
就可以看到。每次在 Eclipse 里面修改了代码之后,不需要重新启动应用,只需要刷新页面就能看到更新之后的结果。这是 Play 框架的一个非常方便的特性。
本文中的示例应用称为“开发人员记事本”。开发人员可以用它来记录开发过程中的一些注意事项。下面首先介绍 Play 框架中的模型层。
模型层包含的是 Web 应用中的领域对象。Play 框架推荐的实践是模型层的对象不应该是仅包含 getter/setter 方法的简单 Java Beans,而应该有自己的业务逻辑。Play 框架中应用的模型层类可以是任何的 Java 类。与一般的 Java Beans 不同的是,模型层类使用声明为 public
的域作为对象的属性。Play 框架会自动生成相应的 getter/setter 方法。这样可以使得代码更加简洁。开发人员也可以提供自己的 getter/setter 方法实现。
领域对象的实例一般需要持久化下来。最常见的持久化方式就是使用关系数据库。Play 框架使用 JPA 规范来进行领域对象的持久化。具体的后台实现使用的是 Hibernate。开发人员只需要使用 JPA 规范定义的标注,就可以声明领域的持久化行为。比较好的做法是将领域对象类继承自 Play 框架提供的 play.db.jpa.Model
类。play.db.jpa.Model
类提供了一个域 id
作为对象的标识符,也是对应的数据库表中的主键。play.db.jpa.JPASupport
类是 play.db.jpa.Model
的父类,提供了一些实用方法用来完成从领域对象到数据库之间的映射。表 1 中列出了一些重要的方法,包括常用的增删改查操作。
表 1. play.db.jpa.JPASupport API 说明
方法 | 说明 |
---|---|
create(type, name, params) |
用来创建领域对象类的一个实例。参数 type 表示的是领域对象类,类型是 java.lang.Class ;name 表示的是领域对象类的名称;params 表示的是一个包含了实例中属性值的类型为 java.util.Map<java.lang.String,java.lang.String[]> 的哈希表。 |
edit(obj, name, params) |
用来编辑领域对象类的一个实例。参数 obj 表示的是领域对象实例;参数 name 和 params 的含义与
|