第十七章 Struts+Spring+Hibernate构建电子商务系统 在本章内容中,将以Hibernate Jpetstore为基础, 详细介绍在实际的开发过程中,如何综合使用 Struts、Spring、Hibernate这三种技术,对于开 发过程中的主要步骤,在接下来的内容中将会详 细介绍。
17.1 电子商务简介 在互联网日益发达的今天,电子商务的应用也得 到了日益广泛的应用,例如目前比较知名的电子 商务网站卓越、易趣、阿里巴巴等,这些电子商 务网站都取得了巨大的成功,消费者也逐渐接收 了网上购物的方式,这都促使电子商务应用的快 速发展。在本节的内容中,将简单电子商务应用 系统的基本知识。
17.1.1 电子商务简介 电子商务(Electronic Business)就是基于互联 网的商业活动,它不仅包括基于互联网的商品服 务交易,而且还包括将企业内外部关系转化为创 造价值和开发市场的机会,包括通过互联网实现 原料采购、产品生产、产品展示、物流、销售等 各个生产的环节。电子商务的物理基础包括计算 机互联网、金融电子系统、物流配送系统、安全 保障系统等,电子商务通过信息流、资金流和物 流来实现。可以划分为企业间的电子商务和企业 对消费者的电子商务等。
17.1.2 电子商务应用范围 目前电子商务主要应用于金融、证券、保险、制 造业、服务行业以及IT行业等。在这些行业中已 经能够很好的通过互联网辅助业务的处理,尤其 是在金融证券等行业,电子商务已经涉及的日常 工作的每个方面。
17.2 Hibernate Jpetstore简介 在本章的内容中,将以Hibernate Jpetstore为基 础介绍使用Struts、Spring、Hibernate开发电子 商务网站的基本流程,接下来将简单介绍 Hibernate Jpetstore的基本情况。
17.2.1 Hibernate Jpetstore简介 Jpetstore是Spring开发包中的一个示例程序,在 这个示例程序中采用了Struts、Spring、iBatis 实现了一个简单的电子商务系统,在Java开发者 社区中,使用Hibernate替换了Jpetstore中的持 久层iBatis,这个改造以后的项目就是Hibernate Jpetstore系统,Hibernate Jpetstore成为Java 开发者社区中的一个开源项目,项目的具体信息 可以在https://hjpetstore.dev.java.net/查看。
17.2.2 获取Hibernate Jpetstore示例代码 Hibernate Jpetstore是一个开源项目,系统的源 代码可以在项目的CVS服务器中获取。这个项目使 用的开发工具是NetBeans,在本书介绍的内容中, 使用的开发工具是Eclipse,这两种工具的工程信 息文件是不同的,项目文件组织方式也有所不同, 其中Eclipse中的WebRoot目录对应着NetBeans中 的Web目录,其他的部分是没有区别的。
17.3 Hibernate Jpetstore系统总体设计
17.3.1 功能分析 Hibernate Jpetstore系统是一个宠物商店的示例 程序,在这个示例项目中,展示各种类型的宠物, 用户可以在查询、浏览系统中提供的宠物,挑选 并定购喜欢的宠物。(具体内容请参照书。)
17.3.2 系统整体架构--表示层 表示层也叫视图层,在Hibernate Jpetstore这个 系统中,表示层是用JSP、JSTL标签库和Struts实 现的。在这个系统中,表示层的文件包括 hibernateJpetstore/web/WEB-INF/jsp/struts/ 目录下的所有文件,这个目录下是系统中用到的 所有JSP页面,同时 hibernateJpetstore/web/index.jsp这个页面是 Hibernate Jpetstore这个系统中的前端跳转首页, 用户可以通过这个页面跳转到JSP文件所在的目录。 (具体内容请参照书。)
17.3.3 系统整体架构--控制层 控制层出于表示层和数据层之间,它的功能是把 表示层和数据层联系起来,降低表示层和数据层 的联系。这也正是MVC开发模式中一直强调的一点。 在Hibernate Jpetstore中,控制层主要由以下几 个部分组成。(具体内容请参照书。)
17.3.4 系统整体架构--数据层 在这个示例系统中,数据层由以下几部分构成。 17.3.4 系统整体架构--数据层 在这个示例系统中,数据层由以下几部分构成。 hibernateJpetstore/src/org.springframework/samples/ jpetstore/dao/下的所有文件。 hibernateJpetstore/src/org.springframework/samples/ jpetstore/domain/下的所有文件 hibernateJpetstore/web/WEB-INF/目录下的 dataAccessContext-hibernate.xml、jdbc.properties和 applicationContext.xml这三个文件。(具体内容请参照 书。)
17.4 Hibernate Jpetstore系统数据层设计
17.4.1 数据库ER图 如图17.4所示就是这个示例系统中的数据库ER图。 其中,account描述了用户账号的信息,orders描 述了用户订单的信息,lineitem描述了订单中每 一项的信息,item描述了宠物的详细信息, supplier描述了供应商的信息,inventory描述了 库存信息。
17.4.2 数据库SQL脚本 完成了数据库关系的设计以后,就需要提供对应 的数据库SQL脚本,下面就是这个示例系统中数据 库所对应的SQL脚本,通过这些脚本可以创建系统 所需要的基本的数据库表结构。(具体内容请参 照书。)
17.4.3 Hibernate数据库映射 在Hibernate中,可以把对数据库的操作模拟成对 对象的操作,所有的数据库操作都可以通过对象 操作实现,在Hibernate中,之所以能实现这样的 功能,最关键的部分就是Hibernate可以把数据库 的表结构和Java对象映射起来,用Java对象的属 性描述数据库表中的字段,用Java对象之间的关 系描述数据库表之间的关系,下面以用户表 account为例,展示Hibernate中数据库映射的基 本方法。(具体内容请参照书。)
17.4.4 DAO调用序列 在Hibernate Jpetstore这个示例项目中,对数据 库的操作全都集中在各个DAO中,在程序中可以调 用这些DAO进行数据库的操作,(具体内容请参照 书。)
17.4.5 DAO接口设计及Hibernate DAO 实现 对于DAO的实际,一般情况来说,每个DAO都会包 含所有的CRUD(即增删改查操作),利用这些基 本功能就可以组成各种复杂的数据库操作,但是 在实际的开发过程中,除了基本的CRUD以外,为 了使用上层的要求,需要根据需求提供更多其他 的方法,在这些方法中可以执行比基本CRUD更多 的操作。(具体内容请参照书。)
17.5 Hibernate Jpetstore系统控制层设计 在传统Struts应用中,控制层组件一般情况下指 的是Action,而ActionForm只是用来收集表示层 的数据,并把这些数据传递给Action。在这个示 例程序中,引入了Spring,所以就可以使用 Spring的依赖注入、AOP以及声明式的事务管理机 制。在本节接下来的内容中,将介绍Spring的这 些特性和常规的Struts的功能。
17.5.1 通过Spring AOP实现邮件发送 Spring AOP的内容在本书的14.3小节中已经做了 详细的介绍,在Hibernate Jpetstore这个示例系 统中,有两个地方用到了AOP的知识,一个是邮件 发送操作中用到,另一个用到AOP的地方是声明式 的事务处理,事务处理在接下来的小节中将详细 介绍,在这里介绍Hibernate Jpetstore中使用 AOP进行邮件发送功能的具体实现方法。(具体内 容请参照书。)
17.5.2 Spring的声明式事务管理 在Hibernate Jpetstore这个示例项目中,还有一 个地方使用到了AOP的知识,这就是在Spring中的 声明式事务管理,在这个示例项目中就使用了 Spring中的声明式事务管理机制。在Spring中使 用声明式事务管理的方法非常简单,仅仅通过 Spring上下文的配置即可。下面就是这个示例项 目中的声明式事务管理的具体配置信息。
17.5.3 Struts在控制层的功能 Aciton是Struts的核心组件,它负责这Struts控 制层的基本操作,在Action中可以调用业务层或 者是DAO完成具体的逻辑操作。在页面上的每一个 链接或者是表单都会对应这一个Action,在 Struts中每个Action都是 org.apache.struts.action.Action的子类,并且 需要重写execute()方法,在这个方法中调用业 务层或者是DAO来处理用户的请求。
17.6 Hibernate Jpetstore系统表示层设计 在Hibernate Jpetstore这个示例程序中,表示层 采用了Struts标签、JSTL和JSP页面相结合的处理 方法,采用JSTL的原因就是减少JSP页面上的Java 代码,而Struts的标签是执行某些Struts操作中 必不可少的,在本节内容中,将介绍这个示例程 序中表示层的实现方法。
17.6.1 Struts 表示层组件 FormBean 在Struts中,FormBean充当了表示层的组件,它 可以接收用户的表单输入,并且把表单的内容传 递给Action处理,FormBean和我们熟悉的 JavaBean非常类似,不同之处在于这些FormBean 都需要继承 org.apache.struts.action.ActionForm这个类, 而且在需要的时候还得重写其中的validate() 和reset()方法。
17.6.2 FormBean 类层次 于Aciton中的BaseAction类似,FormBean也提供 了一个基类,所有的FormBean只需要实现 BaseActionForm这个基类的指定约束,既可以复 用这个基类中的功能。这个基类ActionForm的具 体代码如下。
17.6.3 JSP+JSTL+Struts标签库实现信息展示 在Hibernate Jpetstore中,使用传统的JSP表态 包含指令,来包含进公共部分,如页眉,页脚及 导航区域等。所有以 Include 前缀命名的JSP都 用来被其他JSP页面包含的页面块。在这个示例程 序中,所有的页面结构如下所示。
17.6.4 在Struts中防止重复提交 在Struts中可以采用事务Token来放置用户表单的 重复提交,在Hibernate Jpetstore这个示例系统 中,用户提交订单的例子中就使用了事务Token来 放置用户的重复提交。在这个用户提交表单的时 候,要把用户输入的表单展示在确认页面中,如 果点 'Continue' 按钮,才会将订单插入到数据 库中,在这个处理过程中采用事务Token来避免用 户的重复提交。
17.7 小结 在本章中,以Hibernate Jpetstore为基础介绍了 综合使用Struts、Spring、hibernate进行电子商 务网站开发的基本方法。在这个示例项目中,不 仅综合使用了这三种技术,而且还使用了其他的 技术,在这个章节中仅仅是通过这个示例程序说 明开发电子商务应用系统的基本方法,读者可以 通过这个项目仔细揣摩,也可以到Hibernate Jpetstore项目的官方网站 https://hjpetstore.dev.java.net/查看关于这 个项目更多的信息。