JavaEE 轻量级常用框架原理

一 Hibernate

我们从三个角度理解一下Hibernate:

1 Hibernate是对JDBC进一步封装

   原来没有使用Hiberante做持久层开发时,存在很多冗余,如:各种JDBC语句,connection的管理,所以出现了Hibernate把JDBC封装了一下,我们不用操作数据,直接操作它就行了。

2 我们再从分层的角度来看

   我们知道非常典型的三层架构:表示层,业务层,还有持久层。Hiberante也是持久层的框架,而且持久层的框架还有很多,比如:IBatis,Nhibernate,JDO,OJB,EJB等等。

3 Hibernate是开源的一个ORM(对象关系映射)框架。

  ORM,即Object-Relational Mapping,它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。这样,我们在操作数据库的时候,不需要再去和复杂SQL打交道,只要像操作对象一样操作它就可以了(把关系数据库的字段在内存中映射成对象的属性)。

4 Hibernate的核心:

 从上图中,我们可以看出Hibernate六大核心接口,两个主要配置文件,以及他们直接的关系。Hibernate的所有内容都在这了。那我们从上到下简单的认识一下,每个接口进行一句话总结。
  • 1、Configuration接口:负责配置并启动Hibernate

  • 2、SessionFactory接口:负责初始化Hibernate

  • 3、Session接口:负责持久化对象的CRUD操作

  • 4、Transaction接口:负责事务

  • 5、Query接口和Criteria接口:负责执行各种数据库查询

    注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。
    

5 Hibernate的优/缺点:

优点:
  • 1)更加对象化

    以对象化的思维操作数据库,我们只需要操作对象就可以了,开发更加对象化。

  • 2)移植性

    因为Hibernate做了持久层的封装,你就不知道数据库,你写的所有的代码都具有可复用性。

  • 3)Hibernate是一个没有侵入性的框架,没有侵入性的框架我们称为轻量级框架。

    对比Struts的Action和ActionForm,都需要继承,离不开Struts。Hibernate不需要继承任何类,不需要实现任何接口。这样的对象叫POJO对象。

  • 4)Hibernate代码测试方便。

  • 5)提高效率,提高生产力。

缺点:
  • 1)使用数据库特性的语句,将很难调优

  • 2)对大批量数据更新存在问题

  • 3)系统中存在大量的攻击查询功能

二 Struts2

1 源码

https://github.com/apache/struts

2 详细步骤
  • 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
  • 2.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
  • 3.FilterDispatcher(现已过时)被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
  • 4.如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
  • 5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
  • 6 ActionProxy创建一个ActionInvocation的实例。
  • 7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
  • 8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。
3 简述:
一个请求经过层层过滤器以及核心控制器到达Action映射,Action映射进行路径检查后(读取web.xml文件看是否要被核心控制器处理)将请求转发给核心控制器,核心控制器再将请求转发给Action代理,它通过一个组件ConfigurationManager读取struts.xml中的配置信息,找到对应的Action,存放到ActionInvocation.请求继续经过一系列拦截器到达Action.Action返回逻辑视图名,指向一个View视图,解析视图,如果有标签还会加载标签,最后反向经过层层拦截器做出相应,浏览器渲染视图。

三 SpringMVC

1 SpringMVC框架介绍

  Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架。通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。
  Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。

2 SpringMVC原理图

3. SpringMVC接口解释

  • DispatcherServlet接口:

     Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
    
  • HandlerMapping接口:

     能够完成客户请求到Controller映射。
    
  • Controller接口:

        需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。
    
        Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。
    
        从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
    
  • ViewResolver接口:

         Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
    

4 SpringMVC运行原理

  • 1.客户端请求提交到DispatcherServlet
  • 2.由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
  • 3.DispatcherServlet将请求提交到Controller
  • 4.Controller调用业务逻辑处理后,返回ModelAndView
  • 5.DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
  • 6.视图负责将结果显示到客户端

5 DispatcherServlet

DispatcherServlet是整个Spring MVC的核心,它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:
  • 1.截获符合特定格式的URL请求。
  • 2.初始化DispatcherServlet上下文对应的WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
  • 3.初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。

四 hibernate VS mybatis

1. hibernate是全自动,而mybatis是半自动。

hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理。

2. hibernate数据库移植性远大于mybatis。

hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高。

3. hibernate拥有完整的日志系统,mybatis则欠缺一些。

hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;
而mybatis则除了基本记录功能外,功能薄弱很多。

4. mybatis相比hibernate需要关心很多细节

hibernate配置要比mybatis复杂的多,学习成本也比mybatis高。但也正因为mybatis使用简单,才导致它要比hibernate关心很多技术细节。

mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快。hibernate则正好与之相反。但是如果使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis。

5. sql直接优化上,mybatis要比hibernate方便很多

由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多。而hibernate的sql很多都是自动生成的,无法直接维护sql;

虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是有局限的;
hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便。
总之写sql的灵活度上hibernate不及mybatis。

总结:
mybatis:小巧、方便、高效、简单、直接、半自动
hibernate:强大、方便、高效、复杂、绕弯子、全自动

五 Struts2 VS SpringMVC

1 核心机制

    spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。

2 拦截机制

    Struts2是类级别的拦截, 一个类(Action)对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文;而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url;而struts2的架构实现起来要费劲;因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

3 获取请求的数据

SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量;Struts2虽然方法之间也是独立的,但其所有Action变量是共享的

4 返回响应的数据

Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

5 开发效率和使用性能

spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring mvc使用更加简洁,开发效率Spring MVC确实比struts2高。   

6 ajax集成

SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

7 验证支持

SpringMVC验证支持JSR303(*JSR 303 – Bean Validation 是一个数据验证的规范,将验证逻辑与相应的域模型进行绑定。在应用程序中,通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull, @Max, @ZipCode, 就可以确保数据模型(JavaBean)的正确性。constraint 可以附加到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint*),处理起来相对更加灵活方便,而Struts2验证比较繁琐。

8 设计思想(OOP)

Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

9 架构设计

9.1 设计实现
    从设计实现角度来说,我觉得SpringMVC更加清晰。即使我们去对比Struts2的原理图和SpringMVC的类图,它依然很让人困惑,远没有SpringMVC更加直观。
SpringMVC设计思路:将整个处理流程规范化,并把每一个处理步骤分派到不同的组件中进行处理。 这个方案实际上涉及到两个方面: 
  • 处理流程规范化 —— 将处理流程划分为若干个步骤(任务),并使用一条明确的逻辑主线将所有的步骤串联起来

  • 处理流程组件化 —— 将处理流程中的每一个步骤(任务)都定义为接口,并为每个接口赋予不同的实现模式

    处理流程规范化是目的,对于处理过程的步骤划分和流程定义则是手段。因而处理流程规范化的首要内容就是考虑一个通用的Servlet响应程序大致应该包含的逻辑步骤:

  • 步骤1:对Http请求进行初步处理,查找与之对应的Controller处理类(方法) ——HandlerMapping

  • 步骤2:调用相应的Controller处理类(方法)完成业务逻辑 ——HandlerAdapter

  • 步骤3:对Controller处理类(方法)调用时可能发生的异常进行处理 ——HandlerExceptionResolver

  • 步骤4:根据Controller处理类(方法)的调用结果,进行Http响应处理 ——ViewResolver

    正是这基于组件、接口的设计,支持了SpringMVC的另一个特性:行为的可扩展性。

9.2 设计原则更加明朗。
【Open for extension /closed for modification】 

这条重要的设计原则被写在了spring官方的reference中SpringMVC章节的起始段: 

A key design principle in SpringWeb MVC and in Spring in general is the “Open for extension, closed for modification” principle.
并且重点很好地体现在SpringMVC的实现当中,可以扩展,但却不能改变。我曾经扩展过Spring的IOC、AOP功能,这一点SpringMVC应该和Spring一脉相承。

9.3 组件化的设计方案和特定的设计原则让SpringMVC形散神聚。
  • 神 —— SpringMVC总是沿着一条固定的逻辑主线运行
  • 形 —— SpringMVC却拥有多种不同的行为模式

    SpringMVC是一个基于组件的开发框架,组件的不同实现体系构成了“形”;组件的逻辑串联构成了“神”。因此,“形散神不散”: SpringMVC的逻辑主线始终不变,而行为模式却可以多种多样。

10 和Spring集成

spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值