第 24 章 综合 Struts+Spring+Hibernate 开发图书管理系统

Preview:

DESCRIPTION

第 24 章 综合 Struts+Spring+Hibernate 开发图书管理系统. 本章将要实现的是一个简单图书管理系统,由用户登录和图书馆里两部分组成。本系统将采用三层架构的模式分为表现层、业务层、持久化成。在开发过程中利用了 Struts 来实现 Web 层,这里遵循了经典的 MVC 模式;使用 Hibernate 来实现数据访问和持久化层;使用 Spring 来实现业务层和整合工作。通过本章的学习将体会到三个框架结合的力量,在这里 1+1+1 要远远大于 3 。 说明:本章学习的重点在于整合三个框架和如何面对实际应用,某些技术细节可以查阅前面的章节。. 24.1 概述. - PowerPoint PPT Presentation

Citation preview

第 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 应用,可以在此基础上添加更为复杂的业务逻辑,满足实际项目的需要。

Recommended