论坛积分策略 论坛VIP区开放申请 我爱电脑万人签名活动 原声大碟520欢迎你 广告位招租
发新话题
打印

[java] 结合struts和hibernate 谈J2EE数据表示

结合struts和hibernate 谈J2EE数据表示

在struts+ hibernate 这种结构中,是不应该把Hibernate产生的PO直接传递给JSP的,不管他是Iterator,还是List,这是一个设计错误。
  p& _0 P$ {* S3 R我爱电脑技术社区--打造最好的电脑技术自学交流平台
2 H$ t7 U7 C2 e0 {" V我爱电脑技术论坛
2 o  s) C2 a: I1 e+ c3 R我爱电脑技术论坛我来谈谈在J2EE架构中各层的数据表示方法: 我爱电脑技术论坛+ n5 q7 H8 @9 |; f# e
我爱电脑技术论坛$ n; Y* ^) G+ V' J2 g+ R/ j
我爱电脑技术论坛  {$ b" p8 K7 Z2 Y1 \+ G
Web层的数据表示是FormBean,数据来源于HTML Form POST
% n7 w' `) [; r& Y我爱电脑技术论坛
! i- p! b3 K6 c5 v! P8 [8 o业务层的数据表示是VO
- ]) R; N$ v, o1 ~; e2 \电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站我爱电脑技术论坛/ Z4 Z# K, L' W, Q
持久层的数据表示是PO,其数据来源于数据库,持久层的数据表示例如CMP 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 d5 [" n8 z# @6 F8 b  d5 C
我爱电脑技术社区--打造最好的电脑技术自学交流平台. _6 ^6 Q& w9 y( o& @9 O! O

* R  n8 v) P% V- R1 ~* z' m打造最好的电脑自学交流论坛在一个规范的J2EE架构中,不同层的数据表示应该被限制在层内,而不应该扩散到其它层,这样可以降低层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。比如说Web层的逻辑进行了修改,那么只需要修改FormBean的结构,而不需要触动业务层和持久层的代码修改。同样滴,当数据库表进行了小的调整,那么也只需要修改持久层数据表示,而不需要触动业务层代码和Web层代码。
: P; P* g3 I$ S) s- B6 w7 |www.520diannao.com
& r3 a2 r2 M$ z! W我爱电脑技术社区--打造最好的电脑技术自学交流平台
0 ]+ F! ]6 K7 ^打造最好的电脑自学交流论坛不过由于Hibernate的强大功能,例如动态生成PO,PO的状态管理可以脱离Session,使得在应用了Hibernate的J2EE框架中,PO完全可以充当VO,因此我们下面把PO和VO合并,统称为PO。 打造最好的电脑自学交流论坛5 w& `8 T$ \+ C3 O3 o# s! g
9 \/ U  F" Q' ]

: l. `/ U# b! F) N* B9 C$ X我爱电脑技术社区--打造最好的电脑技术自学交流平台先来谈谈ActionFormBean和持久层的PO之间的重大区别。
/ f( p! f! e( `0 ^& l我爱电脑技术论坛打造最好的电脑自学交流论坛0 W; W& U  |  }$ o7 F% u
9 m" d/ ?0 I2 Q% k/ y" u" K4 V/ ~
在简单的应用中,ActionFormBean和PO几乎是没有区别,所以很多人干脆就是用ActionFormBean来充当PO,于是ActionFormBean从JSP页面到Servlet控制层再到业务层,然后穿过持久层,最后一直映射到数据库表。真是一竿子捅到了底!
! F9 G  T, E' O# q2 p9 ~4 w我爱电脑技术社区--打造最好的电脑技术自学交流平台
5 f/ W7 M8 [0 S/ T电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
/ s" ?7 C( Z3 G6 ~5 i我爱电脑技术社区--打造最好的电脑技术自学交流平台但是在复杂的应用中,ActionFormBean和PO是分离的,他们也不可能一样。ActionFormBean是和网页里面的Form表单一一对应的,Form里面有什么元素,Bean里面就有什么属性。而PO和数据库表对应,因此如果数据库表不修改,那么PO也不会修改,如果页面的流程和数据库表字段对应关系不一致,那么你又如何能够使用ActionFormBean来取代PO呢?
: ?$ ?% M" d; z9 Y2 ]3 F" X  \  V1 T我爱电脑技术论坛
( L6 L" T* q  J, `) Z( m; _我爱电脑技术论坛  Z- Q) i+ W; o/ t
比如说吧,用户注册页面要求注册用户的基本信息,因此HTML Form里面包含了基本信息属性,于是你需要一个ActionFormBean来一一对应(注意:是一一对应),每个Bean属性对应一个文本框或者选择框什么的。 6 ~8 m: Z/ n, }0 k8 ^  m3 _
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站, J! z5 k% M" z/ s
打造最好的电脑自学交流论坛. L7 T6 Q( e2 P- b2 W
而用户这个持久对象呢?他的属性和ActionFormBean有什么明显不同呢?他会有一些ActionFormBean所没有的集合属性,比如说用户的权限属性,用户的组属性,用户的帖子等等。另外还有可能的是在ActionFormBean里面有3个属性,分别是用户的First Name, Middle Name, Last Name,而在我的User这个持久对象中就是一个 Name 对象属性。 我爱电脑技术社区--打造最好的电脑技术自学交流平台  X9 A# X& \- M: ]; O
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站6 `0 p( o! J' y  S* _
我爱电脑技术社区--打造最好的电脑技术自学交流平台+ h5 @  I& t* b
假设我的注册页面原来只要你提供First Name,那么ActionFormBean就这一个属性,后来我要你提供全名,你要改ActionFormBean,加两个属性。但是这个时候PO是不应该修改滴,因为数据库没有改。 ! t9 M( y# X' a" \* H, d

  c0 g2 c& w2 Q0 b1 r0 m, C电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站我爱电脑技术社区--打造最好的电脑技术自学交流平台" J- l" Y, x3 c1 b' h
那么在一个完整的J2EE系统中应该如何进行合理的设计呢? 我爱电脑技术论坛4 G4 l4 l, l+ Y% ^% h1 m

; W/ d/ j+ c, q' M) R9 O- N! U/ ?4 z打造最好的电脑自学交流论坛
4 M: n  Q3 K$ Y8 B* E电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站JSP(View) ---> ActionFormBean(Module) ---> Action(Control) 6 o- A1 w  H6 U. ]# k5 ?9 ]
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站: P9 Z; I6 K0 O% i2 u- R
1 a5 G: H0 k4 D! C. i8 N) `% |( m; ~4 b
ActionFormBean是Web层的数据表示,它和HTML页面Form对应,只要Web页面的操作流程发生改变,它就要相应的进行修改,它不应该也不能被传递到业务层和持久层,否则一旦页面修改,会一直牵连到业务层和持久层的大面积的代码进行修改,对于软件的可维护性和可扩展性而言,是一个灾难,Actiont就是他的边界,到此为止!
* {% D; ^* ~" r" f, ~6 o打造最好的电脑自学交流论坛
, {7 Q; S9 }. n. J# ~3 k打造最好的电脑自学交流论坛
4 ?3 ~) H+ Y# D. M0 G我爱电脑技术社区--打造最好的电脑技术自学交流平台Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB
8 }- Y& A8 ~/ i8 Q: _  v( B我爱电脑技术社区--打造最好的电脑技术自学交流平台www.520diannao.com5 u4 \; @6 D  B: |, ]! U1 o8 K! v
我爱电脑技术论坛& @) V3 }8 K$ P! e( `/ K
而PO则是业务层和持久层的数据表示,它在业务层和持久层之间进行流动,他不应该也不能被传递到Web层的View中去,而ActionServlet就是他的边界,到此为止! 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站  u. s1 q0 g+ S1 k( c
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站( N8 E8 s4 Z# ~4 K4 Y; I

0 k- z" r5 f6 l* y3 W5 Y; h打造最好的电脑自学交流论坛然后来看一看整个架构的流程: 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站, p7 d, @6 F; }- }9 Y/ ~8 R

( k, v6 @0 X9 V' S- [0 ]( u# [我爱电脑技术论坛打造最好的电脑自学交流论坛) ~, B3 c3 P; P7 ^6 Q
当用户通过浏览器访问网页,提交了一个页面。于是Action拿到了这个FormBean,他会把FormBean属性读出来,然后构造一个PO对象,再调用业务层的Bean类,完成了注册操作,重定向到成功页面。而业务层Bean收到这个PO对象之后,调用DAO接口方法,进行持久对象的持久化操作。 我爱电脑技术论坛8 e* u! V5 {! z! J

4 Z1 v" o0 R  K9 p) A/ Gwww.520diannao.com
0 Q$ U* k: T" ^0 f, S4 `我爱电脑技术论坛当用户查询某个会员的信息的时候,他用全名进行查询,于是Action得到一个UserNameFormBean包括了3个属性,分别是first name, middle name, last name,然后Action把UserNameFormBean的3个属性读出来,构造Name对象,再调用业务Bean,把Name对象传递给业务Bean,进行查询。
0 l/ u$ s: F' c  Y* E+ |" o/ ywww.520diannao.com
! |; P' e( I% l# D! G% U电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
0 c7 ]6 e2 q9 s. e1 x' Z, q7 wwww.520diannao.com业务Bean取得Name(注意: Name对象只是User的一个属性)对象之后调用DAO接口,返回一个User的PO对象,注意这个User不同于在Web层使用的UserFormBean,他有很多集合属性滴。然后业务Bean把User对象返回给Action。
' U! Y, C, M/ k1 q- x打造最好的电脑自学交流论坛1 U* {) D. Z! _& I" m* B0 e

! [2 U' D1 T: o8 D" p3 C1 NAction拿到User之后,把User的基本属性取出(集合属性如果不需要就免了),构造UserFormBean,然后把UserFormBean request.setAttribute(...),然后重定向到查询结果页面。
7 H( r1 ^7 }; \6 g, B) _" E0 A
7 V' N( J$ J9 a* D  j' X7 D$ Y电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站# I+ ~  i- t. g' ~5 B
查询页面拿到request对象里面的ActionFormBean,自动调用tag显示之。
* C3 w  f3 _9 Q# }/ F我爱电脑技术社区--打造最好的电脑技术自学交流平台电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站/ [9 p' P3 i1 {% U% M
打造最好的电脑自学交流论坛. p$ r8 j% i9 ?  `8 S) M& {
总结: 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站8 C' h1 z+ O! J0 c, P. o! q

9 C8 G/ s+ V* k- D- ?- `我爱电脑技术论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台. l- y( ?+ V) i/ U) T" @1 L
FormBean是Web层的数据表示,他不能被传递到业务层;PO是持久层的数据表示,在特定情况下,例如Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达Web层的Control,绝不能被扩散到View去。
2 T) o1 j  c% E. y) z) F打造最好的电脑自学交流论坛
- k  |! }' Y. K  u) l: Vwww.520diannao.com
/ w1 Q, P. Z9 y0 O! n0 Z电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站FormBean和PO之间的数据转化是在Action中进行滴。
* A; w9 d2 ~) u+ e2 D打造最好的电脑自学交流论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台' M+ z' n) F* b) N& [1 b6 O* h

7 A* l3 Z3 H; G1 o; M9 Q1 Y打造最好的电脑自学交流论坛BTW:
) ~1 u: O7 _+ Z, Jwww.520diannao.com
# z3 Z# s4 Y( I& Z' W4 v, Vwww.520diannao.com
( ]6 Z: \& Z" ^* F% r9 Y" }# U电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站JDO1.x还不能像Hibernate功能这样强大,PO不能脱离持久层,所以必须在业务层使用VO,因此必须在业务层进行大量的VO和PO的转化操作,相对于Hibernate来说,编程比较烦琐。

TOP

谢谢楼主分享  收藏
走别人的路让别人无路可走

TOP

发新话题