a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 146|回复: 1

[基础知识] JAVA开源开发框架:PLAY框架快速入门

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
前言
& 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注解去实现多对一的关系。在再次运行程序后,会发现,在增加员工时,会出现下拉菜单选择框,让其选择该员工属于哪一个部门。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA开源开发框架:PLAY框架快速入门

 七:建立公司实体类和控制类   最后,我们建立公司实体类和控制类。同样,在app/models目录下,建立Company类如下:( E) c8 s6 l2 `2 `/ c" k) i
package models;
6 i. s: P' r; k- P  W- d0 X% X. J. z$ j3 o
import javax.persistence.Entity;/ w# j) w/ u9 i' y+ j. C2 R3 q6 p
, v  h- q/ t$ T& _/ h
import play.db.jpa.Model;
6 S2 Z& x( X0 I6 N! f2 X1 \# u: R" n4 D  p
@Entity' p7 E1 _3 p7 K8 n/ S2 o0 q

3 F7 z. U4 @$ K7 S# K- K1 N$ j4 X5 |3 |public class Company extends Model {& U. A4 @  k% g% }

, F+ r7 d# w" T/ Tpublic String name;
& `7 a& S+ s, b9 h" M3 Z+ Z- r) Q) q0 C
public String address;
7 ^0 M  j+ r- I! C  Q4 M
  C. n2 n) E4 j6 \+ Jpublic boolean isPublic;
/ Z2 K- {! v1 x4 ^6 p: j7 d5 ?( U9 k2 z: h0 j, X" M
}5 L' _5 S, N$ O2 m4 }& i4 v0 O
" ~  d* y8 n1 D" U

+ g% C- T' n  a) C, z  T+ H  company的控制层类代码如下:
1 k/ D1 b  i( d4 n. ~0 A7 M( W0 ypackage controllers;, \3 k! J) F% U% o, u- l9 h

: B9 ?0 B+ l' T5 u9 @/ z( Simport models.Company;; m; s7 R  f' G$ Y

2 P+ R  W8 q% F/ R* \- o@CRUD.For(Company.class)
9 ?2 C; |1 C, k& w/ t
/ A; B6 p+ y3 _+ i. Kpublic class Companies extends CRUD
  r' [. ?2 W  c' v2 l5 p9 r0 f7 n
; _9 k0 P2 {# N" D# L  j* d{
; r1 j( ]+ B7 f  M; n4 f1 q
2 z8 Q+ J2 P' q; V" D& k}5 l/ _; x* X, _+ u' z7 z

/ U. `" L. J) F3 H" c( G$ F+ |7 ^2 ?% P0 X
  这里要提醒一点的是,由于company的复数是companies,而play框架原先约定俗成的是在实体类名后直接加字母s,所以这里使用了注解 @CRUD.For(Company.class),以表明该控制类文件Companies是为company实体类服务的。
& B( T* _/ J' A9 h& H8 c  D& ^0 l# c3 k  同样,一个公司里有许多部门,因此在Deparment部门类中,建立如下的多对一关系:
. T1 R1 i% u  f- M7 E@ManyToOne9 {% W' D* N* A! H3 G+ Z( M
/ o  P9 ]9 y6 q- d
public Company company;
5 m) z  u3 C3 P) J6 o3 p$ _+ y; G7 R, m4 E8 {/ Z6 K5 r4 R

1 D, M) W0 ~: z" d: Y' c  再次运行程序,可以看到,现在三个实体类都建立起来了,可以分别对公司,部门和员工进行CRUD操作,如下图:
2 A, C; m% k! M( }
1 p, d8 g- I. U& x, ?编辑视图
$ o1 e# r3 q2 W" A+ E2 d- b; T( R4 ]  八:优化列表+ H0 p: R- R8 v/ t' h; f
  我们在查看每个实体类的列表时,发现在列表中,会把每条记录的id都显示出来,这个在程序中假设不需要看到id字段的话,可以通过修改代码实现,比如在Company类中,增加toString方法即可:! p- e9 T5 P  X! V
public String toString() {
* p" ^) ^; K4 y7 R! d% j, m- r/ W6 [, n% r
return name;2 p* P. u& S  w: D

7 p  A. Y  R; q/ e6 s8 d8 C}7 Z5 d: A5 T- r9 i9 j* I' t

: t* E8 E5 r! [2 q' @+ @3 I- J% A, p7 F2 g& D8 }
  而在Department和Employee类中,可以采用同样的方法,以不显示它们的id字段。# H; K& @5 q, C. D1 g8 P
  九:增加校验规则8 |) M; ]' P7 b0 e4 }/ f3 A8 ~( |% l
  在输入数据时,校验规则是必不可少的,在play框架中,可以很方便地使用注解来增加校验规则,比如在员工类中,可以要求输入的fullName字段内容不能超过100个字符,而且fullName字段不能为空,则在Employee类中,增加如下代码即可:
6 ~: G) h3 d9 l. W1 }@Required @MaxSize(100) public String fullName;: p3 _$ h0 @6 d" R, t" i) f/ n

! s' H# a" }2 h# l  下面列出一些常见的校验规则:
8 B$ O# M# i, Z/ A2 r+ x5 x  @Email 校验email合法性   @InFuture 检验是否将来的日期   @InPast 检验是否是过往的日期   @Match 对正则表达式的判断   @Max 最大值   @Min 最小值   @Range 检验范围   @URL 检验是否URL ! o/ @) p2 S8 m2 U  R! y8 [. Q0 j3 [$ G
  十:改变列表的显示格式# D9 {6 t4 i3 _( D! q5 N4 e4 {
  在默认情况下,比如查看employee列表,只能看到employee的名称字段,假设要在列表中看到每条记录的每个字段的话,要修改下play的模版,方法如下:
1 C5 Y5 e& c6 c, c  1 停止现在的服务,CTRL-C停止。
2 j8 Q* t5 x$ t; S; O4 p+ K  2 在命令行下,输入:% H/ Q" b% i$ |
play crud:ov --template Employees/list8 W. f6 s7 N) a+ {1 O

$ D0 F& d# E1 q  P+ A/ i1 H/ E2 M) C  这将在app/views/Employees目录下新建立一个list.html的页面。
5 E+ b& R6 W: a8 H  3 重新输入play run,并切换到eclipse中的项目中,按F5更新页面。' d, Z0 o1 D) L2 k
  4 在eclipse中,打开app/views/Employees/list.html,这个是雇员列表的模版文件。$ z5 T7 y/ W# R4 Z) t) W: Q
  5 在该页中,找到id=”crudListTable”部分,修改为:! F+ F- h/ L" N3 r
#{crud.table fields:['fullName', 'dateOfHire', 'salary'] /}7 s4 }  [! z3 g" U( h3 e( D
8 n" E+ K) W5 W$ e0 Z
  即显示完整所有字段。
- @2 I8 T0 j, L  6 重新运行程序,即可看到效果,如下图,可以看到,能看到所有字段值。  ^' y! \" K( j
: Y! _3 |8 N- [+ o" I
  十一:改变列表中标题的显示
/ F6 R" ^! T) H( _  在默认状态下,列表中显示的字段标题是用实体类中的名称的,假如想把fullName修改位Full Name的话,可以在conf/messages下,增加:
# V( V- J. |) P7 X' n6 p  fullName=Full Name
; T+ F, @, |7 ]) M' A7 ]  即可,如下图显示:
" f) O. F: ]& _( {3 h# y1 m( c5 y# `0 W% Q- q3 b" g9 W/ O
  小结
; W% \8 e: A7 {1 S5 c& y/ R  在本文中,我们学习了如何使用Play框架的脚手架功能,快速搭建CRUD的应用原型。Play框架的配置方法简化了工作代码量。目前Play框架正在 不断的完善中,读者可以根据本教程的指引实际操作后,进一步阅读官方文档加以深入学习。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-6 01:19 , Processed in 0.145827 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表