300 likes | 668 Views
第 24 章 综合 Struts+Spring+Hibernate 开发图书管理系统. 本章将要实现的是一个简单图书管理系统,由用户登录和图书馆里两部分组成。本系统将采用三层架构的模式分为表现层、业务层、持久化成。在开发过程中利用了 Struts 来实现 Web 层,这里遵循了经典的 MVC 模式;使用 Hibernate 来实现数据访问和持久化层;使用 Spring 来实现业务层和整合工作。通过本章的学习将体会到三个框架结合的力量,在这里 1+1+1 要远远大于 3 。 说明:本章学习的重点在于整合三个框架和如何面对实际应用,某些技术细节可以查阅前面的章节。. 24.1 概述.
E N D
第24章 综合Struts+Spring+Hibernate开发图书管理系统 • 本章将要实现的是一个简单图书管理系统,由用户登录和图书馆里两部分组成。本系统将采用三层架构的模式分为表现层、业务层、持久化成。在开发过程中利用了Struts来实现Web层,这里遵循了经典的MVC模式;使用Hibernate来实现数据访问和持久化层;使用Spring来实现业务层和整合工作。通过本章的学习将体会到三个框架结合的力量,在这里1+1+1要远远大于3。 • 说明:本章学习的重点在于整合三个框架和如何面对实际应用,某些技术细节可以查阅前面的章节。
24.1 概述 • 在本节中首先将介绍图书馆里系统的基本功能也就是明确本章要实现的目标,其次对开发环境需要的资源做一个简单描述,使读者就可在阅读本章前提前做好准备。最后就是说明开发文件和目录应该如何组织。明确了这些大框架就会避免再出现诸如“找不到文件”、“类未加载”等恼人的错误,那么跟随本章实现这个实用的实例就会轻松许多了。
24.1.1 系统功能预览 • 在本系统中主要包含两个模块:登录和图书管理。具体实现的用例图如图。 • 对于图书管理模块,主要分为对图书的维护:新增图书、修改图书、删除图书和对图书的检索,条件查询两部组成。这些都将在以后的章节详细介绍,首先请看主页面图,如图所示,对这个系统有一个初步的感官认识。
24.1.2 系统结构 • 在本例中采用了三层结构,分别由Struts2实现Web表现层、Spring实现业务层、Hibernate来实现数据访问层。分层是一个很重要的设计方法,使结构更加清晰,在每层中只集中解决特定的问题,有利于发挥不同框架的作用。本例中结构图如图所示。 • 分层的另一个好处是可以剪断层与层之间的耦合关系,修改某一层中的实现不会影响到其他层。
24.1.3 所需资源 • 虽然这个实例不大,但包含的内容相当的全面:数据库、OR工具、J2ee服务器、模板引擎,从这个意义上说它不次于一个中等规模的项目 • (1)数据库仍然采用Mysql数据库,对于MySQL数据库的安装和使用请参考“Hibernate入门”一章中有详细介绍。 • (2)JSP服务器还是采用Tomcat服务器。对于MySQL数据库的安装和使用请参考“Struts入门”一章中有详细介绍。 • (3)引入资源。在MyEclipse中创建一个Web Project。在右键菜单中给这个Project增加Hibernate和Spring特性。前文已经介绍过,MyEclipse还没有对Struts2支持,这里需要手工添加Struts2的资源包。最后需要的资源如图所示。
24.1.4 源代码目录组织 • 在进行程序设计和开发之前,要设计目录和包的结构。良好的结构会使代码逻辑清楚且容易阅读。一般一个设计良好的结构都有其共同的特点,就是逻辑清楚。本系统的目录结构如图23.5所示。在这个目录结构中,end是项目的根目录也是项目的名称。其下src目录用于存放原文件,所有的Java 类都定义在这个文件夹下。 • WebRoot目录在创建Web工程自动生成的目录,在发布时这个目录将被直接发布到应用服务器中。其下放置JSP 页面,WEB-INF 目录下存放系统的配置文件,如web.xml等。
24.2 给Web服务器配置web.xml • 对于一个Web系统来说,系统配置和框架的加载一般都是在web.xml中完成的。在本例中需要在web.xml中加载Struts,而且要完成Struts与Spring的整合工作,使Spring可以通过web路径获得Spring的上下文(applicationContext)
24.2.1 添加Struts2配置 • 在Struts2一篇中曾经有过详细介绍,在Struts2中是采用过滤器(filter)来实现Struts加载的代码如: • <filter> • <filter-name>struts2</filter-name> • <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> • <init-param> • <param-name>config</param-name> • <param-value> • struts-plugin.xml,struts.xml,struts_login.xml,struts_books.xml • </param-value> • </init-param> • </filter> • <filter-mapping> • <filter-name>struts2</filter-name> • <url-pattern>/*</url-pattern> • </filter-mapping>
24.2.2 添加Spring配置 • 整合Spring来控制Struts还需要修改一下web.xml文件,让Spring能参与到sevlet的执行中去。 • (1)配置Spring监听器。是系统加载Spring框架,启动Spring的IoC容器。 • (2)默认情况下,容器会到WEB-INF目录下面去寻找applicationContext.xml文件。
24.2.3 定义编码转化器(解决中文问题) • 在进行Web 开发时,经常会遇到中文显示出现乱码的情况,这是因为Java 内置的字符集与页面显示的字符集不一致造成的。为了解决这个问题,开发人员需要转化字符编码,但是如果对所有的输入输出信息都做编码转化显然比较麻烦。通过定义一个Filter 来自动的实现字符编码的转化是一个比较好的方法。
24.2.4 定义Log的输出 • Log4j是一个开源的Java日志记录组件,也是归属于由Apache组织。Log4j允许开发人员以任意的精细程度控制哪些日志说明被输出。通过使用外部的配置文件,可以在运行时配置它。几乎所有的Java应用都要使用Log4J作为日志输出。 • 无论是Struts和Hibernate还是Spring日志控制都是由Log4J来定义的。在Spring中支持在Web.xml中加载Log4J配置文件的方法
24.3 用Struts2实现Web表现层 • Struts在Web表现中强大的支持已经在前面的章节有过描述。在本例中并没有使用Struts的高级功能,主要是利用了Struts的前端表现能力,如标签库、国际化、自动校验。与Spring结合吧Action类的实例化交给Spring的IoC容器来完成。
24.3.1 Struts的配置文件 • 在本例中采用一个模块一个Struts配置文件的做法,这也是在实际开发中经常采用的做法。本例中一共分为三个文件: struts.xm负责全局配置、struts_login.xml登录模块配置、struts_books.xml图书管理模块配置。 • (1)全局配置:全局配置写在struts.xml文件中,使用<constant>元素来定义静态全局的属性。代替了struts.properties文件的作用。 • (2)登录模块配置。 • (3)图书管理模块配置:在这个配置文件中定义了页面上的所有操作,包括查询(list)、编辑(edit)、删除(delete)、保存(save)。
24.3.2 图书馆里的Action类 • 在前面的章节曾经作过重点的介绍,无论是在Struts1.x还是Struts中Action类都是的最重要最核心所在。在本例中有意安排两个Action以不同的驱动模式来实现,LoginAction是Model-Driven(模型驱动的)方式来实现的,它包含一个User值对象来参与传递数据。而BooksAction是以Property-Driven(属性驱动)方式实现的,没有值对象参与。
24.3.3 在添加图书中采用自动校验 • 在saveAction中配置文件定义两个过滤器,两个Struts2内置的过滤其作用就是实现自动校验: • <interceptor-ref name="params"/> • <interceptor-ref name="validation"/>
24.3.4 使用标签实现在图书维护页面 • Struts2的提供了众多可选择的标签库资源,引入方式如: • <%@ taglib prefix="s" uri="/struts-tags" %> • 在本例中主要使用了两种常用的标签:逻辑标签和表单标签。
24.4 用Hibernate实现数据层 • 数据库设计是系统设计中非常重要的一个环节。数据是一切系统设计的基础,通俗的说数据库设计就像高楼大厦的根基一样,如果设计不合理、不完善,将在系统开发过程中、甚至到后期的系统维护、功能变更和功能扩充时,引起较多问题,严重时甚至要重新设计,重做大量已完成工作。
24.4.1 创建数据库 • 在本例中数据库设计并不复杂,本章重点介绍的是纵向的链接关系,如何将使用Struts、Hibernate、Spring来搭建三层结构的业务处理。复杂的域对象之间的关系并不是本章的重点。
24.4.2 配置数据源 • 在本例程中将Hibernate与Spring完全整合在一起,把hibernate.cfg.xml中的配置转移到Spring的配置文件中来。如“Spring实战In MyEcplise”一章中介绍的,可以使用MyEclipse提供的的Datasource SessionFactory向导来完成这个配置。
24.4.3 持久化类和映射文件 • 在本例中没有包含复杂的关联关系,持久化类和映射文件都可以直接用MyEclipse提供的工具从数据表直接反向生成。工具的使用请参考前面“Hibernate实战 in MyEclipse”一章中有详细介绍。
24.4.4 实现图书馆里和登录管理的DAO类 • DAO也是一个经典的设计模式,使用这种模式可以解决数据访问代码与业务代码之间的耦合关系,业务代码只对接口进行操作,并不关心具体实现是依赖如JDBC还是Hibernate还是其他OR工具。 • 在Spring的IoC容器中这种模式就更加方便的实行,实现接口的方式由原来的工厂方法改为由Spring来反向控制。一切都在配置文件中完成的,也是就说如果想改变数据层实现方式(如从Hibernate框架改为以ibatis)不必对Service类做任何改变。
24.5 Spring整合业务层 • 在本例程中利用Spring的IoC容器整合了表现层、业务层和数据访问层,使用AOP实现了DAO类的事务控制。归纳起来有以下几个步骤: • (1)接管的Struts中Action的实例化。 • (2)给Action注入Service类实现。 • (3)给Service注入DAO类。 • (4)加载Hibernate模块,提供数据源。 • (5)添加事务管理。
24.5.1 配置Bean文件 • 在把公共部分写写到applicationContext.xml中去,每个模块一个beans.xml。引入方法如下: • <import resource="book_beans.xml" /> • <import resource="login_beans.xml" />
24.5.2 实现业务类 • 业务类的逻辑并不负责,在这里仅仅是起到了Action与DAO类的连接作用,在实际项目中往往需要在业务类中实现更复杂的应用逻辑,需要更多的业务来支持系统。
24.5.3 保存图书中的事务管理 • 在本例中同样适用了Spring的声明式的事务管理,并不需要添加任何代码,只需要在applicationContext.xml中作事务声明即可。关于Spring的事务管理请参考“用Spring整合其他应用”一章中的详细描述,
24.5.4 浏览图书的分页处理 • 在本例中提供了一个非常有用的模块:分页处理。在网页查询中这是一个必不可少的功能项。本例使用的是最简单的实现,依赖于DAO中分页函数处理,这里也是因为有了Hibernate才能如何简单实现。
24.6 发布与测试 • 本例仍然使用Tomcat作为JSP服务器,当然本例并没有特意针对Tomcat,因此在任何一个JSP服务器中都可以直接部署。
24.6.1 在MyEclipse中发布应用 • 利用MyEclipse提供的发布工具,可以方便的把应用程序发布到服务器中,并可以在开发工具中调试。发布过程如图所示。
24.6.2 在Tomcat中查看运行结果 • 启动Tomcat后,正确的结果是不出现任何错误信息,提示服务器成功启动。
24.7 小结 • 本篇是本书的最后一章。在本章中力图使读者对Struts+Spring+Hibernate三者结合开发应用程序有一个比较全面的认识。进一步展示了这三个当前流行的框架为J2EE应用开发提供的强大支持。同时更加深刻的说了使用这些框架为系统结构带来的好处。 • 本章的包含的例程是一个完整的J2EE应用,可以在此基础上添加更为复杂的业务逻辑,满足实际项目的需要。