Struts+Hibernate布局中J2EE的数据暗示
在 struts+hibernate 这种布局中,是不该该把Hibernate发生的PO直接通报给JSP的,不管他是Iterator,照旧List,这是一个设计错误。
我来谈谈在J2EE架构中各层的数据暗示要领:
Web层的数据暗示是FormBean,数据来历于HTML Form POST
业务层的数据暗示是VO
耐久层的数据暗示是PO,其数据来历于数据库,耐久层的数据暗示譬喻CMP。在一个类型的J2EE架构中,差异层的数据暗示应该被限制在层内,而不该该扩散到其它层,这样可以低落层间的耦合性,提高J2EE架构整体的可维护性和可扩展性。好比说Web层的逻辑举办了修改,那么只需要修改FormBean的布局,而不需要触动业务层和耐久层的代码修改。同样滴,当数据库表举办了小的调解,那么也只需要修改耐久层数据暗示,而不需要触动业务层代码和Web层代码。
不外由于Hibernate的强大成果,譬喻动态生成PO,PO的状态打点可以离开Session,使得在应用了Hibernate的J2EE框架中,PO完全可以充当VO,因此我们下面把PO和VO归并,统称为PO。
先来谈谈ActionFormBean和耐久层的PO之间的重大区别:
在简朴的应用中,ActionFormBean和PO险些是没有区别,所以许多人爽性就是用ActionFormBean来充当PO,于是ActionFormBean从JSP页面到Servlet节制层再到业务层,然后穿过耐久层,最后一直映射到数据库表。真是一竿子捅到了底!
可是在巨大的应用中,ActionFormBean和PO是疏散的,他们也不行能一样。ActionFormBean是和网页内里的Form表单一一对应的,Form内里有什么元素,Bean内里就有什么属性。而PO和数据库表对应,因此假如数据库表不修改,那么PO也不会修改,假如页面的流程和数据库表字段对应干系纷歧致,那么你又如何可以或许利用ActionFormBean来代替PO呢?
好比说吧,用户注册页面要求注册用户的根基信息,因此HTML Form内里包括了根基信息属性,于是你需要一个ActionFormBean来一一对应(留意:是一一对应),每个Bean属性对应一个文本框可能选择框什么的。
而用户这个耐久工具呢?他的属性和ActionFormBean有什么明明差异呢?他会有一些ActionFormBean所没有的荟萃属性,好比说用户的权限属性,用户的组属性,用户的帖子等等。别的尚有大概的是在ActionFormBean内里有3个属性,别离是用户的First Name, Middle Name, Last Name,而在我的User这个耐久工具中就是一个 Name 工具属性。
假设我的注册页面本来只要你提供First Name,那么ActionFormBean就这一个属性,厥后我要你提供全名,你要改ActionFormBean,加两个属性。可是这个时候PO是不该该修改滴,因为数据库没有改。
那么在一个完整的J2EE系统中应该如何举办公道的设计呢?
JSP(View) —> Action Form Bean (Module) —> Action(Control)
Action Form Bean是Web层的数据暗示,它和HTML页面Form对应,只要Web页面的操纵流程产生改变,它就要相应的举办修改,它不该该也不能被通报到业务层和耐久层,不然一旦页面修改,会一直连累到业务层和耐久层的大面积的代码举办修改,对付软件的可维护性和可扩展性而言,是一个劫难,Actiont就是他的界线,到此为止!
Action(Web Control) —> Business Bean —> DAO —> ORM —>DB
而PO则是业务层和耐久层的数据暗示,它在业务层和耐久层之间举办活动,他不该该也不能被通报到Web层的View中去,而ActionServlet就是他的界线,到此为止!
然厥后看一看整个架构的流程:
当用户通过欣赏器会见网页,提交了一个页面。于是Action拿到了这个FormBean,他会把FormBean属性读出来,然后结构一个PO工具,再挪用业务层的Bean类,完成了注册操纵,重定向到乐成页面。而业务层Bean收到这个PO工具之后,挪用DAO接口要领,举办耐久工具的耐久化操纵。
当用户查询某个会员的信息的时候,他用全名举办查询,于是Action获得一个UserNameFormBean包罗了3个属性,别离是first name, middle name, last name,然后Action把UserNameFormBean的3个属性读出来,结构Name工具,再挪用业务Bean,把Name工具通报给业务Bean,举办查询。
业务Bean取得Name(留意: Name工具只是User的一个属性)工具之后挪用DAO接口,返回一个User的PO工具,留意这个User差异于在Web层利用的UserFormBean,他有许多荟萃属性滴。然后业务Bean把User工具返回给Action。
Action拿到User之后,把User的根基属性取出(荟萃属性假如不需要就免了),结构UserFormBean,然后把UserFormBean request.setAttribute(…),然后重定向到查询功效页面。
查询页面拿到request工具内里的ActionFormBean,自动挪用tag显示之。
总结:
Form Bean 是Web层的数据暗示,他不能被通报到业务层;PO是耐久层的数据暗示,在特定环境下,譬喻Hibernate中,他可以代替VO呈此刻业务层,可是不管PO照旧VO都必需限制在业务层内利用,最多达到Web层的Control,毫不能被扩散到View去。
Form Bean 和PO之间的数据转化是在Action中举办滴。