1.2 轻量级Java EE应用相关技术
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
Servlet
和JSP
其实是完全统一的,二者底层的运行原理是完全一样的。实际上,**JSP
必须被Web
服务器编译成Servlet
,真正在Web
服务器内运行的是Servlet
** 。从这个意义上来看,JSP
相当于一个”草稿”文件,Web
服务器根据该”草稿”文件生成Servlet
,真正提供HTTP
服务的是Servlet
,因此广义的Servlet
包含了JSP
和Servlet
。
从目前的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
作为表现层技术之外,还可以使用FreeMarker
或Velocity
作为表现层技术,这些表现层技术更加纯粹,使用起来更加便捷,完全可作为JSP
的替代。
1.2.2 MyBatis3及替代技术
ORM
传统的Java
应用都是采用JDBC
来访问数据库的,但传统的JDBC
采用的是一种基于SQL
的操作方式,这种操作方式与Java
语言的面向对象特性不太一致,所以Java EE
应用需要一种技术,通过这种技术能让Java
以面向对象的方式操作关系数据库。
这种特殊的技术就是ORM(Object Relation Mapping)
,最早的ORM
是Entity EJB( Enterprise JavaBean)
,EJB
就是经典Java EE
应用的核心,从EJB1.0
到EJB2.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
的着力点,则在于POJO
与SQL
之间的映射关系。也就是说,使用MyBatis
提供的ORM
机制,对业务逻辑
实现人员而言,面对的是纯粹的Java
对象,这与通过Hibernate
实现ORM
基本一致,而对于具体的数据操作,Hibernate
会自动生成SQL
语句,但MyBatis
则并不会自动生成SQL
语句。具体的SQL
需要程序员编写,然后通过映射配置文件,将SQL
所需的参数以及返回的结果字段映射到指定的POJO
。
相对Hibernate
等“全自动”ORM
机制而言, MyBatis
以SQL
开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。作为对“全自动”ORM
实现的种有益补充, MyBatis
的存在具有特别的意义。MyBatis
是Apache
组织提供的一个轻量级持久层框架,是一个支持普通SQL
查询、存储过程和高级映射的优秀持久层框架。 MyBatis
消除了几乎所有的JDBC
代码和参数的手工设置过程以及对结果集的检索封装。 MyBatis
可以使用简单的XML
或注解
来进行配置和原始映射,将接口和Java
的POJO
映射成数据库中的记录。
剥离SQL
MyBatis
作为持久层框架,其主要思想是将程序中的大量SQL
语句剥离出来,配置在配置文件中,实现SQL
的灵活配置。这样做的好处是将SQL
与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改SQL
。
除此之外, Oracle
的TopLink
、 Apache
的OJB
都可作为替代方案。但由于种种原因,它们并未得到广泛的市场支持,所以这两个框架的资料、文档相对比较少,选择它们需要一定的勇气和技术功底。
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
也可以无缝地整合Struts2
、JSF
等优秀的MVC
框架。Spring
框架并未提供完整的持久层框架,Spring
能与大部分持久层框架无缝整合MyBatis
、 Hibernate
、JPA
、 TopLink
,更甚至直接使用JDBC
,随便你喜欢,无论选择哪种持久层框架, Sping
都会为你提供无缝的整合和极好的简化。
中间容器 承上启下
从这个意义上来看, Spring
更像一种中间层容器, Spring
向上可以与MVC
框架无缝整合,向下可以与各种持久层框架无缝整合,其的确具有强大的生命力。由于Spring
框架的特殊地位,轻量级Java EE
应用通常都不会拒绝使用Spring
。实际上,轻量级Java EE
这个概念也是由Spring
框架衍生出来的。 Spring
框架暂时没有较好的替代框架。
1.2.4 使用开源框架的好处
以上提到的Struts2
、 MyBatis3
、 Hibernate5
、 Spring5
等都是Java
领域最常见的框架,这些框架得到开发者广泛的支持,它们能极大地提高Java EE
应用的开发效率,并能保证应用具有稳定的性能。
今天, Spring MVC+MyBatis
已成为电商项目架构的最佳搭配。本书将重点讲解含越来越多的企业开始选择Spring MVC+MyBatis
来构建系统架构,本书将重点讲解Spring MVC+ MyBatis
如何无缝整合开发Java EE
项目。
为什么需要使用框架
真实的企业应用开发有两个重要的关注点:可维护性
和复用
可维护性
先从软件的可维护性来考虑这种说法。全部采用JSP
和Servlet
的应用,因为分层不够清晰,业务逻辑的实现没有单独分离出来,从而造成系统后期维护困难。
软件复用
从软件复用角度来考虑。这是一个企业开发的生命,企业以追求利润为最大目标企业希望以最快的速度,开发出最稳定、最实用的软件。因为系统没有使用任何框架每次开发系统都需要重新开发,重新开发的代码具有更多的漏洞,这就增加了系统出错的风险;另外,每次开发新代码都需要投入更多的人力和物力。
以笔者多年的实际开发经验来看,每个公司都会有自己的基础类库,这就是软件的复用,这些基础类库将在后续开发中多次被重复使用。例如,信息化系统,其中总有一些开发过程是重复的,为什么不将这些重复开发工作抽象成基础类库呢?这种抽象既提高了开发效率,而且因为重复使用,也降低了引入错误的风险。
使用框架无法避免
因此只要是一个有实际开发经验的软件公司,就一定有自己的一套基础类库,这就是需要使用框架的原因。从某个角度来看,框架也是一套基础类库,它抽象了软件开发的通用步骤,让实际开发人员可以直接利用这部分实现。当然,即使使用JSP
和Servlet
开发的公司,也可以抽象出自己的一套基础类库,那么这也是框架!一个从事实际开发的软件公司,不管它是否意识到,它已经在使用框架。区别只有:使用的框架到底是别人提供的,还是自己抽象出来的。
第三方框架更好
到底是使用第三方提供的框架更好,还是使用自己抽象的框架更好?这个问题就见仁见智了。通常而言,第三方提供的框架更稳定,更有保证,因为第三方提供的框架往往经过了更多人的测试。而使用自己抽象的框架,则更加熟悉底层运行原理,在处理问题上更有方向性。如果不是有非常特殊的理由,还是推荐使用第三方框架,特别是那些流行的、广泛使用的、开源的框架。