SpringMVC

  • MVC:一种软件架构思想,将软件按照模型、视图、控制器来划分

    • M:Model,模型层,指工程中的JavaBean,作用是处理数据

      • JavaBean分为两类:

        • 实体类Bean:专门存储业务数据,如Student、User等

        • 业务处理Bean:Service或Dao对象,专门用于处理业务逻辑和数据访问

    • V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据,只负责数据和界面的显示,不接受任何与显示数据无关的代码

    • C:Controller,控制层,指工程中的servlet,作用是接受请求和响应浏览器

  • MVC大致工作流程:

    • 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用响应的Model层处理请求,

    • 处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到响应的View视图,渲染数据后最终响应给浏览器

SpringMVC组件

  • 前置控制器 DispatcherServlet

  • 映射控制器 HandlerMapping

  • 处理器 Controller

  • 模型和视图 ModelAndView

  • 视图解析器 ViewResolver

@RequestMapping

  • 功能

    • 将请求和处理请求的控制器关联起来,建立映射关系

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

  • 位置:

    • 标识一个类:设置映射请求的请求路径的初始信息,表示一个目录

    • 标识一个方法:设置映射请求的请求路径的具体信息,表示一个目录下的具体位置

  • @RequestMapping里的值是应和html页面中的设置的a标签的路径一致,不同的@RequestMapping里不能出现两个相同的值(唯一性)

  • value属性:

    • value属性通过请求的地址匹配请求映射

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

    • @RequestMapping注解中的其他属性可以不设置,但value属性必须设置,至少通过请求地址匹配请求映射

    • 若当前请求的请求地址不满足value属性,浏览器会报错404

  • method属性:

    • method属性通过请求的请求方式(get或post)匹配请求映射

    • method属性是一个RequestMethod(字符串)类型的数组,表示该请求映射能匹配多种请求方式的请求

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

  • @RequestMapping的派生注解(对于处理指定请求方式的控制器方法):

    • 处理get请求的映射->@GetMapping

    • 处理post请求的映射->@PostMapping

    • 处理put请求的映射->@PutMapping

    • 处理delete请求的映射->@DeleteMapping

  • 常见的请求方式:get、post、put、delete,但是目前浏览器只支持get和post,若在form表单提交时,为method设置了其他请求方式的字符串(put或delete),则按照默认的请求方式get处理

  • params属性(了解):

    • params属性通过请求参数匹配请求映射

    • params属性是一个字符串类型的数组,有四种表达式设置请求参数和请求映射的匹配关系:

      • params:要求请求映射所匹配的请求必须携带params请求参数

      • !params:要求请求映射所匹配的请求不能携带params请求参数

      • params=value:要求请求映射所匹配的请求必须携带params请求参数且params=value

      • params!=value:要求请求映射所匹配的请求必须携带params请求参数且params!=value

    • 若当前请求满足value和method属性,但不满足params属性,浏览器会报错400

  • headers属性(了解):

    • headers属性通过请求的请求头信息匹配请求映射

    • headers属性是一个字符串类型的数组,有四种表达式设置请求头信息和请求映射的匹配关系:

      • header:要求请求映射所匹配的请求必须携带header请求头信息

      • !header:要求请求映射所匹配的请求不能携带header请求头信息

      • header=value:要求请求映射所匹配的请求必须携带header请求头信息且header=value

      • header!=value:要求请求映射所匹配的请求必须携带header请求头信息且header!=value

    • 若当前请求满足value和method属性,但不满足header属性,浏览器会报错404

SpringMVC支持ant风格的路径(模糊匹配)

  • ?:表示任意的单个字符(?和/除外)

  • *:表示任意的0个或多个字符(?和/除外)

  • 两个*:表示任意的一层或多层目录,也可以是0层目录(只能使用/ ** /xxx的方式)

SpringMVC支持路径中的占位符

  • 原始方式:/HelloWorld?id=1&name=Tom

  • rest方式:/HelloWorld/1/Tom

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

SpringMVC获取请求参数

  1. 通过servletAPI获取:

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

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

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

  3. 通过POJO(实体类)获取请求参数

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

@RequestParam

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

  • 三个属性:

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

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

      • 若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置defaultValue属性,则报错400

      • 若设置为false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则所标识的形参的值为null

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

@RequestHeader

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

  • 三个属性,与@RequestParam一样

@CookieValue

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

  • 三个属性:与@RequestParam一样

域对象共享数据

  • request域对象

    1. 使用servletAPI向request域对象共享数据(不建议使用)

    2. 使用ModelAndView向request域对象共享数据(重点)

    3. 使用Model向request域对象共享数据

    4. 使用Map向request域对象共享数据

    5. 使用ModelMap向request域对象共享数据

  • session域对象

    • 通过servletAPI向session域对象共享数据

  • application域对象

    • 通过servletAPI向application域对象共享数据

  • Model、Map、ModelMap的关系:

    • Model、Map、ModelMap类型的参数其实本质上都是BindingAwareModelMap类型的

SpringMVC视图

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

  • SpringMVC视图种类很多,默认有转发视图(InternalResourceView)和重定向视图(RedirectView)

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

  1. ThymeleafView

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

  2. 转发视图

    • SpringMVC默认的转发视图是InternalResourceView

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

  3. 重定向视图:

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

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

  • 视图控制器view-controller:

    • 在控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称,可以将处理器方法在配置文件中使用view-controller标签进行表示

      • path:设置处理的请求地址

      • view-name:设置请求地址所对应的视图名称

    • 当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC的配置文件中开启MVC的注解驱动

RESTFul

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

  • 资源是一种看待服务器的方式,即将服务器看作是由很多离散的资源组成

  • 资源的表述是一段对于资源在某个特定时刻的状态的描述,可以在客户端-服务端之间转移

  • 状态转移:在客户端和服务端之间转移代表资源状态的表述,通过转移操作资源的表述,来间接实现操作资源的目的

  • RESTFul的实现:

    • GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源

传统方式 REST风格 ​ 查询操作 getUserById?id=1 user/1(get请求方式) ​ 保存操作 saveUser user(post请求方式) ​ 删除操作 deleteUser?id=1 user/1(delete请求方式) ​ 更新操作 updateUser user(put请求方式)

HttpMessageConverter

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

  • HttpMessageConverter提供了两个注解和两个类型:

    • @RequestBody(用得少):

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

    • RequestEntity(用得少):

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

    • @ResponseBody(用得多):

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

      • 文件下载:

        1. 导入依赖:jackson-databind

        2. 在springMVC配置文件中开启注解驱动

        3. 在处理器方法上添加@ResponseBody

        4. 将java对象直接作为控制器方法的返回值返回,就会自动转换成json格式的字符串

      • @RestController注解是一个复合注解,相当于为类添加了@Controller注解,并为其中每个方法添加@ResponseBody注解

      • ResponseEntity(用得多):

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

      • 文件上传:

        1. 导入依赖:commons-fileupload

        2. 配置文件上传解析器,将上传的文件封装为MultipartFile

          <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
          </bean>

拦截器

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

  • 拦截器需要实现HandlerInterceptor接口

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

    • 配置拦截器(三种方式)

      1. bean,对DispatcherServlet所处理的所有请求进行拦截

      2. ref,对DispatcherServlet所处理的所有请求进行拦截

      3. mvc:interceptor,对指定的请求进行拦截

        • mvc:mapping设置需要拦截的请求

        • mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求

  • 拦截器三个抽象方法:

    1. preHandle:控制器方法执行之前执行,返回值true表示放行,即调用控制器方法;返回值为false表示拦截,即不调用控制器方法

    2. postHandle:控制器方法执行之后执行

    3. afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行

  • 拦截器执行顺序:

    • 若每个拦截器的preHandle()都返回true,此时多个拦截器执行顺序和拦截器在配置文件的配置顺序有关preHandle()会按照配置的顺序执行,而postHandle()和afterCompletion()会按照配置的反序执行

    • 若某个拦截器的preHandle()返回false,则它和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,它之前的拦截器的afterCompletion()会执行

ModelAndView

  • 在SpringMVC中,不管用何种方式,本质上最后都会封装到ModelAndView,ModelAndView向request域对象共享数据时,需要返回ModelAndView本身

  • ModelAndView有Model和View两个功能:Model用于向请求域共享数据;View用于设置视图,实现页面跳转

SpringMVC组件

  • DispatcherServlet:前端控制器,不需要配置,由框架提供

    • 作用:接收请求,响应结果,整个流程控制的中心,调用其它组件处理用户的请求

  • HandlerMapping:处理器映射器,不需要配置,由框架提供

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

  • Handler:处理器,需要配置,需要按照HandlerAdapter的规则来实现

    • 作用:对具体的用户请求进行处理

  • HandlerAdapter:处理器适配器,不需要配置,由框架提供

    • 作用:通过HandlerAdapter的规则进行执行Handler

  • ViewResolver:视图解析器,不需要配置,由框架提供

    • 作用:进行视图解析,得到相应的视图

  • View:视图,将模型数据通过网页展示出来

SpringMVC配置信息

  1. 扫描组件

  2. 视图解析器

  3. view-controller

  4. default-servlet-handler

  5. MVC注解驱动

  6. 文件上传解析器

  7. 拦截器

  8. 异常处理解析器

SpringMVC请求过程

  1. 用户通过View层发送请求到服务器,在服务器中请求被Controller接收

  2. Controller调用相应的Model层处理请求

  3. Model层处理完毕将结果返回到Controller

  4. Controller再根据请求处理的结果找到相应的View视图

  5. View视图渲染数据后最终响应给浏览器

SpringMVC执行流程

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

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

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

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

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

  6. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller),处理请求。

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

  8. 此时将开始执行拦截器的postHandle()【逆向】

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

  10. 渲染视图完毕执行拦截器的afterCompletion()【逆向】

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值