前言
& i! v# }8 d* _0 y% \' f 目前,Ruby on Rails及Grails等动态脚本语言正发展得如火如荼,而在以Java为首的开源最大阵营中,也出现了各种框架。其中最著名的就是Play框架(http://download.playframework.org)。6 B X' x) b* K
Play 框架是一个完整的 Web 应用开发框架,覆盖了 Web 应用开发的各个方面。它借鉴了流行的 Ruby on Rails 和 Grails 等框架,又有自己独有的优势。具体表现在以下几个方面:其一,通过 Play 框架提供的命令行工具,可以快速创建Java Web 应用。其二,它拥有Java 代码动态编译机制,在修改代码之后,不需要重启服务器就可以直接看到修改之后的结果。其三,它还使用 JPA 规范来完成领域对象的持久化,可以很方便的使用不同的关系数据库作为后台存储。其四,它使用 Groovy 作为视图层模板使用的表达式语言。模板之间的继承机制避免了重复的代码。总的来说,Play 框架非常适合快速创建Web 应用开发。本文将为有一定Java Web框架基础的读者,来重点介绍如何使用play框架来编制一个最简单的信息增删改查应用。
* D0 H8 _8 ?. f6 F" ~( d$ P 一:安装Play框架8 X: O5 F1 c7 ^2 o$ X* X6 \& r. k
安装play框架前,只需要使用JDK 1.5以上的版本即可,将官网上的play框架下载后解压到某个指定目录下,使用的是eclipse开发工具即可。在本文中,将介绍的例子,是一个关于公 司、部门、员工之间的CRUD操作,其关系为:一个公司有很多部门,一个部门有很多个员工。2 p7 h$ o; H( C M: R8 @, _
二:开始使用PLAY框架的脚手架功能
# K- S/ r9 I. [4 X0 u- _ PLAY框架为能让用户快速开始搭建play系统的原型。下面是使用play中脚手架功能的步骤:
7 Y+ r: P w1 ]+ K3 l" S 在命令行方式下,转到play框架的安装目录,本文假设为c:\play下。 , F: F1 a" g. I0 q" X
假设我们的应用的名称为corporations,则在play中,新建立一个应用只需要用如下命令即可: play new corporations,其中new表示新建应用,new后的名称则为应用的名称。 ( P& i. q5 Y/ y4 I2 _2 I O
在输入上面的语句后,会提示输入确认系统的名字,这里输入corporations,按回车确认即可。 $ g- q( j" c$ G% z0 E6 s
我们使用cd corporations目录中,会发现已经有play自带的框架的内容了。我们可以在命令行方式下,执行play run,这时play就会启动自带的jetty服务器,将应用启动起来。
& q) g2 Y2 X( G) M' } 在启动后,可以通过浏览器浏览刚才新建的应用了,方法是http://localhost:9000,就可以看到一个默认的play应用,其中显示的首页中,简单指导了一些简单的配置方法。如下图: 3 Q0 R7 W) O/ [$ G6 i) I5 t
4 z1 L) e8 w: a- H! T, F# F
应用首页
% e. i( g7 ` s 三:配置应用 将框架工程导入eclipse
( I: F3 _( [6 t2 i E! r$ [* L 我们为了要在eclipse中方便我们的编码,所以需要把play刚为我们建立好的框架工程导入到我们的eclipse中去,所以我们按如下步骤去做:/ h6 @' {" h3 n7 a4 p- K1 K
1 使用CTRL-C,先把我们正在运行的应用停止下来。
$ e8 M# R' w4 x! c 2 依然在corporations目录下,输入play eclipse,表示要生成能导入eclipse的框架工程。
/ O1 C! [- H5 L$ r+ x1 ^# N 3 再启动eclipse ,然后使用导入工程的方法,把corporations工程导入。5 u& E* ]: k- Q! i( w5 I
4在这个例子中,用的只是HSQL,所以打开conf/application.conf文件,将下面的
$ M6 f5 Z5 Q; b* z7 C db=mem 语句前的注释符号去掉,表示我们将使用hsql。$ j, E* J V4 i* `" I: Q
5 同样,在conf/application.conf文件中,增加如下这行,表示我们将使用play脚手架框架自带的CRUD功能:
# F6 q3 f8 u. a5 ?module.crud=${play.path} /modules/crud; F: |* ~- ]; B) _* o4 y5 U" P: S
. c: y& g' A( A 6 在conf/routes文件中,增加如下这行:
& J, o/ [ e& I' g. V' w* /admin module:crud
1 T1 r" Y) ]3 _3 C' Y% A! D1 l8 W6 Q: o5 U2 W6 H
注意,在play框架中,routes是路由控制器,这行表示,将所有的CRUD操作都是只有通过 */admin访问的请求,才能实现play自带的CRUD功能。
9 S) R! r3 F% R2 o 7 在进行上述修改后,我们再到命令行方式下,运行play eclipse,然后再到ECLIPSE下按F5刷新一下
( k0 ]2 Y3 M% m# n& e$ @ 8 如果此时再使用play run,运行会发现暂时还没有更新,因为我们要进行数据层的配置。# j! [! U1 ~. `4 i( O/ n H
四:创建员工实体对象和控制层
9 n5 g8 k+ l. D Play框架完全遵守MVC分层架构标准,因此我们按照MVC的分层来设计我们的引用。我们先创建员工实体对象和其控制层。
3 X, D9 N& b9 i# ` 首先,在eclipse的corporations工程中,在app/models目录下,新建Employee类,代码如下:
. ^4 |7 o6 M. q3 j" yPackage models;
& w4 l w4 }- @3 t, f- N- l5 M N" `- @, \
import java.util.Date;
2 @$ W% R& p: T2 d& d
( I5 h% m1 e/ M& W! G2 S- cimport javax.persistence。*;
6 g9 L9 M/ N0 _( U% ^0 C7 p( O4 _ @1 ~) y
import play.db.jpa.Model;
6 |8 ~% p8 b! j$ p) ^9 i, z: K1 S
' I5 T2 D) q6 S( I@Entity
; S: u1 s# e1 l- a b+ }* T/ G [( b' h9 e6 I; c+ I5 q) W/ [
public class Employee extends Model {/ S; X: I( z- j7 J+ y& ~& X' N
- B( s- d7 o g" s% P7 {
public String fullName;
8 q- d! ~0 L; X2 a: s" H3 I
/ W8 }( G8 c( t9 _ F( R( C9 Xpublic Integer salary;6 Z9 p. V; `1 X" g9 l' z( q
C6 C2 T! A2 A" S; C1 I( U
public Date dateOfHire;& l O0 S4 F( C" k
. b( ]0 z7 r, [}( r b% K( I) T- k' \
5 i) R! J/ {5 h z
* r" b w8 o/ u6 g3 M4 p3 h 在Play框架中,默认使用的是jpa注解标准,使用@Entity注解,说明该类是属于实体类,这里都是继承了play自己的模型层基类Model,这里由于是示例,只是列出了三个对象的属性。 V9 v, |( u3 x6 ^# i3 q
接下来,在app/controllers中,创建员工类的控制层文件,代码如下
! |. t6 v5 P* f! I4 \7 ]9 {/ v4 {package controllers;
( i* G* b1 q' x
" J3 m& ^! I: [- |- ~public class Employees extends CRUD2 W4 w- K; J9 J6 ]! b6 w
, M/ O3 C( q, |% T% m# T* `{ // an empty class
6 s7 S' J J' F/ ]" P1 N+ ~3 u0 k9 P/ y$ @
}( U: M6 V( D7 ^9 W
2 T7 P( [! u, ?' M, v) Y
: A/ I+ w$ k+ m3 _4 Y+ |0 \ 这里看到,控制层文件的命名是Employees,使用的是PLAY框架优先约定的命名规则:实体类的复数形式。并且这里继承了Play中自带的CRUD基类的功能,这样,就可以在我们的应用中轻易使用到PLAY自带的CRUD功能了。7 D, j! I$ G) L
现在我们马上来运行下应用,依然输入play run,再在浏览器中输入:
9 l, e5 s* k/ x http://localhost:9000/admin即可看到如下的效果:
* @+ ?5 A% S" \- B' h9 d( h
* l( Q) o; S7 U5 W: C8 {1 B* n运行效果' C& s- X6 F, v t: X i7 |
这个时候,点Add按钮,就可以增加员工了。" D7 V @ I( v- ^
五:创建部门实体类和部门控制层1 m" }6 d* {! ^. {
接下来,我们继续创建部门实体类和部门控制层的文件。同样,在app/models目录下,新建立Department类,如下:; ^' O' ?2 {0 H) d8 V
package models;
4 O' g8 o B2 O a% z# G7 t, d, G* k! @+ I% @
import javax.persistence。*;1 ~+ w! I3 M# X
2 j; K, V* @5 z- J( Rimport play.db.jpa.Model;
& K) F; v$ t: x. n4 C* u; F/ E" {9 N9 J8 d& ^9 K
@Entity. A: |* F2 v, l: t
3 R2 i- T6 q1 U7 m5 Z& ~+ A
public class Department extends Model {
3 W/ b( m }/ Y) V+ b T ~5 V2 n6 D) o4 j2 A
public String name;; `* Y' V5 X* L! \8 `$ R2 B( Z
$ b+ A2 M, u2 k' }4 E+ S2 H$ W8 Qpublic String description;
, t" S+ Y9 l- R n7 V1 l H x
6 [. F2 P- r( [* a/ _* Q}
0 y' w2 u! x) H7 s" L' w4 _: T6 L; H: ], G* {
6 T2 U6 E# N, x2 x! x& a 同样在app/controllers目录下,创建控制层文件Departments,代码如下:
; z( L& w$ B- K1 W4 u3 Cpackage controllers;' C, D8 O4 T; F
3 F# p! }. o' t" L
public class Departments extends CRUD {
3 X6 o( U" X$ r7 M' P
3 F" r3 b a. C}8 Z' E0 \1 r0 ^
- ~2 e, i" C: @/ }( ~
$ n0 p; \ @2 R6 |9 G* n 这个时候,再次运行play run,会发现使用http://localhost:9000/admin时,看到的界面将会比之前的多了能够增加部门实体类,大家可以尝试下。
' c H/ t# k' ]6 k* d: d 六:建立部门跟员工之间的连接关系
8 X* X* h# k A! }$ v0 P 现在我们在建立了部门类和员工类后,可以开始建立它们之间的关联关系了。由于一个部门中是有多个员工,所以在员工类employee中,写入如下代码,建立两个类之间的关联:5 u+ C5 R/ K, \2 Z
@ManyToOne% M, u4 f# B. v5 E
7 c. k1 K7 Y- w9 ~ N, Apublic Department department;. e4 j9 g2 A' O4 t: S
' J v$ W6 b0 F" }' a9 `, R$ k, {
这里依然使用了@ManyToOne的JPA注解去实现多对一的关系。在再次运行程序后,会发现,在增加员工时,会出现下拉菜单选择框,让其选择该员工属于哪一个部门。 |