Spring、Hibernate、Struts

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

springhibernate:Spring、Hibernate、Struts1整合的方式疯狂代码ĵ:http:/CrazyCoder.cn/Java/Article22282.html完整例子源码已经作为附件上传为了减小体积没有包含用到jar文件请读者自己下载不便处还请见谅  9.1模型概述  正如我们所知Struts是个单纯web框架因此对于其他方面操作无能为力例如对数据库操作此外它也不能管理对象的间依赖关系因此需要和持久化框架和IoC框架结合才能构建个完整健壮系统本节分析Struts+Spring+Hibernate结合必要性  9.1.13种模型结合必要性  对于从事web开发人来说使用Struts可以大大简化开发过程对于直接使用Servlet+JSP来说它提供了优秀封装机制使得用户可以严格按照MVC架构来开发应用想想我们没有使用web框架的前是怎样混乱状态需要自己将数据从请求中取出来然后组装起来在数据很多情况下这简直是个噩梦验证代码散落在各处维护它们同样是件累人活为了处理区别请求可能需要写很多Servlet且不说容器负担问题单单是web.xml文件就变得分外臃肿最后可能变成个难以维护庞然大物这是我在实际开发中遇到过真实情况尽管使用Struts在早期也会遇到配置文件(struts-config.xml)膨胀问题但后来Struts通过模块化很好解决了这个问题  有关验证需要多说些事实上Struts验证并不像后来些web框架而言如Webwork、SpringMVC是可插拔相反它被包含在ActionForm中这是种耦合性较强设计form负担了太多责任使得重用它变得困难比如在业务层和持久层另外form是Struts框架部分出于降低耦合性考虑也不能在业务层和持久层中出现它的后些框架都很好解决了这个问题:使用个普通pojo仅仅用于封装数据不包含任何逻辑但是Struts是个可扩展框架它任何部份都是可以替换我们可以通过它提供插件机制来提供自己功能例如通常情况下Spring和Struts整合种方式就是通过插件实现通过插件我们也可以提供可插拔验证功能  Struts是个经历了无数项目考验框架有着为数最为庞大社群有着成熟经验可供参考所以在项目中使用Struts风险很小而且Struts比较容易上手因此学习成本也相对较小  正如我们前面所说Struts是个纯粹web框架不涉及业务层和持久层处理因此对于其他层需要借助于其他框架比如在持久层使用Hibernate  数据库操作是个很复杂问题尽管在Java中JDBC进行了很好抽象但是用户需要直接操作SQL这里也存在个数据组装问题实际开发中直接从ResultSet中取出数据然后放入个model中是很常见方式冗长操作令人厌烦我们在实际开发中都是将数据存放到model中然后操作model在这个意义上说model和数据库的间有着某种内在关系怎样映射这种关系正是ORM所要做ORM不仅仅要映射对象属性和数据库表字段间关系还要把表的间关系映射为对象的间关系从而把对数据库表操作完全转为对对象操作这种处理方式更为员所熟悉而且通过工具我们也很容易保持表关系和对象关系同步Hibernate正是这样个强大ORM工具除了通常O-R映射还提供了其他广受欢迎功能比如脏数据检查、延迟加载等这些我们在前面章节中已经做过介绍Hibernate在实际开发中获得了广泛应用成为事实上标准所以我们在开发中持久层实现可以选择Hibernate  Struts同样也缺少IoC和AOP功能因此存在定耦合例如在Action业务对象时候需要个例子这是很常见情况当然我们可以使用工厂模式消除这种情况但是又需要引入工厂类使用Spring可以有效地消除这种耦合我们在上章中介绍Spring和Struts整合方式中可我们在Action中通过SpringApplicationContext获取对象但是这样Action中又嵌入了Spring代码整合第3种方式通过Strutsplug-in机制将Action交由Spring托管这样我们就可以在Action中使用依赖注入完全消除了这种耦合除此的外我们还可以使用SpringAOP机制通过整合我们可以充分利用各个框架优势从而达到构建完美应用目标  9.2模型特征  我们分析了3种框架结合必要性现在我们分析下使用3个框架模型特性  9.2.1模型构成特点  在Spring+Hibernate+Struts模型中Hibernate负责持久化操作Struts负责web操作两者的间完全独立Spring在这个模型中地位很特殊它提供对对象管理而不管这个对象是处在哪层完成哪些任务Spring为用户设置对象间依赖关系并且通过AOP提供了统方式处理横向需求这些需求通常很难使用OO实现比如权限验证这样Spring就涉及到广泛领域而不管它处在哪层或者说Spring是个更为基础框架而不像Struts和Hibernate专注于各自领域  现在已经清楚了Spring、Hibernate、Struts作用现在从分层角度分析下这个模型  业务层处理实际逻辑操作这部分是由用户独立实现拥有最大灵活性有些时候持久层和业务层是混合在起但是数据库旦设计完成就很少修改所有拥有相当稳定性所以持久层也拥有相当稳定性因此可以将它们独立出来还有个原因持久化操作很多时候很复杂特别是涉及到事物时候因此维护个稳定持久层有利于分工也减少了维护成本Hibernate出现使得持久化操作不再像以前那么复杂繁琐所以也有将这两层合并做法我们下面给出例子会看到很多时候业务层仅仅是将请求委托给持久层本身什么也不做但我认为维护个独立业务层还是有好处至少在将来切换持久化实现时候比如用JDBC替换Hibernate业务层就不用作任何改动虽然这种情况很少发生  持久层我们可以直接使用HibernateAPI更好方式是使用SpringHibernate封装Spring提供了对Hibernate良好封装这样我们在持久化操作中可以使用Spring提供封装简化持久化操作HibernateSession是很昂贵资源因此每个DAO(这里指持久层类)思路方法单独使用个Session是种浪费使用Spring封装就可以使用统方式使用Session通过使用Spring托管Session我们实现了OpenSessionInView模式即在每个请求中使用个Session当然我们可以提供自己OpenSessionInView实现最简单就是实现个Filter事实上Spring提供其中种实现就是通过这种方式实现在Spring托管环境下我们就可以实现Hibernate声明式管理使用Spring封装个好处就是对异常处理Spring可以给出很明确异常信息不像JDBC统抛出SQLExceptionHibernate抛出HibernateExceptionSpring还提供了异常转换功能用户可以在配置文件中声明转换成什么样异常  web层就是Struts责任了这里通常不会涉及到Hibernate和Spring我们仅仅是由Spring管理依赖对象注入但是很多时候web请求需要些横向需求比如上面提到权限管理个更常见情况是用户登录和注册当然我们可以使用Filter实现也可以写个顶层Action统处理这些请求需要处理这些请求Action继承它即可但是这是种硬编码实现不能通过配置改变因此缺少灵活性用户是否登录判断也是个典型横切应用因此可以通过AOP来实现我们下面例子会给出个使用拦截器判断用户是否登录实现为了使用拦截器我们这里给出了Spring和Struts整合第4种方式涉及到了SpringMVC内容相对来说SpringMVC在设计上更加倚重IoC和AOP也提供了更为开放方式因此更为强大但是却过于复杂但是相对于它提供丰富特性这些复杂性是可以克服因此在实际开发中可以考虑用SpringMVC实现web层即用它替换Struts  9.2.2实现模型目  使用Spring+Hibernate+Struts模型目实际上面已经涉及到了这些框架优点是使用它们个重要原因还有些可能更重要原因整理总结如下:  去耦合这是个老生常谈话题了去耦合是如此重要以至于人们要将这方面经验整理总结成设计模式Spring通过IoC实现了去耦合这样用户可以随时替换现在实现而不用修改源码这正是软件Software开发中开-闭原则要求Spring倡导面向接口编程这是最为推崇最佳实战的继承仅仅作为内部实现个手段面向接口编程不仅仅是提供了更好抽象实际上也更有利于去耦合  扩展需要Struts、Spring甚至Hibernate都提供了良好扩展功能Struts通过插件机制可以很方便添加功能Spring对Bean管理也提供了扩展例如用户可以提供自己作用域Hibernate用户可以定制自己持久化策略  维护需要这些框架都很容易维护它们都很好实现了开-闭原则因此需要替换功能时候只需简单修改配置文件它们提供些公用功能也能通过配置方式提供比如Spring声明式事务因此维护成本大大降低  还有个原因由于它们都有庞大社区支持因此寻找技术支持很容易由于它们很流行因此招个开发人员也很容易  9.3Hibernate+Spring+Struts模型应用分析  通过上面学习我们对3者结合模型有了个概念性理解现在我们通过个具体例子演示怎样将它们整合在起  9.3.1应用事例  我们考虑个购物车例子相信读者或多或少都接触过这方面例子为了简单起见我们不考虑库存问题商品信息完全由用户填写包括商品名称、商品介绍、商品价格、购买数量填写完商品信息会被暂时放入购物车内每个购物车抽象成个订单当用户确认购买商品后就可以提交购物车从而这些信息被存入数据库购物车清空在做这些操作的前用户首先需要登录如果用户没有注册可以选择注册用户不仅可以购买商品还可以查看已经提交订单详细信息个用户可以有多个订单个订单只能属于个用户同理个订单可以包含多个商品而个商品只能属于个订单用户姓名是唯这是确认用户唯凭证这就是全部需求  9.3.2事例分析  好现在我们开始构建整个应用应用用到类库如图9-1所示:图9-1 应用用到jar包  首先我们需要建立所需数据库表我们用到表有3个每个表都有个用于标识id这3个表分别是:tb_user——用户表用来存放用户信息包括用户名和密码;tb_order——订单表用来存放订单信息包括订单描述、生成时间、用户id;tb_item——商品表用来存放商品信息包括商品名称、商品描述、商品价格、购买数量、定单id  我用数据库是Oracle9i生成3个表用到SQL如下:Sql代码/*商品表*/createtabletb_item(idnumber(10,0)notnull,orderidnumber(10,0)notnull,/*订单id*/namevarchar2(20char)notnull,/*商品名称*/descriptionvarchar2(800char),/*商品描述*/pricenumber(18,2),/*商品价格*/countnumber(10,0),/*购买数量*/primarykey(id))/*订单表*/createtabletb_order(idnumber(10,0)notnull,useridnumber(10,0)notnull,/*用户id*/descriptionvarchar2(800char),/*订单描述*/createTimetimestamp,/*生成时间*/primarykey(id))/*用户表*/createtabletb_user(idnumber(10,0)notnull,namevarchar2(20char)notnull,/*用户名*/passwordvarchar2(20char)notnull,/*密码primarykey(id))altertabletb_itemaddconstraFKA4F9FA443A36B48Fforeignkey(orderid)referencestb_orderaltertabletb_or

1 / 89
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功