【SpringMVC从入门到实战教程】第一章 SpringMVC 概述

一、SpringMVC 概述

1.1 什么是MVC

    MVC 设计模式一般指 MVC 框架,M(Model)指模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。

    C:Controller,控制层,作用是接受请求和响应浏览器。在 Web 项目的开发中,能够及时、正确地响应用户的请求是非常重要的。用户在网页上单击一个 URL 路径,这对 Web 服务器来说,相当于用户发送了一个请求。而获取请求后如何解析用户的输入,并执行相关处理逻辑,最终跳转至正确的页面显示反馈结果,这些工作往往是控制层(Controller)来完成的。

    M:Model,模型层,作用是处理数据。泛指项目中的JavaBean。JavaBean分为两类:
        一类称为实体类Bean,专门存储业务数据的,比如在请求的过程中,用户的信息被封装在 User 实体类中,该实体类在 Web 项目中属于数据模型层(Model)。
        一类称为业务逻辑Bean,专门用来处理业务逻辑和数据访问,指的就是Service和Dao对象。

    V:View,视图层,作用是与用户进行交互,展示数据。在请求显示阶段,跳转的结果网页就属于视图层(View)。

    像这样,控制层负责前台与后台的交互,数据模型层封装用户的输入/输出数据,视图层选择恰当的视图来显示最终的执行结果,这样的层次分明的软件开发和处理流程被称为 MVC 模式。

    在学习 Servlet 及 JSP 开发时,JavaBean 相当于 Model,Servlet 相当于 Controller,JSP 相当于 View。

    总结如下:
        视图层(View):负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。
        控制层(Controller):负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端。
        模型层(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。

    SUN 公司推出 JSP 技术的同时,也推出了两种 Web 应用程序的开发模式。即 JSP+JavaBean 和 Servlet+JSP+JavaBean。

1.1.1 JSP+JavaBean

    JSP+JavaBean 中 JSP 用于处理用户请求,JavaBean 用于封装和处理数据。该模式只有视图和模型,一般把控制器的功能交给视图来实现,适合业务流程比较简单的 Web 程序。

    通过上图可以发现 JSP 从 HTTP Request(请求)中获得所需的数据,并进行业务逻辑的处理,然后将结果通过 HTTP Response(响应)返回给浏览器。从中可见,JSP+JavaBean 模式在一定程度上实现了 MVC,即 JSP 将控制层和视图合二为一,JavaBean 为模型层。

    JSP+JavaBean 模式中 JSP 身兼数职,既要负责视图层的数据显示,又要负责业务流程的控制,结构较为混乱,并且也不是我们所希望的松耦合架构模式,所以当业务流程复杂的时候并不推荐使用。

1.1.2 Servlet+JSP+JavaBean

    Servlet+JSP+JavaBean 中 Servlet 用于处理用户请求,JSP 用于数据显示,JavaBean 用于数据封装,适合复杂的 Web 程序。

    相比 JSP+JavaBean 模式来说,Servlet+JSP+JavaBean 模式将控制层单独划分出来负责业务流程的控制,接收请求,创建所需的 JavaBean 实例,并将处理后的数据返回视图层(JSP)进行界面数据展示。

    Servlet+JSP+JavaBean 模式的结构清晰,是一个松耦合架构模式,一般情况下,建议使用该模式。

1.1.3 MVC优缺点

    任何一件事都有利有弊,下面来了解一下 MVC 的优缺点。

优点:

  • 多视图共享一个模型,大大提高了代码的可重用性。

  • MVC 三个模块相互独立,松耦合架构。

  • 控制器提高了应用程序的灵活性和可配置性。

  • 有利于软件工程化管理。

    总之,我们通过 MVC 设计模式最终可以打造出一个松耦合+高可重用性+高可适用性的完美架构。

缺点:

  • 原理复杂。

  • 增加了系统结构和实现的复杂性。

  • 视图对模型数据的低效率访问。

    MVC并不适合小型甚至中型规模的项目,花费大量时间将 MVC 应用到规模并不是很大的应用程序,通常得不偿失,所以对于 MVC 设计模式的使用要根据具体的应用场景来决定。

1.2 什么是SpringMVC

    Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。

    Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。

    Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。Spring MVC 是当今业界最主流的 Web 开发框架,以及最热门的开发技能。

    在 Spring MVC 框架中,Controller 替代 Servlet 来担负控制器的职责,用于接收请求,调用相应的 Model 进行处理,处理器完成业务处理后返回处理结果。Controller 调用相应的 View 并对处理结果进行视图渲染,最终客户端得到响应信息。

    Spring MVC 框架采用松耦合可插拔的组件结构,具有高度可配置性,比起其它 MVC 框架更具有扩展性和灵活性。

    此外,Spring MVC 的注解驱动和对 REST 风格的支持,也是它最具特色的功能。无论是在框架设计,还是扩展性、灵活性等方面都全面超越了 Struts2 等 MVC 框架。并且由于 Spring MVC 本身就是 Spring 框架的一部分,所以可以说与 Spring 框架是无缝集成,性能方面具有先天的优越性,对于开发者来说,开发效率也高于其它的 Web 框架,在企业中的应用越来越广泛,成为主流的 MVC 框架。

1.2.1 Spring MVC优点

  • 清晰地角色划分,Spring MVC 在 Model、View 和 Controller 方面提供了一个非常清晰的角色划分,这 3 个方面真正是各司其职,各负其责。

  • 灵活的配置功能,可以把类当作 Bean 通过 XML 进行配置。

  • 提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。

  • 真正做到与 View 层的实现无关。它不会强制开发者使用 JSP,可以根据项目需求使用 Velocity、FreeMarker 等技术。

  • 国际化支持。

  • 面向接口编程。

  • 与 Spring 框架无缝集成。

    一个好的框架要减轻开发者处理复杂问题的负担,内部有良好的扩展,并且有一个支持它的强大用户群体,恰恰 Spring MVC 都做到了。

1.2.2 Spring模块

  • 核心容器(Spring Core)

    • 核心容器提供Spring框架的基本功能。Spring以bean的方式组织和管理Java应用中的各个组件及其关系。Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转(IoC)模式将应用的配置和依赖性规范与实际的应用程序代码分开。

  • 应用上下文(Spring Context)

    • Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度功能。

  • Spring面向切面编程(Spring AOP)

    • 通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring框架中。所以,可以很容易地使 Spring框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

  • JDBC和DAO模块(Spring DAO)

    • JDBC、DAO的抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理,和不同数据库供应商所抛出的错误信息。异常层次结构简化了错误处理,并且极大的降低了需要编写的代码数量,比如打开和关闭链接。

  • 对象实体映射(Spring ORM)

    • Spring框架插入了若干个ORM框架,从而提供了ORM对象的关系工具,其中包括了Hibernate、JDO和 IBatis SQL Map等,所有这些都遵从Spring的通用事务和DAO异常层次结构。

  • Web模块(Spring Web)

    • Web上下文模块建立在应用程序上下文模块之上,为基于web的应用程序提供了上下文。所以Spring框架支持与Struts集成,web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

  • MVC模块(Spring Web MVC)

    • MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的。MVC容纳了大量视图技术,其中包括JSP、POI等,模型由JavaBean来构成,存放于模型(M)当中,而视图(V)是一个接口。Spring框架的功能可以用在任何J2EE服务器当中,大多数功能也适用于不受管理的环境。Spring的核心要点就是支持不绑定到特定J2EE服务的可重用业务和数据的访问的对象,毫无疑问这样的对象可以在不同的J2EE环境,独立应用程序和测试环境之间重用。

1.3 Web MVC工作流程

MVC设计模式在B/S系统下应用:

     1、用户发起request请求至控制器Servlet。
    
    2、控制器接收用户请求的数据,委托给模型进行处理,控制器通过模型(Model)处理数据并得到处理结果。
    
    3、模型通常是指业务逻辑,模型处理结果返回给控制器。
    
    4、控制器将模型数据在视图jsp中展示,通过视图展示给用户要的数据或处理结果。
    
    5、视图将response响应给用户。

1.4 SpringMVC工作流程

     1、用户向服务器发送请求,请求被SpringMVC前端控制器DispatcherServlet(本质就是Servlet)捕获,Controller层的核心DispatcherServlet,主要是用来接受用户请求和响应。
    
    2、DispatcherServlet将用户的请求转发给HandlerMapping(处理器映射器)。
    
    3、HandlerMapping根据接收到的请求路径在Handler模块中找到对应处理逻辑业务的handler,然后返回HandlerExecutionChain(处理器执行链)给DispatcherServlet。
        HandlerExecutionChain由拦截器和处理器对象组成(HandlerInterceptor,Handler)。
        
    4、DispatcherServlet根据接收到的处理器执行链,选择一个合适的处理器适配器HandlerAdapter。
        附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler方法。
        
    5、DispatcherServlet通过HandlerAdapter调用对应的Handler(常称为 Controller)。在执行Handler中的方法前,会先执行拦截器的preHandler方法,并填入形参,在填充形参的过程中,根据你的配置,Spring将帮你做一些额外的工作:
        HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息;
        数据转换:对请求消息进行数据转换。如String转换成Integer、Double等;
        数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等;
        数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中;
    
    6、Handler执行完成后,向HandlerAdapter返回一个ModelAndView对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息)。
    
    7、HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet。
    
    8、DispatcherServlet根据返回的ModelAndView,选择一个适合的视图解析器ViewResolver。
    
    9、ViewResolver 将 ModelAndView 分别解析为模型对象Model和视图对象View,并返回给DispatcherServlet。
    
    10、DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图)。
    
    11、DispatcherServlet将视图响应给用户。

1.5 组件说明

    Spring MVC 涉及到的组件有 DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、Handler(处理器)、ViewResolver(视图解析器)和 View(视图)。
    
    下面对各个组件的功能说明如下。

  • DispatcherServlet:前端控制器(不需要程序员开发)

    DispatcherServlet 是前端控制器,从上图可以看出,Spring MVC 的所有请求都要经过 DispatcherServlet 来统一分发。DispatcherServlet 相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。

  • HandlerMapping:处理器映射器(不需要程序员开发)

     HandlerMapping 负责根据用户请求找到Handler即处理器,Spring MVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

  • HandlerAdapter:处理器适配器(不需要程序员开发)

    HandlerAdapter 是处理器适配器,其作用是根据映射器找到的处理器(Handler)信息,按照特定规则执行相关的处理器(Handler)。这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

  • Handler:处理器(需要程序员开发)

    Handler 是处理器,和 Java Servlet 扮演的角色一致。其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

  • ViewResolver:视图解析器(不需要程序员开发)

    View Resolver 是视图解析器,其作用是进行解析操作,通过 ModelAndView 对象中的 View 信息将逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象(如通过一个 JSP 路径返回一个真正的 JSP 页面)。

  • View:视图

    View 是视图,其本身是一个接口,实现类支持不同的 View 类型(JSP、FreeMarker、Excel 等)。

    以上组件中,需要开发人员进行开发的是处理器(Handler,常称Controller)和视图(View)。通俗的说,要开发处理该请求的具体代码逻辑,以及最终展示给用户的界面。

    注意:由于 Spring MVC 结构比较复杂,所以学习的时候也要掌握学习方法。首先要明确 Spring MVC 是一个工具,既然是工具,那么我们就需要先掌握工具的使用方法,不要陷入细节中,深入浅出,慢慢通过实际运用来加深对其的理解。

猜你喜欢

转载自blog.csdn.net/ligonglanyuan/article/details/125069271