免费网站素材下载,资源网站怎样做,标准网站建设合同,网站现在用h5做的吗结合struts和hibernate谈J2EE架构的数据表示 在 struts hibernate 这种结构中#xff0c;是不应该把Hibernate产生的PO直接传递给JSP的#xff0c;不管他是Iterator#xff0c;还是List#xff0c;这是一个设计错误。 我来谈谈在J2EE架构中各层的数据表示方法#xff1a;…结合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的强大功能例如动态生成POPO的状态管理可以脱离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) --- ActionFormBean(Module) --- Action(Control) ActionFormBean是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显示之。 总结 FormBean是Web层的数据表示他不能被传递到业务层PO是持久层的数据表示在特定情况下例如Hibernate中他可以取代VO出现在业务层但是不管PO还是VO都必须限制在业务层内使用最多到达Web层的Control绝不能被扩散到View去。 FormBean和PO之间的数据转化是在Action中进行滴。 BTW: JDO1.x还不能像Hibernate功能这样强大PO不能脱离持久层所以必须在业务层使用VO因此必须在业务层进行大量的VO和PO的转化操作相对于Hibernate来说编程比较烦琐。 当然咯理论是一回事实际操作也不一定非要这样干你可以自行取舍在实际项目中灵活一点增加一点bad smell提高开发效率。只不过在大型项目中最好还是严丝合缝不然的话改版的时候会痛苦的很滴。 转载于:https://www.cnblogs.com/encounter/archive/2007/10/27/2189238.html