SpringMVC框架

一、SpringMVC框架概述

1.简介:
Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts,但Spring的MVC框架使用IOC对控制逻辑和业务对象提供了完全的分离。它也允许你声明性地将请求参数绑定到你的业务对象中,此外,Spring的MVC框架还可以利用Spring的任何其它服务,例如国际化信息与验证。

springMVC是一个MVC的开源框架,springMVC=struts2+spring,springMVC就相当于是Struts2加上sring的整合,但是这里有一个疑惑就是,springMVC和spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,springMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把springMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说springMVC和spring无缝集成,其实springMVC就是spring的一个子模块,所以根本不需要同spring进行整合。

2.什么是MVC设计模式?
MVC即Model-View-Controller,将应用按照Model(模型)、View(视图)、Controller(控制)这样的方式分离。

视图(View):代表用户交互界面,对于Web应用来说,可以是HTML,也可能是jsp、XML和Applet等。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。

模型(Model):是业务的处理以及业务规则的制定。模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计是MVC最主要的核心。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只是组织管理这些模型,以便于模型的重构和提高重用性。

控制(Controller):可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。

3.SpringMVC框架作用:

  • 解决了V-C的交互问题,即视图与控制器的交互问题。
  • 在原生的Java EE技术中,使用Servlet作为项目中的控制器,用于接收用户的请求,并给予响应结果。这种做法最大的问题在于:在常规做法中,每个Servlet对应1个请求路径,例如LoginServlet处理login.com的请求,而RegisterServlet处理register.com的请求,所以,会导致Servlet数量太多,不便于管理(无论从源文件的数量,还是从配置文件的内容),且对象太多进而占用大量内存空间的问题!
  • 并且,在请求的处理过程中,还存在许多操作不简便的做法

4.SpringMVC核心组件:

  • DispatcherServlet
    前端控制器,主要职责是接收所有请求(根据配置文件来决定),并将请求转发给对应的控制器,接收控制器的处理结果,确定最终由哪个视图完成响应!
  • HandlerMapping
    处理请求路径与控制器的映射关系。
  • Controller
    实际处理请求的组件,例如接收请求参数,决定最终是转发或重定向的方式来响应。
  • ModelAndView
    控制器的处理结果,其中的Model表示转发的数据(如果是重定向,则Model没有意义),而View表示最终负责响应的视图组件的名称。
  • ViewResolver
    根据视图组件的名称,确定具体使用的是哪个视图组件。
    在这里插入图片描述

5.使用SpringMVC的原因:

SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化日常Web开发。(处理业务数据的对象和显示业务数据的视图之间存在紧密耦合)。

6.SpringMVC的特点:

  • 清晰的角色划分:控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(formobject)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、视图解析器(view resolver)等。每一个角色都可以由一个专门的对象来实现。
  • 强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器(validator)的引用。
  • 可适配、非侵入:可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。
  • 可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。
  • 可定制的绑定(binding) 和验证(validation):比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。
  • 可定制的handlermapping和view resolution:Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些webMVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。
  • 灵活的model转换:在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。
  • 可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。
  • 简单而强大的JSP标签库(SpringTag Library):支持包括诸如数据绑定和主题(theme) 之类的许多功能。
  • JSP表单标签库:在Spring2.0中引入的表单标签库,使得在JSP中编写 表单更加容易。
  • Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。

7.SpringMVC的优点:

  • 让我们能非常简单的设计出干净的Web层和薄薄的Web层
  • 进行更简洁的Web层的开发
  • 天生与Spring框架集成(如IoC容器、AOP等)
  • 提供强大的约定大于配置的契约式编程支持
  • 非常灵活的数据验证、格式化和数据绑定机制
  • 支持Restful风格

引用自https://blog.csdn.net/floating_dreaming/article/details/89089214

8.SpringMVC架构(MVC设计模式在BS系统下的应用)
在这里插入图片描述

9.SpringMVC的工作原理图:
在这里插入图片描述
SpringMVC工作原理解析:
第一步:发起请求到前端控制器(DispatcherServlet)。
第二步:前端控制器请求HandlerMapping查找 Handler,可以根据xml配置、注解进行查找。
第三步:处理器映射器HandlerMapping向前端控制器返回Handler。
第四步:前端控制器调用处理器适配器去执行Handler。
第五步:处理器适配器去执行Handler。
第六步:Handler执行完成给适配器返回ModelAndView。
第七步:处理器适配器向前端控制器返回ModelAndView。
(ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
第八步:前端控制器请求视图解析器去进行视图解析。
(根据逻辑视图名解析成真正的视图(jsp))
第九步:视图解析器向前端控制器返回View。
第十步:前端控制器进行视图渲染。
(视图渲染将模型数据(在ModelAndView对象中)填充到request域)
第十一步:前端控制器向用户响应结果。

组件说明:

以下组件通常使用框架提供实现:

  • DispatcherServlet:作为前端控制器,整个流程控制的中心,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。

  • HandlerMapping:通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

  • HandlAdapter:通过扩展处理器适配器,支持更多类型的处理器。

  • ViewResolver:通过扩展视图解析器,支持更多类型的视图解析,例如:jsp、freemarker、pdf、excel等。

组件:
1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供
作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

4、处理器Handler(需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。

5、视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。

6、视图View(需要工程师开发jsp…)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

核心架构的具体流程步骤如下:
1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

下边两个组件通常情况下需要开发:

  • Handler:处理器,即后端控制器用controller表示。

  • View:视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。

二、编写第一个SpringMVC的小程序

1.创建Web项目,引入SpringMVC的框架工具包(.jar)
在这里插入图片描述
2.定义Controller 层: 指的是服务端的控制层。
在这里插入图片描述
3.对外提供controller层的访问地址: 通过注解在类中提供,并且基于Spring容器。
在这里插入图片描述
在这里插入图片描述
4.基于web.xml中提供: 核心过滤器(DispatcherServlet)。用于加载匹配映射地址。
在这里插入图片描述
5.响应View页面视图。
在这里插入图片描述
6.基于浏览器发起请求,测试处理与响应。
在这里插入图片描述
总结:

@RequestMappering注解: 可以用于匹配映射路径和请求方式

三、基于编写的SpringMVC程序,针对客户端的请求,如何实现参数封装

1.基本类型参数传递封装
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.类类型引用参数传递封装
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3. 数组和集合的传递封装
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
小结:

针对SpringMVC的参数封装,不要由@RequestMappering(负责地址映射路径的匹配),而是由核心servlet: DispatchServlet实现。

四、基于编写的SpringMVC程序,针对客户端的请求,给出页面响应、数据响应

1.页面响应 ,为了页面跳转
1.1.直接借用 ServletAPI中的request 和 response 实现转发和重定向
1.2.可以直接转发或者重定向
1.3.或者直接响应页面
1.4.也可以响应MdelAndView : 该对象内部可以封装 index.jsp
在这里插入图片描述
2.数据响应:为了提供数据到客户端(Ajax请求时)
( 如何去直接响应基本类型,引用类型,集合数据 与 视图绑定)
2.1.可以借助ServletAPI 响应
2.2.可以借用ModelAndView 直接响应
2.3.可以借用Model 和 ModelMap 组件实现响应
2.4.可以借用注解: @ModelAttribute 实现响应
2.5.直接响应数据到response响应对象中,不进行视图响应
在这里插入图片描述
附上JSP以及Ajax页面:
在这里插入图片描述
在这里插入图片描述


版权声明:本文为Gary_lyy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。