2.3.3 基于Controller接口的控制器

分发请求 DispatcherServlet

DispatcherServletSpring当中充当一个前端控制器的角色,它的核心功能是分发请求

处理请求 Handle

请求会被分发给对应处理的Java类, Spring MVC中称为Handle

如何开发一个Handle

Spring2.5以前,开发一个Handle的唯一方法是实现org.springframework.webservlet.mvv.Controller接口。

实现Controller接口的handleRequest方法

Controller接口必须实现一个方法,该方法的签名如下

1
ModelAndView handleRequest(HttpServletRequest request,HttpResponse response) throws Exception

Controller接口的实现类可以通过handleRequest方法传递的参数访问对应请求的HttpServletRequestHttpServletRespose对象,处理完业务请求之后,必须返回一个包含模型对象和视图路径的ModelAndview对象。

只能处理单一请求动作

提示:Controlller接口的实现类只能处理一个单一请求动作,而Spring2.5之后新增的基于注解的控制器可以支持同时处理多个请求动作,并且无须实现任何接口,其更加灵活。之后会详细介绍.
接下来我们演示一个基于Controller接口的Spring MVC控制器的Web应用,以便展示Spring MVC是如何工作的.

2.3.2 Spring MVC的DispatcherServlet

DispatcherServlet

在许多的MVC框架中,都包含一个用于调度控制的Servlet
Spring MVC也提供了个名为org.springframework.web.servlet.DispatcherServletServlet充当前端控制器,所有的请求驱动都围绕这个DispatcherServlet来分派请求

DispatcherServlet配置

DispatcherServlet是一个Servlet(它继承自HttpServlet基类),因此使用时需要把它配置在Web应用的部署描述符web.xml文件当中,配置信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 定义Spring MVC的前端控制器 -->
<servlet>
<!-- 默认查找的是:/WEB-INF/springmvc-servlet.xml -->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 通过 init-param元素 指定配置文件的路径 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 让Spring MVC的前端控制器拦截所有请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

以上是标准Java EE Servlet的配置。配置了一个DispatcherServlet,该ServletWeb应用程序启动时立即加载,

指定Spring MVC配置文件的路径

通过 servlet-name元素 指定配置文件的路径

DispatcherServlet加载时会需要一个Spring MVC的配置文件,默认情况下,应用会去应用程序文件夹下的WEB-INF文件夹下査找对应的[servlet-name]-servlet.xml文件,例如,本例的servlet-name元素的值是springmvc,则默认查找的就是/WEB-INF/springmvc-servlet.xml这个文件。

通过 init-param元素 指定配置文件的路径

可以把Spring MVC的配置文件放到应用程序文件夹中的任何地方,用servlet元素的init-param子元素进行描述,

  • 本例的param-name元素的值contextConfigLocation表示参数名称,
  • param-value元素的值/WEB-INF/springmvc-config.xml则表示Spring MVC的配置文件路径和名称。

Dispatcher Servlet会查找/WEB-INF/springmvc-config.xml文件,作为Spring MVC的配置文件,

Spring MVC配置文件的解析

解析Spring MVC配置文件的内容并根据文件配置信息创建一个WebApplicationContext容器对象,也称为上下文环境。 WebApplicationContext继承自ApplicationContext容器。它的初始化方式和BeanFactoryApplicationContext有所区别,因为WebApplicationContext需要ServletContext实例,也就是说,它必须在拥有Web容器的前提下才能完成启动Spring Web应用上下文的工作。有了WebApplicationContext容器,开发者就可以很自然地使用SpringIOCAOP等其他功能了.

2.3.1Spring的下载和安装

Spring是一个独立的框架,它不需要依赖于任何Web服务器或容器。它既可在独立的Java SE项目中使用,也可以在Java Web项目中使用。下面首先介绍如何为Java项目和Java Web项目添加Spring支持。
下载和安装Spring框架可按如下步骤进行:

进入Spring框架版本列表

打开https://repo.spring.io/libs-release-local/org/springframework/spring/即可看到Spring框架各版本的压缩包的下载链接。

进入最新版本列表

点击最下面的列表项,下载Spring目前的最新稳定版。

下载dist.zip压缩包

点击spring-framework-5.1.6.RELEASE-dist.zip下载dist.zip文件
下载完成,得到一个spring-framework-5.0.1.RELEASE-dist.zip压缩文件,

解压

解压该压缩文件得到一个名为spring-framework-5.0.1.RELEASE的文件夹,

目录结构

该文件夹下有几个目录如下所示:

1
2
3
4
5
6
7
G:\Desktop\书籍\JavaEE\jar\spring-framework-5.1.6.RELEASE
├─docs\
├─libs\
├─license.txt
├─notice.txt
├─readme.txt
└─schema\

目录说明

  • docs。该文件夹下存放Spring的相关文档,包含开发指南、API参考文档。
  • libs。该文件夹下的jar分为三类:
    • Spring框架class文件的jar包,文件名以RELEASE.jar结尾
    • Spring框架源文件的压缩包,文件名以RELEASE-source.jar结尾;
    • Spring框架API文档的压缩包,文件名以RELEASE-javadoc.jar结尾。
  • schemas。该文件夹下包含了Spring各种配置文件的XMLSchema文档。
  • 以及readme.txtnotice.txtlicense.txt等说明性文档。

添加Spring的jar包到类加载路径

libs文件夹下所需模块的class文件的jar包复制添加到项目的类加载路径中,既可通过添加环境变量的方式来添加,也可使用AntIDE工具来管理应用程序的类加载路径。如果需要发布该应用,则将这些jar包一同发布即可。如果没有太多要求,建议将libs文件夹下以RELEASE.jar结尾的jar包添加进去

下载添加common-logging的jar包到类加载路径

除此之外,Spring的核心容器必须依赖于common-loggingjar包,因此还应该下载最新的commons-logging工具,下载完成得到一个commons-logging-1.2-bin.zip压缩文件,将该文件解压路径下的commons-logging-1.2.jar也添加到项目的类加载路径中。
完成上面4个步骤后,接下来即可在JavaWeb应用中使用SpringMVC框架了。

2.2 Struts 2和Spring MVC

Spring框架提供了构建Web应用程序的全功能MVC模块:Spring MVC。**Spring MVC框架提供了一个DispatcherServlet作为前端控制器来分派请求**,同时提供灵活的配置处理程序映射、视图解析、语言环境和主题解析功能,并支持文件上传。SpringMVC还包含多种视图技术,例如Java Server Pages(JSP)VelocityTilesiTextPOI等。 Spring MVC分离了控制器模型对象分派器以及处理程序对象的角色,这种分离让它们更容易定制。

2.2.1 Spring MVC的优势

Spring MVC特点

Spring MVC具有如下特点

  1. Spring MVC拥有强大的灵活性、非侵入性和可配置性
  2. Spring MVC提供了一个前端控制器DispatcherServlet,开发者无须额外开发控制器对象
  3. Spring MVC分工明确,包括控制器验证器命令对象模型对象处理程序映射视图解析器,等等,每一个功能实现由一个专门的对象负责完成。
  4. Spring MVC可以自动绑定用户输入,并正确地转换数据类型。例如, Spring MVC能自动解析字符串,并将其设置为模型的intfloat类型的属性。
  5. Spring MVC使用一个名称/值Map对象实现更加灵活的模型数据传输。
  6. Spring MVC内置了常见的校验器,可以校验用户输入,如果校验不通过,则重定向回输入表单。输入校验是可选的,并且支持编程方式及声明方式。
  7. Spring MVC支持国际化,支持根据用户区域显示多国语言,并且国际化的配置非常简单.
  8. Spring MVC支持多种视图技术,最常见的有JSP技术以及其他技术,包括VelocityFreeMarker
  9. Spring提供了一个简单而强大的JSP标签库,支持数据绑定功能,使得编写JSP页面更加容易

2.2.2 Spring MVC和Struts 2的区别

入口不同

从机制上来说, Spring MVC的入口是Servlet,而Struts 2的入口是filter,这样就导致了二者的机制不同。

性能不同

  • 从性能上来说,
    • Struts 2基于类的设计,每发一次请求都会创建一个Action实例,每个Action都会被注入属性;
    • Spring MVC基于方法的设计,粒度更细,一个方法对应一个request上下文,而方法同时又跟一个URL对应,从架构本身上Spring MVC就非常容易实现RESTful URL,而Struts 2的架构实现起来相对麻烦,因为Struts 2Action的一个方法可以对应一个URL,但是类属性却被所有方法共享,这也就无法用注解或其他方式标识属性所属的方法。由于Struts 2需要针对每个request进行封装,把requestsessionServlet生命周期的变量封装成一个一个的Map,提供给每个Action使用,并保证线程安全,所以在原则上, **Struts 2是比较耗费内存的,所以Spring MVC在性能上高于Struts 2**。

参数传递机制不同

  • 从参数上来说,
    • Spring MVC的方法之间基本上是独立的,独享工requestresponse数据,请求数据通过参数获取,处理结果通过Model交回给框架,方法之间不共量;
    • Struts 2虽然方法之间也是独立的,但其所有Action变量是共享的,每次来了请求就创建一个Action,一个Action对象对应一个request上下文.

设计思想不同

  • 从设计思想上来说, Strut s2使用的是拦截器(Interceptor)机制,而Spring MVC使用的是独立的AOP方式,这样导致**Struts 2的配置文件量还是比Spring MVC大,Spring MVC的使用更加简洁**。

数据验证方法不同

  • 从数据验证上来说, Spring MVC的验证功能是一个亮点,支持JSR303,处理Ajax的请求更是方便,只需一个注解@ResponseBody,然后直接返回响应文本即可,而Struts2的验证则比较烦琐。

配置上的不同

  • 从配置上来说,在实际项目开发中使用Struts 2时大多采用传统的配置文件的方式, Spring MVC除了配置springmvc-servlet.xml文件之外,已经是100%的零配置开发,所以在开发效率上高于Struts2

2.1 MVC思想概述

2.1.1 传统Model1和 Model2

Java Web应用的结构经历了Model1Model2两个时代,从Model1发展到Model2既是技术发展的必然,也是无数程序员的心血结晶。

Model1

Model1模式下,整个Web应用几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做岀响应。用少量的JavaBean来处理数据库连接、数据库访问等操作

适用于小规模快速开发

Model1模式的实现比较简单,适用于快速开发小规模项目。但从工程化的角度看它的局限性非常明显:JSP页面身兼ViewController两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展和维护的难度.
早期由大量JSP页面所开发出来的Web应用,大都采用了Model1架构。实际上,早期绝大部分ASP应用也属于这种Model1架构。

Model2

Model2是基于MVC架构的设计模式。在Model2架构中,

  • Servlet作为前端控制器,负责接收客户端发送的请求。在Servlet中只包含控制逻辑和简单的前端处理;
  • 然后,调用后端JavaBean来完成实际的逻辑处理;
  • 最后,将其转发到相应的JSP页面来处理显示逻辑。

其具体的实现方式如图2.1所示。
这里有一张图片
正如在图2.1中看到的,Model2下的JSP不再承担控制器的责任,它仅仅是表现层角色,仅仅用于将结果呈现给用户。JSP页面的请求与Servlet(控制器)交互,而Servlet负责与后台的JavaBean通信。在Model2模式下,

  • 模型(Model)由JavaBean充当,
  • 视图(View)由JSP页面充当,
  • 而控制器(Controller)则由Servlet充当。

适用于大规模应用开发

由于引入了MVC模式,使得Model2具有组件化的特点,从而更适用于大规模应用的开发,但也增加了应用开发的复杂程度。原本需要一个简单的JSP页面就能实现的应用,在Model2中被分解成多个协同工作的部分,程序员需要花更多时间才能真正掌握其设计和实现过程。

适用情况

Model2MVC设计思想下的架构。下面简要介绍MVC设计思想的优势。
提示:对于非常小型的Web站点,如果后期的更新、维护工作不是特别多,则可以使用Model1模式来开发应用,而不是Model2模式。虽然Model2提供了更好的可扩展性及可维护性,但其增加了前期开发成本。从某种程度上讲,Model2为了降低系统后期维护的复杂度,而导致前期开发的高复杂度

2.1.2 MVC思想及其优势

MVC并不是Java语言所特有的设计思想,也并不是Web应用所特有的思想,它是所有面向对象程序设计语言都应该遵守的规范。

MVC三部分

MVC思想将一个应用分成三个基本部分:

  1. Model(模型)、
  2. View(视图)
  3. Controller(控制器)

这三个部分以最少的耦合协同工作,从而提高应用的可扩展性及可维护性。
在经典的MvC模式中,事件由控制器处理,控制器根据事件的类型改变模型或视图。具体地说,每个模型对应一系列的视图列表,这种对应关系通常采用注册来完成,即把多个视图注册到同一个模型,当模型发生改变时,模型向所有注册过的视图发送通知,接下来,视图从对应的模型中获得信息,然后完成视图显示的更新
从设计模式的角度来看,MVC思想非常类似于观察者模式,但其与观察者模式存在少许差别:
在观察者模式下,观察者和被观察者可以是两个互相对等的对象;但在MVC中,被观察者往往只是单纯的数据体,而观察者则是单纯的视图页面

MVC特点

概括起来,MVC有如下特点:
多个视图可以对应一个模型。按MVC设计模式,一个模型对应多个视图,可以减少代码的复制及代码的维护量,这样,一旦模型发生改变,也易于维护。
模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,例如,使用JSP页面、 Velocity模板或者直接产生Excel文档等。

应用被分隔为三层,这降低了各层之间的耦合,提供了应用的可扩展性
控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起,完成不同的请求。因此,控制层可以说包含了用户请求权限的概念。
MVC更符合软件工程化管理的精神。不同的层各司其职,同一层的组件具有相同的特征,这有利于通过工程化和工具化的方法产生管理程序代码。

Web模式下的MVC

相对于早期的MVC思想,Web模式下的MVC思想则又存在一些变化。

  • 对于一个普通应用程序,可以将视图注册给模型,当模型数据发生改变时,即时通知视图页面发生了改变;
  • 对于Web应用,即使将多个JSP页面注册给一个模型,但当模型发生变化时,模型也无法主动给JSP页面发送消息,这是因为web应用都是基于请求/响应模式的,只有当用户请求浏览该页面时,控制器才负责调用模型数据来更新JSP页面

图2.2显示了遵循MVC模式的Java Web的运行流程:
这里有一张图片
MVC思想与观察者模式有一定的相似之处,但并不完全相同。经典的MVC思想与Web应用的MVC思想也存在一定的差别,引起差别的主要原因是因为Web应用是一种请求/响应模式下的应用,对于请求/响应应用,如果用户不对应用发出请求,视图将无法主动更新自己。

1.3 本章小结

本章主要介绍了Java EE应用的相关基础知识,其中,简要介绍了Java EE应用应该遵循怎样的架构模型,通常应该具有哪些组件,以及这些组件通常使用什么样的技术来实现。本章还简单归纳了Java EE应用所具有的优势和吸引力。
本书使用的是Apache Tomcat Web服务器,使用的开发工具是Eclipse。关于Tomcat的安装和Eclipse工具的具体用法,请参考”疯狂Java系列”之《轻量级Java EE企业应用实战》,这里不做讨论。
第2章将重点介绍Spring MVC

1.2 轻量级Java EE应用相关技术

轻量级Java EE应用以传统的JSP作为表现层技术,以一系列开源框架作为MVC层中间层持久层解决方案,并将这些开源框架有机地组合在一起,使得Java EE应用具有高度的可扩展性可维护性

1.2.1 JSP,Servlet和JavaBean及替代技术

JSP

JSP是最早的Java EE规范之一,也是最经典的Java EE技术之一。直到今天,JSP依然广泛地应用于各种Java EE应用中,充当Java EE应用的表现层角色。
JSP具有简单、易用的特点,JSP的学习路线平坦,而且国内有大量JSP学习资料,所以大部分Java学习者学习Java EE开发都会选择从JSP开始。

Servlet

ServletJSP其实是完全统一的,二者底层的运行原理是完全一样的。实际上,**JSP必须被Web服务器编译成Servlet,真正在Web服务器内运行的是Servlet** 。从这个意义上来看,JSP相当于一个”草稿”文件,Web服务器根据该”草稿”文件生成Servlet,真正提供HTTP服务的是Servlet,因此广义的Servlet包含了JSPServlet
从目前的Java EE应用来看,纯粹的Servlet已经很少使用了,毕竟Servlet的开发成本太高,而且使用Servlet充当表现层将导致表现层页面难以维护,不利于美工人员参与Servlet开发,所以在实际开发中大都使用JSP充当表现层技术
Servlet3.x规范的出现,再次为Java Web开发带来了巨大的便捷。 Servlet3.x提供了异步请求注解、**增强的Servlet API非阻塞I/O**等功能,这些功能都极大地简化了Java Web开发。

JavaBean

由于JSP只负责简单的显示逻辑,因此JSP无法直接访问应用的底层状态,Java EE应用会选择使用JavaBean来传输数据

数据传输对象 DTO

在严格的Java EE应用中,中间层的组件会将应用底层的状态信息封装成JavaBean集,这些JavaBean也被称为DTO(Data Transfer Object,数据传输对象),并将这些DTO集传到JSP页面,从而让JSP可以显示应用的底层状态

其他表现层技术

在目前阶段, Java EE应用除了可以使用JSP作为表现层技术之外,还可以使用FreeMarkerVelocity作为表现层技术,这些表现层技术更加纯粹,使用起来更加便捷,完全可作为JSP的替代。

1.2.2 MyBatis3及替代技术

ORM

传统的Java应用都是采用JDBC来访问数据库的,但传统的JDBC采用的是一种基于SQL的操作方式,这种操作方式与Java语言的面向对象特性不太一致,所以Java EE应用需要一种技术,通过这种技术能Java以面向对象的方式操作关系数据库
这种特殊的技术就是ORM(Object Relation Mapping),最早的ORMEntity EJB( Enterprise JavaBean),EJB就是经典Java EE应用的核心,从EJB1.0EJB2.x,许多人会觉得EJB非常烦琐,所以导致EJB备受诟病。

Hibernate

在这种背景下, Hibernate框架应运而生。 Hibernate框架是一种开源的、轻量级的ORM框架,它允许将普通的、传统的Java对象(POJO)映射成持久化类,允许应用程序以面向对象的方式来操作POJO,而Hibernate框架则负责将这种操作转换成底层的SQL操作

Hibernate缺点

大多数情况下(特别是对新项目、新系统的开发而言), Hibernate这样的机制无往不利,大有一统天下的势头。但是,在一些特定的环境下, Hibernate这种一站式的解决方案却未必适合。如:

  • 系统的部分或全部数据来自现有数据库,出于安全考虑,只对开发团队提供几条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开
  • 开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现(就金融行业而言,工商银行、中国银行、交通银行等商业银行都曾在开发规范中严格指定)
  • 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。

MyBatis

面对这样的需求, Hibernate不再适合,甚至无法使用。此时,直接使用JDBC进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码、乏味的字段读取操作令人厌烦,而“半自动化”的MyBatis,却正好解决了这个问题。

半自动化ORM

这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言的,“全自动”ORM实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行。
MyBatis的着力点,则在于POJOSQL之间的映射关系。也就是说,使用MyBatis提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象,这与通过Hibernate实现ORM基本一致,而对于具体的数据操作,Hibernate会自动生成SQL语句,但MyBatis则并不会自动生成SQL语句。具体的SQL需要程序员编写,然后通过映射配置文件,将SQL所需的参数以及返回的结果字段映射到指定的POJO
相对Hibernate等“全自动”ORM机制而言, MyBatisSQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。作为对“全自动”ORM实现的种有益补充, MyBatis的存在具有特别的意义。
MyBatisApache组织提供的一个轻量级持久层框架,是一个支持普通SQL查询存储过程高级映射的优秀持久层框架。 MyBatis消除了几乎所有的JDBC代码和参数的手工设置过程以及对结果集的检索封装。 MyBatis可以使用简单的XML注解来进行配置和原始映射,将接口和JavaPOJO映射成数据库中的记录。

剥离SQL

MyBatis作为持久层框架,其主要思想是将程序中的大量SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置。这样做的好处是将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改SQL
除此之外, OracleTopLinkApacheOJB都可作为替代方案。但由于种种原因,它们并未得到广泛的市场支持,所以这两个框架的资料、文档相对比较少,选择它们需要一定的勇气和技术功底。

1.2.3 Spring5及替代技术

如果你有5年以上的Java EE开发经验,并主持过一些大型项目的设计,你会发现Spring框架似曾相识。 Spring甚至没有太多的新东西,它只是抽象了大量Java EE应用中的常用代码,将它们抽象成一个框架。通过使用Spring可以大幅度地提高开发效率并可以保证整个应用具有良好的设设计。

Spring使用的设计模式

Spring框架里充满了各种设计模式的应用,如单例模式工厂模式抽象工厂模式命令模式职责链模式代理模式等,Spring框架的用法、源码则更是一道丰盛的Java大餐。

Spring优点

完美整合SpringMVC

Spring框架号称Java EE应用的一站式解决方案, Spring本身提供了一个设计优良的MVC框架:Spring MVC。使用Spring框架可以直接使用该MVC框架。由于Spring框架拥有极高的市场占有率,因此越来越多的Spring框架的使用者使用Spring MVC替代曾经的MVC框架的王者Struts2

可以整合其他MVC框架

当然, Spring也可以无缝地整合Struts2JSF等优秀的MVC框架。
Spring框架并未提供完整的持久层框架,Spring能与大部分持久层框架无缝整合MyBatisHibernateJPATopLink,更甚至直接使用JDBC,随便你喜欢,无论选择哪种持久层框架, Sping都会为你提供无缝的整合和极好的简化。

中间容器 承上启下

从这个意义上来看, Spring更像一种中间层容器, Spring向上可以与MVC框架无缝整合,向下可以与各种持久层框架无缝整合,其的确具有强大的生命力。由于Spring框架的特殊地位,轻量级Java EE应用通常都不会拒绝使用Spring。实际上,轻量级Java EE这个概念也是由Spring框架衍生出来的。 Spring框架暂时没有较好的替代框架。

1.2.4 使用开源框架的好处

以上提到的Struts2MyBatis3Hibernate5Spring5等都是Java领域最常见的框架,这些框架得到开发者广泛的支持,它们能极大地提高Java EE应用的开发效率,并能保证应用具有稳定的性能。
今天, Spring MVC+MyBatis已成为电商项目架构的最佳搭配。本书将重点讲解含越来越多的企业开始选择Spring MVC+MyBatis来构建系统架构,本书将重点讲解Spring MVC+ MyBatis如何无缝整合开发Java EE项目。

为什么需要使用框架

真实的企业应用开发有两个重要的关注点:可维护性复用

可维护性

先从软件的可维护性来考虑这种说法。全部采用JSPServlet的应用,因为分层不够清晰,业务逻辑的实现没有单独分离出来,从而造成系统后期维护困难

软件复用

从软件复用角度来考虑。这是一个企业开发的生命,企业以追求利润为最大目标企业希望以最快的速度,开发出最稳定、最实用的软件。因为系统没有使用任何框架每次开发系统都需要重新开发,重新开发的代码具有更多的漏洞,这就增加了系统出错的风险;另外,每次开发新代码都需要投入更多的人力和物力
以笔者多年的实际开发经验来看,每个公司都会有自己的基础类库,这就是软件的复用,这些基础类库将在后续开发中多次被重复使用。例如,信息化系统,其中总有一些开发过程是重复的,为什么不将这些重复开发工作抽象成基础类库呢?这种抽象既提高了开发效率,而且因为重复使用,也降低了引入错误的风险。

使用框架无法避免

因此只要是一个有实际开发经验的软件公司,就一定有自己的一套基础类库,这就是需要使用框架的原因。从某个角度来看,框架也是一套基础类库,它抽象了软件开发的通用步骤,让实际开发人员可以直接利用这部分实现。当然,即使使用JSPServlet开发的公司,也可以抽象出自己的一套基础类库,那么这也是框架!一个从事实际开发的软件公司,不管它是否意识到,它已经在使用框架。区别只有:使用的框架到底是别人提供的,还是自己抽象出来的。

第三方框架更好

到底是使用第三方提供的框架更好,还是使用自己抽象的框架更好?这个问题就见仁见智了。通常而言,第三方提供的框架更稳定,更有保证,因为第三方提供的框架往往经过了更多人的测试。而使用自己抽象的框架,则更加熟悉底层运行原理,在处理问题上更有方向性。如果不是有非常特殊的理由,还是推荐使用第三方框架,特别是那些流行的、广泛使用的、开源的框架

12.2 准备所需的jar包

项目结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
G:\Desktop\随书源码\Spring+Mybatis企业应用实战(第2版)\codes\12\fkbookapp
├─mybatis.sql
├─src\
│ ├─db.properties
│ ├─log4j.xml
│ └─org\
│ └─fkit\
│ ├─controller\
│ │ ├─BookController.java
│ │ ├─FormController.java
│ │ └─UserController.java
│ ├─domain\
│ │ ├─Book.java
│ │ └─User.java
│ ├─mapper\
│ │ ├─BookMapper.java
│ │ └─UserMapper.java
│ └─service\
│ ├─BookService.java
│ ├─impl\
│ │ ├─BookServiceImpl.java
│ │ └─UserServiceImpl.java
│ └─UserService.java
└─WebContent\
├─images\
│ ├─ajax.jpg
│ ├─android.jpg
│ ├─basic.jpg
│ ├─ee.jpg
│ ├─fkjava.jpg
│ ├─framework.jpg
│ ├─java.jpg
│ ├─javaee.jpg
│ ├─struts.jpg
│ └─xml.jpg
├─META-INF\
│ └─MANIFEST.MF
└─WEB-INF\
├─applicationContext.xml
├─content\
│ ├─loginForm.jsp
│ └─main.jsp
├─lib\
│ ├─ant-1.9.6.jar
│ ├─ant-launcher-1.9.6.jar
│ ├─asm-5.2.jar
│ ├─aspectjrt.jar
│ ├─aspectjtools.jar
│ ├─aspectjweaver.jar
│ ├─c3p0-0.9.5.2.jar
│ ├─cglib-3.2.5.jar
│ ├─commons-logging-1.2.jar
│ ├─hibernate-c3p0-5.2.10.Final.jar
│ ├─javassist-3.22.0-CR2.jar
│ ├─javax.servlet.jsp.jstl-1.2.1.jar
│ ├─javax.servlet.jsp.jstl-api-1.2.1.jar
│ ├─log4j-1.2.17.jar
│ ├─log4j-api-2.3.jar
│ ├─log4j-core-2.3.jar
│ ├─mchange-commons-java-0.2.11.jar
│ ├─mybatis-3.4.5.jar
│ ├─mybatis-spring-1.3.1.jar
│ ├─mysql-connector-java-5.1.44-bin.jar
│ ├─ognl-3.1.15.jar
│ ├─org.aspectj.matcher.jar
│ ├─slf4j-api-1.7.25.jar
│ ├─slf4j-log4j12-1.7.25.jar
│ ├─spring-aop-5.0.1.RELEASE.jar
│ ├─spring-aspects-5.0.1.RELEASE.jar
│ ├─spring-beans-5.0.1.RELEASE.jar
│ ├─spring-context-5.0.1.RELEASE.jar
│ ├─spring-context-indexer-5.0.1.RELEASE.jar
│ ├─spring-context-support-5.0.1.RELEASE.jar
│ ├─spring-core-5.0.1.RELEASE.jar
│ ├─spring-expression-5.0.1.RELEASE.jar
│ ├─spring-instrument-5.0.1.RELEASE.jar
│ ├─spring-jcl-5.0.1.RELEASE.jar
│ ├─spring-jdbc-5.0.1.RELEASE.jar
│ ├─spring-jms-5.0.1.RELEASE.jar
│ ├─spring-messaging-5.0.1.RELEASE.jar
│ ├─spring-orm-5.0.1.RELEASE.jar
│ ├─spring-oxm-5.0.1.RELEASE.jar
│ ├─spring-test-5.0.1.RELEASE.jar
│ ├─spring-tx-5.0.1.RELEASE.jar
│ ├─spring-web-5.0.1.RELEASE.jar
│ ├─spring-webflux-5.0.1.RELEASE.jar
│ ├─spring-webmvc-5.0.1.RELEASE.jar
│ └─spring-websocket-5.0.1.RELEASE.jar
├─springmvc-config.xml
└─web.xml

Spring框架的jar包

进入这个地址下载Spring5jar包。spring-framework-5.0.1.RELEASE文件夹下libs目录下所有模块class文件的jar包和Spring的核心容器必须依赖的common-loggingjar包(本书示例是commons-logging-1.2.jar),共22个。至于下载Spring的细节请看这篇文章

MyBatis框架jar包

mybatis-3.4.5.jarmybatis-3.4.5文件夹下的lib目录下所有jar包,共13个。

MyBatis整合Spring中间件jar包

MyBatis整合Spring中间件jar包。根据MyBatis官方的说法,在MyBatis3问世之前, Spring3的开发工作就已经完成了,所以Spring3中没有提供对MyBatis3的支持 。因此由MyBatis社区自己开发了一个MyBatis-Spring中间件用来满足MyBatis用户整合Spring的需求,该中间件有如下两个作用:

  1. Spring中配置MyBatis工厂类。
  2. DAO层使用Spring注入的工具Bean对数据进行操作。

本书成书时该中间件最高版本是mybatis-spring-1.3.1.jar

Aspectj框架的jar包

AspectJ安装目录下的lib目录下的jar包:
aspectjrt.jaraspectjtools.jar,aspectjweaver.jar,org.aspectj.matcher.jar
本书成书时aspectJ框架最高版本是aspectj-1.8.13

数据库驱动jar包

本书成书时最高版本是mysql-connector-java-5.1.44.jar
下载路径,或者GitHub

数据源C3P0所需jar包

本书成书时C3P0最高版本是c3p0-0.9.5.2.jarhibernate-c3p0-5.2.10.Final.jarmchange-commons-java-0.2.11.jar,C3P0下载路径

JSTL标签库jar包

javax.servlet.jsp.jstl-1.2.1.jarjavax.servlet.jsp.jstl-api-1.2.1.jar