Spring MVC的基本组件与使用

目录

 

MVC三大组件

以web项目为例,看一下整个MVC模型操作的执行周期

MVC设计的优点

体现MVC思想的场景

Spring MVC对MVC的支持

1. Spring MVC对控制器的支持

a. 控制器核心

b. 处理器查找

c. 处理器执行

d. 拦截器

e. 视图查找与模型绑定

2. Spring MVC对模型的支持

模型的相关类型以及使用方式

3. Spring MVC对视图的支持

视图类型

视图查找解析


MVC三大组件

  • Mode-View-Controller,把一个包含UI的应用分成了3层,每层负责各自的逻辑。
  • Model(模型层):用于提供数据读写操作的业务逻辑,同时还包含数据的逻辑操作
  • View(视图层):面向用户的View视图层,用于根据数据数目为用户渲染可视化页面,渲染时数据一般来自Model层,用户操作后可以把数据提交给Controller层。
  • Controller(控制层):用于接收用户的操作与数据,根据用户的操作调用不同的Model处理数据同时控制展示给用户的View层。Controller层是View层和Model层的纽带

以web项目为例,看一下整个MVC模型操作的执行周期

  • 用户使用浏览器通过URL访问页面
  • Controller层获取URL上的相关信息,决定使用哪个Model层组件处理数据以及逻辑,并把URL中相关参数提交给Model层
  • Model层组件的处理逻辑处理用户相关的参数,可能还会从其他数据源获取相关数据,把处理之后的数据添加到自己的属性中
  • 处理完成返回Controll层,Controller层根据相关参数选择返回的View层
  • View层根据Model层中属性渲染页面,返回HTML给浏览器,浏览器渲染HTML后展示给用户。

整个操作的过程中流向是固定的环状,这也是MVC的一个优点,简化流程

MVC设计的优点

  • 低耦合:通过Controller层解耦Model层和View层,可另Model层和View层两部分单独做修改而不会影响另一部分。例如可以任意改动View以展示不同的页面,同时Model和Controller层无须做任何改动,反之亦然。
  • 高复用:基于View层的改动不影响Model层,可以为Web应用添加不同的View,如移动端页面和桌面端页面不同,可以复用统一到Model层
  • 高维护:拆分View层和Model层,使得每层之间数据流向单一,没有图状数据流向,更易于开发与维护。不同层可以交由不同的开发人员负责,功能越单一,实现的效率越高。

体现MVC思想的场景

计算机硬件体系拆分为CPU、显卡和内存、CPU是处理器逻辑,使用内存存取数据,显卡负责控制显示,显示数据来源也是通过内存获取的。

Spring MVC对MVC的支持

1. Spring MVC对控制器的支持

a. 控制器核心

DispatcherServlet是Spring MVC的核心,包含Model处理逻辑的查找、Model处理逻辑的执行、View的查找以及View的渲染等控制器核心逻辑。Model处理逻辑的查找和Model处理逻辑的执行二者相互独立,查找通过Mapping映射器完成(控制器负责通过HandlerMapping查找Handler),查找返回的结果是Model的执行逻辑的封装-Handler(处理器), 查找到Handler之后再交由HandlerAdapter处理。在处理器执行的前后,还可以插入拦截器组件,通过拦截器实现类似于面向切面的功能,拦截器可以在处理器的执行前、执行后、完成时分别执行一段逻辑,用来为所有处理器添加相同的逻辑。

b. 处理器查找

(1)直接URl映射

(2) BeanName与URL映射

  (3)  @RequestMapping映射(最常用的一种方式)

c. 处理器执行

(1) HttpRequestHandler

(2) Controller接口Handler

(3) @RequestMapping定义的HandlerMethod

@Controller
public class MyRequestMapping{
    @RequestMapping(path="/myRequestMapping", method=RequestMethod.GET)
    public String requestMappingGet(String name, Map<String, Object> model){
        model.put("name", name);
        return "defaultView"
    }
}
  • 请求参数的自动绑定,在@RequestMapping中,请求参数可以自动绑定到处理方法的参数中。
  • Model模型的自动绑定。参数中声明了Map类型的model,此时RequestMappingHandlerAdapter会自动会其生成Model模型并绑定到方法参数中,供处理器逻辑对其数据进行存取。
  • 视图的自动查找。通过返回String类型的试图名,一般是视图文件名,RequestMappingHandlerAdapter可以自动查找相应名称的视图,并与参数中的Model模型数据自动绑定
  • 添加了参数绑定、返回值处理等功能,不需要再暴露原始的请求和响应,即可完成请求与响应的处理,使得开发者只需要关注自己需要的请求参数和要返回的结果,而无须对原始请求和响应做加工。

d. 拦截器

在查找处理器时,HandlerMapping并不直返回Handler,而是返回Handler的执行链HandlerExecutionChain.该执行链中封装的有需要应用到该Handler上的所有拦截器,拦截器的类型通过HandlerInterceptor接口的实现。在执行处理器前,会先执行HandlerInterceptor的preHandle前置处理方法,如果该方法返回false, 则中断处理流程;如果返回true,则继续后续的拦截器处理,直到所有拦截器都返回true,才会开始执行handler。在执行处理器后,会有两种结果

  • 正常执行完成,此时拦截器会先执行拦截器里的postHandle方法,触发处理器执行后的操作,之后还会执行拦截器里的afterCompletion,代表整个处理动作完成。
  • 在执行时发生了错误,此时不执行postHandle方法,而是直接执行afterCompletion方法,并把发生的错误作为参数传递给该方法。

e. 视图查找与模型绑定

控制器(DispatcherServlet拿到处理器执行的结果。处理器的执行是通过HandlerAdapter的handle方法执行的,而其返回结果就是ModelAndView类型(这个类型就是视图与模型的绑定关系).

渲染时,首先根据ModelAndView视图或者拿到视图名查找视图,之后再从ModelAndView中获取Model模型数据,通过调用视图的渲染方法传入模型数据执行视图的渲染操作,渲染后把渲染的结果通过HTTP的Response返回给用户。

2. Spring MVC对模型的支持

由于视图的渲染时,需要对模型数据进行读取,而渲染方法传入的模型数据是Map类型,所以Spring MVC模型相关的类型就是围绕着Map而产生的

模型的相关类型以及使用方式

(1) Map接口

@RequestMapping(path="/mapModel")
public String mapModelBinding(Map<String, Object> map){
    model.put("name", "Map类型的Model");
    return "defaultView"
}

(2) Model接口

@RequestMapping(path="/modelModel")
public String mapModelBinding(Model model){
    model.put("name", "Model类型的Model");
    return "defaultView"
}

(3) ModelMap 类

@RequestMapping(path="/modelModel")
public String modelMapModelBinding(ModelMap modelMap){
    modelMap.put("name", "ModelMap类型的Model");
    modelMap.put("date", new Date());
    return "defaultView"
}

(4) 直接创建Model并作为返回值返回

Spring MVC会对处理器方法中的返回值自动处理,如果返回值类型是Model接口类型或者Map接口类型,Spring MVC会自动把返回值的所有属性添加到请求周期中产生的Model模型中,此时的Model模型是我们自己创建的。

@RequestMapping(path="/defaultView")
public Map createModel(){
    Map<String, Object> model = new HashMap<>();
    //也可以是
    ModelMap model = new ModelMap();
    model.put("name", "自行创建Model");
    return model;
}

此时的视图名并没有返回,视图名来源于请求路径,这里的请求路径是defaultView,所以视图名也是defaultView.

(5) 处理方法标记@ModelAttribute注解

(6) 直接返回ModelAndView

这种方式更加直接,直接返回包括视图和模型的类型,模型是任意的Map类型,视图支持String类型的视图名和View类型。这种类型和Controller接口中处理方法的返回值是相同的,也是Spring MVC的HandlerAdapter的处理结果,所以这种类型是比较底层的类型,示例代码如下:

@RequestMapping(path="/defaultView")
public ModelAndView modelAndViewModelBinding(){
    Map<String, Object> model = new HashMap<>(2);
    model.put("name", "ModelAndView类型");
    return new ModelAndView("defaultView", model);
}

第一个参数是视图名,第二个参数是模型

3. Spring MVC对视图的支持

根据视图名通过视图解析器解析出对应的视图。

视图类型

1) 内部资源视图InternelResourceView

(2) 重定向视图RedirectView

(3) 模板引擎视图

视图查找解析

Spring MVC提供了ViewResolver接口用以通过视图名查找并解析视图。该接口有resolveViewName方法,返回View视图。接受String类型的视图名,以该视图名进行查找。还有Locale类型的地区参数,用于进行国际化。Spring MVC的控制器支持多个ViewResolver,查找视图时进行遍历查找,直到找到相应的视图,如果没有找到则报错提示没有查找到相应的视图。Spring MVC支持几下几种查找与解析策略。

(1) BeanName视图解析

(2) 模板引擎视图解析

(3) 内部资源视图解析

(4) 直接指定视图

利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值