美文网首页
SpringMVC复习

SpringMVC复习

作者: Zerek_W | 来源:发表于2021-12-01 14:37 被阅读0次
    image.png

    一、SpringMVC简介

    1、什么是MVC

    MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
    MVC的工作流程:
    用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器

    2、什么是SpringMVC

    SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。

    3、SpringMVC的特点

    基于原生的Servlet,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理、即插即用、性能卓著

    二、配置环境

    1、创建maven工程

    a>添加web模块
    b>打包方式:war
    c>引入依赖

    2.配置web.xml

    注册SpringMVC的前端控制器DispatcherServlet
    a>默认配置方式
    此配置作用下,SpringMVC的配置文件默认位于WEB-INF下,默认名称为<servlet-name>-servlet.xml

    b>扩展配置方式

    可通过init-param标签设置SpringMVC配置文件的位置和名称,通过load-on-startup标签设置SpringMVC前端控制器DispatcherServlet的初始化时间

    3、创建请求控制器

    通过@Controller注解将其标识为一个控制层组件,交给Spring的IoC容器管理,此时SpringMVC才能够识别控制器的存在

    4、创建springMVC的配置文件

    自动扫描、配置Thymeleaf视图解析器、处理静态资源、开启mvc注解驱动、

    5、执行过程

    浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器DispatcherServlet处理。前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面

    三、@RequestMapping注解

    1、@RequestMapping注解的功能

    从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。

    SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。

    2、@RequestMapping注解的位置

    @RequestMapping标识一个类:设置映射请求的请求路径的初始信息

    @RequestMapping标识一个方法:设置映射请求请求路径的具体信息

    3、@RequestMapping注解的value属性

    @RequestMapping注解的value属性通过请求的请求地址匹配请求映射

    @RequestMapping注解的value属性是一个字符串类型的数组,表示该请求映射能够匹配多个请求地址所对应的请求

    @RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射

    4、@RequestMapping注解的method属性

    @RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射

    @RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求

    若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错405

    5、SpringMVC支持路径中的占位符(重点)

    原始方式:/deleteUser?id=1

    rest方式:/deleteUser/1

    SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参

    @RequestMapping("/test/{id}/{username}")
    public String testRest(@PathVariable("id") String id, @PathVariable("username") String username)
    

    四、SpringMVC获取请求参数

    1、通过ServletAPI获取

    将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象

    2、通过控制器方法的形参获取请求参数

    在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参

    3、@RequestParam

    @RequestParam是将请求参数和控制器方法的形参创建映射关系

    @RequestParam注解一共有三个属性:

    value:指定为形参赋值的请求参数的参数名

    required:设置是否必须传输此请求参数,默认值为true

    若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present;若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为null

    defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使用默认值为形参赋值

    4、@RequestHeader

    @RequestHeader是将请求头信息和控制器方法的形参创建映射关系

    @RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

    5、@CookieValue

    @CookieValue是将cookie数据和控制器方法的形参创建映射关系

    @CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

    6、通过POJO获取请求参数

    可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值

    7、解决获取请求参数的乱码问题

    解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册

    五、域对象共享数据

    1、使用ServletAPI向request域对象共享数据
    2、使用ModelAndView向request域对象共享数据
    3、使用Model向request域对象共享数据
    4、使用map向request域对象共享数据
    5、使用ModelMap向request域对象共享数据
    6、Model、ModelMap、Map的关系
    Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的
    7、向session域共享数据
    8、向application域共享数据

    六、SpringMVC的视图

    SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户

    SpringMVC视图的种类很多,默认有转发视图和重定向视图

    当工程引入jstl的依赖,转发视图会自动转换为JstlView

    若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView

    1、ThymeleafView

    当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转

    2、转发视图

    SpringMVC中默认的转发视图是InternalResourceView

    SpringMVC中创建转发视图的情况:

    当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转

    3、重定向视图

    SpringMVC中默认的重定向视图是RedirectView

    当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转

    4、视图控制器view-controller

    当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view-controller标签进行表示
    注:当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:
    <mvc:annotation-driven />

    七、RESTful

    1、RESTful简介

    REST:Representational State Transfer,表现层资源状态转移。

    2、RESTful的实现

    具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。

    它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。

    REST 风格提倡 URL 地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分,以保证整体风格的一致性。

    3、HiddenHttpMethodFilter

    由于浏览器只支持发送get和post方式的请求,那么该如何发送put和delete请求呢?

    SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求

    HiddenHttpMethodFilter 处理put和delete请求的条件:

    a>当前请求的请求方式必须为post

    b>当前请求必须传输请求参数_method

    满足以上条件,HiddenHttpMethodFilter 过滤器就会将当前请求的请求方式转换为请求参数_method的值,因此请求参数_method的值才是最终的请求方式

    八、HttpMessageConverter

    HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文

    HttpMessageConverter提供了两个注解和两个类型:@RequestBody,@ResponseBody,RequestEntity,

    ResponseEntity

    1、@RequestBody

    @RequestBody可以获取请求体,需要在控制器方法设置一个形参,使用@RequestBody进行标识,当前请求的请求体就会为当前注解所标识的形参赋值

    2、RequestEntity

    RequestEntity封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息

    3、@ResponseBody

    @ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文的响应体响应到浏览器

    4、SpringMVC处理json

    @ResponseBody处理json的步骤:

    a>导入jackson的依赖
    b>在SpringMVC的核心配置文件中开启mvc的注解驱动,此时在HandlerAdaptor中会自动装配一个消息转换器:MappingJackson2HttpMessageConverter,可以将响应到浏览器的
    c>在处理器方法上使用@ResponseBody注解进行标识
    d>将Java对象直接作为控制器方法的返回值返回,就会自动转换为Json格式的字符串Java对象转换为Json格式的字符串

    5、SpringMVC处理ajax

    a>请求超链接:
    b>通过vue和axios处理点击事件:
    c>控制器方法:

    6、@RestController注解

    @RestController注解是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解

    7、ResponseEntity

    ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文

    九、文件上传和下载

    1、文件下载

    使用ResponseEntity实现下载文件的功能

    2、文件上传

    文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data"

    SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息

    上传步骤:

    a>添加依赖:
    b>在SpringMVC的配置文件中添加配置:
    c>控制器方法:

    十、拦截器

    1、拦截器的配置

    SpringMVC中的拦截器用于拦截控制器方法的执行

    SpringMVC中的拦截器需要实现HandlerInterceptor

    SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:

    2、拦截器的三个抽象方法

    SpringMVC中的拦截器有三个抽象方法:

    preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法

    postHandle:控制器方法执行之后执行postHandle()

    afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()

    3、多个拦截器的执行顺序

    a>若每个拦截器的preHandle()都返回true

    此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:

    preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行

    b>若某个拦截器的preHandle()返回了false

    preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行

    十一、异常处理器

    1、基于配置的异常处理

    SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver

    HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver

    SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver
    2、基于注解的异常处理

    十二、注解配置SpringMVC

    使用配置类和注解代替web.xml和SpringMVC配置文件的功能

    1、创建初始化类,代替web.xml

    2、创建SpringConfig配置类,代替spring的配置文件

    3、创建WebConfig配置类,代替SpringMVC的配置文件

    十三、SpringMVC执行流程

    1、SpringMVC常用组件

    • DispatcherServlet:前端控制器,不需要工程师开发,由框架提供

    作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求

    • HandlerMapping:处理器映射器,不需要工程师开发,由框架提供

    作用:根据请求的url、method等信息查找Handler,即控制器方法

    • Handler:处理器,需要工程师开发

    作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理

    • HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供

    作用:通过HandlerAdapter对处理器(控制器方法)进行执行

    • ViewResolver:视图解析器,不需要工程师开发,由框架提供

    作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView

    • View:视图

    作用:将模型数据通过页面展示给用户

    4、SpringMVC的执行流程

    1. 用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获。

    2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:

    a) 不存在

    i. 再判断是否配置了mvc:default-servlet-handler

    ii. 如果没配置,则控制台报映射查找不到,客户端展示404错误

    iii. 如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML),找不到客户端也会展示404错误

    b) 存在则执行下面的流程

    1. 根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。

    2. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。

    3. 如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】

    4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

    a) HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

    b) 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等

    c) 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

    d) 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

    1. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。

    2. 此时将开始执行拦截器的postHandle(...)方法【逆向】。

    3. 根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。

    4. 渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。

    5. 将渲染结果返回给客户端。

    相关文章

      网友评论

          本文标题:SpringMVC复习

          本文链接:https://www.haomeiwen.com/subject/iljsxrtx.html