a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 149|回复: 1

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

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
前言$ C( A& Q; E) O  }# \% C% \
  目前,Ruby on Rails及Grails等动态脚本语言正发展得如火如荼,而在以Java为首的开源最大阵营中,也出现了各种框架。其中最著名的就是Play框架(http://download.playframework.org)。* |' N0 V3 y/ E6 @: X3 _
  Play 框架是一个完整的 Web 应用开发框架,覆盖了 Web 应用开发的各个方面。它借鉴了流行的 Ruby on Rails 和 Grails 等框架,又有自己独有的优势。具体表现在以下几个方面:其一,通过 Play 框架提供的命令行工具,可以快速创建Java Web 应用。其二,它拥有Java 代码动态编译机制,在修改代码之后,不需要重启服务器就可以直接看到修改之后的结果。其三,它还使用 JPA 规范来完成领域对象的持久化,可以很方便的使用不同的关系数据库作为后台存储。其四,它使用 Groovy 作为视图层模板使用的表达式语言。模板之间的继承机制避免了重复的代码。总的来说,Play 框架非常适合快速创建Web 应用开发。本文将为有一定Java Web框架基础的读者,来重点介绍如何使用play框架来编制一个最简单的信息增删改查应用。- C' j; \- |4 f' H' u' |
  一:安装Play框架
# a; i' }  g; [; Z) V4 y7 M) z  安装play框架前,只需要使用JDK 1.5以上的版本即可,将官网上的play框架下载后解压到某个指定目录下,使用的是eclipse开发工具即可。在本文中,将介绍的例子,是一个关于公 司、部门、员工之间的CRUD操作,其关系为:一个公司有很多部门,一个部门有很多个员工。
2 ~2 @9 i7 }( M% M6 o  二:开始使用PLAY框架的脚手架功能$ z. V& t$ M4 ]# w1 C4 G9 k/ ?
  PLAY框架为能让用户快速开始搭建play系统的原型。下面是使用play中脚手架功能的步骤:
9 b- D5 e* Z- r  在命令行方式下,转到play框架的安装目录,本文假设为c:\play下。
! A( c3 {0 e- n6 ^  假设我们的应用的名称为corporations,则在play中,新建立一个应用只需要用如下命令即可:  play new corporations,其中new表示新建应用,new后的名称则为应用的名称。 9 x: O8 V! W5 t- }; M. S- d" E
  在输入上面的语句后,会提示输入确认系统的名字,这里输入corporations,按回车确认即可。 6 R/ \8 Q, d9 K) a. l0 s" q
  我们使用cd corporations目录中,会发现已经有play自带的框架的内容了。我们可以在命令行方式下,执行play run,这时play就会启动自带的jetty服务器,将应用启动起来。
# q3 s1 J: C- a) @- W0 [& I6 _: D   在启动后,可以通过浏览器浏览刚才新建的应用了,方法是http://localhost:9000,就可以看到一个默认的play应用,其中显示的首页中,简单指导了一些简单的配置方法。如下图: " O% T* Z9 V6 p- [
' D. i0 Z4 G# |+ i4 I) j4 y
应用首页
# v' X6 F4 Z3 d0 F7 _  三:配置应用 将框架工程导入eclipse: ~4 c0 U! {/ L* o
  我们为了要在eclipse中方便我们的编码,所以需要把play刚为我们建立好的框架工程导入到我们的eclipse中去,所以我们按如下步骤去做:
+ E7 R/ k) [1 k6 c1 m4 A" ^- E$ m8 z  1 使用CTRL-C,先把我们正在运行的应用停止下来。
  ^% t; U! v" p; ~  2 依然在corporations目录下,输入play eclipse,表示要生成能导入eclipse的框架工程。) ]8 {" u; R, L0 U' z/ t9 j( }7 ?
  3 再启动eclipse ,然后使用导入工程的方法,把corporations工程导入。
4 ]$ _1 `8 W) O0 p: h. f& q  4在这个例子中,用的只是HSQL,所以打开conf/application.conf文件,将下面的# H% Y, Q. m: c* V) O# D- E
  db=mem 语句前的注释符号去掉,表示我们将使用hsql。
: ^0 p* C4 A) X1 h' m  5 同样,在conf/application.conf文件中,增加如下这行,表示我们将使用play脚手架框架自带的CRUD功能:
( h- [" ~  ^+ O- x! @module.crud=${play.path} /modules/crud
! z2 Q; y8 ^4 i5 Y5 U. U$ b' f& f" q* d. Q, _) ]
  6 在conf/routes文件中,增加如下这行:
: O1 C7 A3 B1 Z/ u, y* /admin module:crud
  X. Q! n2 ]3 L: p: l
3 B0 d& d. `. p# V4 g% L- k  注意,在play框架中,routes是路由控制器,这行表示,将所有的CRUD操作都是只有通过 */admin访问的请求,才能实现play自带的CRUD功能。
3 n$ _9 j4 ]# _3 t1 k  z1 V( L& D  7 在进行上述修改后,我们再到命令行方式下,运行play eclipse,然后再到ECLIPSE下按F5刷新一下
: L! A% v; Q2 ^; n7 X% S4 `  8 如果此时再使用play run,运行会发现暂时还没有更新,因为我们要进行数据层的配置。
8 P: A4 O6 h7 f5 H3 ^& Y2 X( K  四:创建员工实体对象和控制层) O5 R+ Y# `3 B4 n6 I* S
  Play框架完全遵守MVC分层架构标准,因此我们按照MVC的分层来设计我们的引用。我们先创建员工实体对象和其控制层。
9 ?- ~% [0 ]( J3 v+ ^  首先,在eclipse的corporations工程中,在app/models目录下,新建Employee类,代码如下:- v( [; N+ O4 ^  `4 I8 W
Package models;1 O" {- m; P0 z4 [
0 _/ o8 q8 i/ W* S7 D) I( o
import java.util.Date;# a, D& H9 D. }

$ _5 y( b  q* B6 @/ Simport javax.persistence。*;4 n. W6 v! o9 X8 b) i, Z" a( G

  M1 e. }5 i6 vimport play.db.jpa.Model;8 F7 c2 b% V1 y. o! b

9 i: ~) ]- w4 `, C$ P@Entity3 G1 P+ d8 `6 s  l3 r- g$ L
  ?, Z# y3 N9 n
public class Employee extends Model {
8 A; }: y: r5 V# u/ m# c5 J: q3 y, y* [$ e: a* s! s' I# C
public String fullName;( v3 x7 d# e3 M+ T

# L( S9 U8 x1 y/ H2 Zpublic Integer salary;
: v5 l( K7 c/ p- m7 o) P3 d* ?' C  B0 D3 i: j+ \) i* Y
public Date dateOfHire;
* n6 E, E: p" ]
, B2 x' |! U/ W# g: B}
  W4 m! X3 z* J2 w7 k+ z# n* s: t; ^7 i5 |

9 O2 {0 f( x" |% J* X  在Play框架中,默认使用的是jpa注解标准,使用@Entity注解,说明该类是属于实体类,这里都是继承了play自己的模型层基类Model,这里由于是示例,只是列出了三个对象的属性。- L1 D6 J3 V3 l1 g5 d
  接下来,在app/controllers中,创建员工类的控制层文件,代码如下% J3 V( p2 ?# c: k2 J) f! U
package controllers;
7 L7 n1 R7 C6 Y$ t
' S9 z& ?( L  v; o/ S% {- t$ d" Dpublic class Employees extends CRUD2 m; s& ~! ^6 v* f! G6 `; _8 j8 n& i

, Z0 ]1 h. ~! ~# I{ // an empty class
6 N2 A+ B$ H: J( A" c1 s4 j" ~! u9 S7 t$ m. N5 R- w5 e, a2 T) {) {
}& W$ I' H" Y9 d- k
3 v& `( p$ K2 [0 H7 l8 x% U

' v8 ^4 ]3 e* r& y3 o  这里看到,控制层文件的命名是Employees,使用的是PLAY框架优先约定的命名规则:实体类的复数形式。并且这里继承了Play中自带的CRUD基类的功能,这样,就可以在我们的应用中轻易使用到PLAY自带的CRUD功能了。, ^/ |5 y% R4 Q1 Q6 t6 E+ U
  现在我们马上来运行下应用,依然输入play run,再在浏览器中输入:
% L$ w2 K  T1 N  http://localhost:9000/admin即可看到如下的效果:
- ?. _$ @" J/ Y# m8 w; C$ M5 f' g5 _8 q: [" Z2 @
运行效果) o% M8 r' E$ W! b
  这个时候,点Add按钮,就可以增加员工了。8 |1 Y) Z1 T$ t" q( w! r
  五:创建部门实体类和部门控制层
+ U4 f/ s) c# k0 T  接下来,我们继续创建部门实体类和部门控制层的文件。同样,在app/models目录下,新建立Department类,如下:/ X1 o- D# ^: U* g' v5 ^; H
package models;  v' k$ U. w0 ?4 l* u0 Y7 t
" D! ^0 Z5 n) U4 T3 [& ~0 k8 J& P
import javax.persistence。*;
* K6 ^6 K# {$ p/ \9 B2 D. A5 S$ ]
import play.db.jpa.Model;7 R9 c& q+ t) N7 Q  L) t' e, E
5 D7 ]) p6 H6 v% ]& E0 e' y, u
@Entity% e+ E3 o; ~1 v( g

6 u+ j3 o' |/ Hpublic class Department extends Model {
" f( Y2 H  f4 E( l8 a
! {' |" F) L- W" ~" _1 A  ppublic String name;7 X4 j+ P- X6 L+ u3 S5 B

4 s- @% ]$ E! Q" T) i& z* S% W& ~public String description;! E& y9 s4 Z3 H( k. X! ^
# h2 j6 ^% `) }- G( U" P
}$ N9 W9 r' `3 `
; P3 K6 s4 K4 `4 F

1 @) ]6 N' H* s1 s8 |  同样在app/controllers目录下,创建控制层文件Departments,代码如下:7 a9 j1 k* h) z5 \3 k9 V! z
package controllers;
2 y4 N0 P  b. A% ~3 U: y
( A" T3 [' N% S5 P) [1 k/ u  Ypublic class Departments extends CRUD {; Q0 t1 V5 A9 t5 o8 t
( q- t. g) I- B
}, b& ^2 `  z  I7 q) k' F

; }: F9 L8 x# Q: l8 q6 z0 c& p5 E# ^3 V1 Q
  这个时候,再次运行play run,会发现使用http://localhost:9000/admin时,看到的界面将会比之前的多了能够增加部门实体类,大家可以尝试下。
; z' j. a5 F9 r% n  六:建立部门跟员工之间的连接关系
9 s4 t- _3 v9 `" c7 h5 _% l  现在我们在建立了部门类和员工类后,可以开始建立它们之间的关联关系了。由于一个部门中是有多个员工,所以在员工类employee中,写入如下代码,建立两个类之间的关联:4 r; ^6 [# ^& D" s+ V
@ManyToOne
9 S- B2 x; U; c& b# q' G2 ~- E, A. w2 |- |9 u- Z
public Department department;
/ z! s# B- j& J- {1 O$ e9 d+ b1 _7 G; j
, m3 H: l" n9 I9 b1 n
  这里依然使用了@ManyToOne的JPA注解去实现多对一的关系。在再次运行程序后,会发现,在增加员工时,会出现下拉菜单选择框,让其选择该员工属于哪一个部门。
回复

使用道具 举报

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

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

 七:建立公司实体类和控制类   最后,我们建立公司实体类和控制类。同样,在app/models目录下,建立Company类如下:$ S; V4 A6 m  }  ]/ }5 L4 |- e; P
package models;* c( H7 ^1 ]1 [: a- t

% p& A  Z6 V9 q1 N/ \2 a7 S" Aimport javax.persistence.Entity;
" B4 v/ Q' Q' z' a
4 i% {( Z, H# |3 W- D; @9 z# Yimport play.db.jpa.Model;; J# q, x" P1 |0 Y6 ~5 l+ f
7 q! e- V' l% Q) q/ z
@Entity, J: t) ]3 R' v% h: c4 g; d3 [8 W
. k5 V* |4 U; q7 v. T: G
public class Company extends Model {1 f- X& w. d" E- y. y. y
+ Q6 K) V6 b" b# f, i& a
public String name;' L& f5 s5 g$ e/ s' h
2 R4 Y% T6 S5 m. H5 v* X
public String address;+ P" Z" a' o: m" Q: q" S
* G0 J; U& X( s4 V2 P+ z' J' q
public boolean isPublic;
) o& Q% K4 V+ T% i& i6 }3 p# C+ C4 R1 P; w) D# v% A: D
}
2 \/ F1 S1 |8 p# W6 ^; k
5 r5 T- z! w, x, X" f5 t: s+ o' I( n1 R7 [) p% P& Q" g2 v
  company的控制层类代码如下:
7 O' q% S' k8 F" \* C8 v1 y3 bpackage controllers;
$ [' m5 i, y& {( d7 h) D! k! E4 @  ~) i7 z+ c' p3 g/ O
import models.Company;6 ]: I  W9 B* u0 H4 @+ j
( a$ u0 f1 d+ F# _0 J
@CRUD.For(Company.class)
6 M" Q$ X8 W6 d/ M7 b, p2 s8 E7 F5 L6 V
public class Companies extends CRUD# ?; `  W: U4 D, I  H/ v+ [

: m' v* V5 C3 y{+ z1 |* o; P/ r, P5 X& U! ]" e9 d& T

! S( _3 E2 ~- Z1 a9 |! F}+ T9 u3 H. }) m$ ?/ b1 P* v/ ]

$ V; j- M* S+ M/ Z2 j' U
, ^, d$ Y/ Y! O8 ]0 Z+ X. A  这里要提醒一点的是,由于company的复数是companies,而play框架原先约定俗成的是在实体类名后直接加字母s,所以这里使用了注解 @CRUD.For(Company.class),以表明该控制类文件Companies是为company实体类服务的。
# Z0 }1 A) x3 {5 j  同样,一个公司里有许多部门,因此在Deparment部门类中,建立如下的多对一关系:! i. a9 O. C: ], `6 K* @% O
@ManyToOne9 K; |2 D) Q. _8 x4 Z, o

8 j, t% c/ Y! F% A  bpublic Company company;
- ~- {! [6 J5 v- ]/ e9 O# E+ M0 B

* D: y: v& {2 u. R0 [! N- q4 z  再次运行程序,可以看到,现在三个实体类都建立起来了,可以分别对公司,部门和员工进行CRUD操作,如下图:
* B- ^; @8 Q- `8 X# ?: s$ U! i4 G2 t' h
编辑视图( R7 m  y* J, L0 g
  八:优化列表5 ~) P( ~6 N9 j1 B2 h
  我们在查看每个实体类的列表时,发现在列表中,会把每条记录的id都显示出来,这个在程序中假设不需要看到id字段的话,可以通过修改代码实现,比如在Company类中,增加toString方法即可:
4 r* H' E$ `) S. }8 \3 d6 }public String toString() {
/ Z9 Q8 N& H; e- X4 ~9 i2 P
, k! T# ~& q( x8 C0 }return name;
! z! y' i" [' F# W# Y5 W3 j7 C5 ]2 }
}
2 @: y- _. g  A
1 Z% l% r1 V! L& O  p5 a
+ ?4 \  S$ \' R& k8 t  U  而在Department和Employee类中,可以采用同样的方法,以不显示它们的id字段。
; P2 q; Q5 i6 _- b  九:增加校验规则
2 [, }4 ^% z  d4 c  在输入数据时,校验规则是必不可少的,在play框架中,可以很方便地使用注解来增加校验规则,比如在员工类中,可以要求输入的fullName字段内容不能超过100个字符,而且fullName字段不能为空,则在Employee类中,增加如下代码即可:
" ~. |# ^; \9 X* n8 N" A" p# x@Required @MaxSize(100) public String fullName;1 p, \; [0 v3 o1 |1 |; f

8 q! I( A7 {5 u: v  L$ ?: X  下面列出一些常见的校验规则:
3 a  D; S2 S, k" c/ y1 C1 G7 d  @Email 校验email合法性   @InFuture 检验是否将来的日期   @InPast 检验是否是过往的日期   @Match 对正则表达式的判断   @Max 最大值   @Min 最小值   @Range 检验范围   @URL 检验是否URL
* \  b/ R9 d# b$ T; i# m  十:改变列表的显示格式( e) V; X2 ?1 U' G- B
  在默认情况下,比如查看employee列表,只能看到employee的名称字段,假设要在列表中看到每条记录的每个字段的话,要修改下play的模版,方法如下:
% r2 }' L6 ~# X, u/ n; m9 K! [  1 停止现在的服务,CTRL-C停止。
0 l% J7 E! m" e+ m; o' i6 v5 R  2 在命令行下,输入:
! t& t1 U! o5 q* Q0 g' Hplay crud:ov --template Employees/list
8 z. }8 s/ C( i% Y
/ ]& h" m* A4 q: M/ L  这将在app/views/Employees目录下新建立一个list.html的页面。
% H4 i, z( z  i' p  @# \  3 重新输入play run,并切换到eclipse中的项目中,按F5更新页面。5 ]& ^' T6 m1 d$ y9 o
  4 在eclipse中,打开app/views/Employees/list.html,这个是雇员列表的模版文件。
( R; i: U( C3 n# W  5 在该页中,找到id=”crudListTable”部分,修改为:3 b7 w/ L) z- K. A9 }8 V- G
#{crud.table fields:['fullName', 'dateOfHire', 'salary'] /}
9 P. G- O6 G9 q7 I* r8 \9 @* x! S4 m( s3 b4 |
  即显示完整所有字段。: c  Q/ H+ c; o8 I9 a/ \
  6 重新运行程序,即可看到效果,如下图,可以看到,能看到所有字段值。9 U' o9 m3 A) X: o; r6 q
+ L) C; D7 n: x2 R$ a, s
  十一:改变列表中标题的显示
4 G" Q# j, \* H- z: o) g6 O  在默认状态下,列表中显示的字段标题是用实体类中的名称的,假如想把fullName修改位Full Name的话,可以在conf/messages下,增加:) v7 `- W* h% `% r6 |
  fullName=Full Name% a) D3 D% I, v, U# z# S4 ^* r9 Y
  即可,如下图显示:
  ~$ i$ T7 _- ^0 q) X( [) }  T+ g# w  N# n
  小结
3 [  e7 _0 m( v4 x+ Z7 c4 l7 ?  在本文中,我们学习了如何使用Play框架的脚手架功能,快速搭建CRUD的应用原型。Play框架的配置方法简化了工作代码量。目前Play框架正在 不断的完善中,读者可以根据本教程的指引实际操作后,进一步阅读官方文档加以深入学习。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 00:13 , Processed in 0.369986 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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