SpringMVC

文章目录

学习目标

1.掌握基于SpringMVC获取请求参数与响应json数据操作

2.熟练应用基于EST风格的请求路径设置与参数传递

3.能够根据实际业务建立前后端开发通信协议并进行实现

4.基于SSM整合技术开发任意业务模块功能

SpringMVC简介

SpringMVC概述

  • SpringMVC是一种基于Java实现MVC模型的轻量级web框架
  • 优点
    • 使用简单,开发便捷(相比于Servlet)
    • 灵活性强
  • 小结
    1.SpringMVC是一种表现层 框架技术
    2.SpringMVC用于进行表现层功能开发

入门案例

①:使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标

②:创建SpringMVC控制器类(等同于Servlet功能)

③:初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean

④:初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC:技术处理的请求

  • 名称:@Contro1ler
  • 类型:类注解
  • 位置:SpringMVC控制器类定义上方
  • 作用:设定SpringMVC的核心控制器bean
  • 范例:
  • 名称:@RequestMapping
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径
  • 范例:
  • 相关属性
    • value(默认):请求访问路径
  • 名称:@ResponseBody
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析
  • 范例:
  • SpringMVC入门程序开发总结(1+N)
    • 一次性工作
      • 创建工程,设置服务器,加载工程
      • 导入坐标
      • 创建web容器启动类加载SpringMVC配置,并设置SpringMVC请求拦截路径
      • SpringMVC核心配置类(设置配置类,扫描controllert包,加载Controller:控制器bean)
    • 多次工作
      • 定义处理请求的控制器类
      • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化web3.O容器的抽象类
  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现
    • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围

getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理

  • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC 对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()

入门案例工作流程分析

  • 启动服务器初始化过程
    1.服务器启动,执行ServletContainersInitConfig类,初始化web容器

    2.执行createServletApplicationContext方法,创建了WebApplicationContexti对象

    3.加载SpringMvcConfig

    4.执行@ComponentScan)加载对应的bean

    5.加载UserController,每个@RequestMapping的名称对应一个具体的方法

    6.执行getServletMappings.方法,定义所有的请求都通过SpringMVC

Controller加载控制与业务bean加载控制

  • Controller加载控制
    • SpringMVC相关bean(表现层bean)
    • Spring控制的bean
      • 业务bean(Service)
      • 功能bean(DataSource等)

        1.因为功能不同,如何避免Spring错误的加载到SpringMVC的bean------加载Spring控制的bean的时候排除掉SpringMVC控制的bean
    • SpringMVC相关bean加载控制
      • SpringMVC加载的bean对应的包均在com.itheima.controller包内
    • Spring相关bean加载控制
      • 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
      • 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
    • 名称:@ComponentScan
    • 类型:类注解
    • 范例:
    • 属性
      • excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
      • includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)
  • bean的加载格式
    • 简化开发

PostMan

  • Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
  • 作用:常用于进行接口测试
  • 特征
    • 简单
    • 实用
    • 美观
    • 大方
  • PostMan基本使用
    • 注册登录
    • 创建工作空间/进入工作空间
    • 发起请求测试结果

请求与响应

1.团队多人开发,每人设置不同的请求路径,冲突问题如何解决------设置模块名作为请求路径前缀

请求映射路径

  • 名称:@RequestMapping
  • 类型:方法注解 类注解
  • 位置:SpringMVC控制 器方法定义上方
  • 作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
  • 范例:
  • 属性
    • value(默认):请求访问路径,或访问路径前缀

请求方式

  • Get请求
    • 普通参数:u1地址传参,地址参数名与形参变量名相同,定义形参即可接收参数

  • Post请求
    • 普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数

  • Post请求中文乱码处理
    • 为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器

请求参数

普通参数

  • 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
  • 普通参数:请求参数名与形参变量名不同 ,使用@RequestParam绑定参数关系
    • 名称:@RequestParam
    • 类型:形参注解
    • 位置:SpringMVC控制器方法形参定义前面
    • 作用:绑定请求参数与处理器方法形参间的关系
    • 范例:
    • 参数:
      • required:是否为必传参数
      • defaultValue:参数默认值

POJO参数

  • POJO参数:请求参数名与形参对象属性名相同 ,定义POJO类型形参即可接收参数
  • 嵌套POJO参数:POJO对象中包含POJO对象
    • 请求参数名与形参对象属性名相同 ,按照对象层次结构关系即可接收嵌套POJO属性参数

数组参数

  • 数组参数:请求参数名与形参对象属性名相同 且请求参数为多个,定义数组类型形参 即可接收参数
  • 集合保存普通参数:请求参数名与形参集合对象名相同 且请求参数为多个,@RequestParam绑定参数关系

json

json数组

json对象(POJO)

json数组(POJO)

请求参数(传递json数据)
  • 接收请求中的json数据

    ②:设置发送json数据(请求body中添加json数据)

    ③:开启自动转换json数据的支持
    • 注意事项
      @EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换

④:设置接收json数据

  • 名称:@EnableWebMvc
  • 类型:配置类注解
  • 位置:SpringMVC配置类定义上方
  • 作用:开启SpringMVC多项辅助功能
  • 范例:
  • 名称:@RequestBody
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参定义前面
  • 作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
  • 范例:
json对象
  • POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数
请求参数(传递json数组)
  • POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数
@RequestBody与@RequestParam区别
  • 区别
    • @RequestParam)用于接收url地址传参,表单传参【application,/X-www-form-urlencoded】
    • @RequestBody用于接收json数据【application/json】
  • 应用
    • 后期开发中,发送json格式数据为主,@RequestBody/应用较广
    • 如果发送非json格式数据,选用@RequestParam接收请求参数

日期类型参数传递

    • 名称:@DateTimeFormat
    • 类型:形参注解
    • 位置:SpringMVC控制器方法形参前面
    • 作用:设定日期时间型数据格式
    • 范例:
    • 属性:pattern:日期时间格式字符串
  • 类型转换器
    • Converter接口
  • @EnableWebMvc.功能之一:根据类型匹配对应的类型转换器

响应

  • 响应页面
  • 响应数据
    • 文本数据
    • json数据
      如果没有@ResponseBody ,返回字符串是响应页面
  • 响应文本数据(了解)
  • 响应json数据(对象转json)
  • 响应json数据(对象集合转json数组)
    • 名称:@ResponseBody
    • 类型:方法注解
    • 位置:SpringMVC控制器方法定义上方
    • 作用:设置当前控制器方法响应内容为当前返回值,无需解析------》设置当前控制器返回值作为响应体(返回值是string就是响应体,对象先转成可识别的数据在作为响应体)
    • 范例:
  • HttpMessageConverter接口

小结

1.响应

2.@ResponseBody(将对象数据转为json)

3.类型转换器(HttpMessageConverter)

总结

1.请求映射路径

2.请求参数

3,日期类型参数传递

4.响应json数据(依赖HttpMessageConverter)

REST风格

REST简介

  • REST (Representational State Transfer),表现形式状态转换
  • 优点:
    • 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
    • 书写简化
  • 按照REST风格访问资源时使用行为动作 区分对资源进行了何种操作
  • 注意事项
    • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
    • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts....
  • 根据REST风格对资源进行访问称为RESTful

RESTful入门案例

①:设定http请求动作(动词)

②:设定请求参数(路径变量)

  • 名称:@RequestMapping
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径
  • 范例:
  • 属性
    • value(默认):请求访问路径
    • method:http请求动作,标准动作(GET/POST/PUT/DELETE)
  • 名称:@PathVariable
  • 类型:形参注解
  • 位置:SpringMVC控制器方法形参定义前面
  • 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
  • 范例:

@RequestBody @RequestParam @PathVariable

  • 区别
    • @RequestParam用于接收url地址传参或表单传参
    • @RequestBody用于接收json数据
    • @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
  • 应用
    • 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
    • 如果发送非json格式数据,选用@RequestParam接收请求参数
    • 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

RESTful快速开发

  • 名称:@RestController
  • 类型:类注解
  • 位置:基于SpringMVC的RESTful开发控制器类定义上方
  • 作用:设置当前控制器类为RESTful风格,等同于 @Controller与@ResponseBody两个注解组合功能
  • 范例:
  • 名称:@GetMapping@PostMapping@PutMapping@DeleteMapping
  • 类型:方法注解
  • 位置:基于SpringMVC的RESTful开发控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping?对应GET请求
  • 范例:
  • 属性
    • value(默认):请求访问路径

小结

1.RESTfu1快速开发(标准开发)

2.@RestController

3.标准请求动作映射(4种)

案例


案例:基于RESTful页面数据交互

  • Springmvc对静态资源拦截,需要设置放行

小结

1.案例:基于RESTfu1页面数据交互

  • 先做后台功能,开发接口并调通接口
  • 再做页面异步调用,确认功能可以正常访问
  • 最后完成页面数据展示
  • 补充:放行静态资源访问

SSM整合

SSM整合流程

  1. 创建工程
  2. SSM整合
    • Spring
      • SpringConfig
        MyBatis
      • MybatisConfig
      • JdbcConfig
      • jdbc.properties
    • SpringMVC
      • ServletConfig
      • SpringMvcConfig
  3. 功能模块
    • 表与实体类
    • dao(接口+自动代理)
    • service(接口+实现类)
      • 业务层接口测试(整合JUnit)
    • controller

Spring整合MyBatis

  • 配置
    • SpringConfig
    • JDBCConfig,jdbc.properties

    • MyBatisConfig
  • 模型
    • Book
  • 数据层标准开发
    • BookDao
  • 业务层标准开发
    • BookService
    • BookServiceImpl
  • 测试接口
    • BookServiceTest
  • 事务处理

Spring整合SpringMVC

  • web配置类
  • SpringMVC配置类
  • 基于Restful的Controller开发


表现层数据封装

  • 前端接收数据格式
  • 前端接收数据格式一创建结果模型类,封装数据 到data属性中
  • 前端接收数据格式------封装操作结果 到code属性中
    • 查询不存在的数据
      20041表示成功/失败?
      (以0结尾代表失败)
  • 前端接收数据格式------封装特殊消息 到message(msg)属性中
  • 设置统一数据返回结果类
    • 注意事项
      Result类中的字段并不是固定的,可以根据需要自行增减
      提供若干个构造方法,方便操作
  • 设置统一数据返回结果编码
    • 注意事项
      Code类的常量设计也不是固定的,可以根据需要自行增减,例如将查询再进行细分为GET_OK,GET_ALL_OK,GET_PAGE_OK
  • 根据情况设定合理的Result

异常处理器

  • 程序开发过程中不可避免的会遇到异常现象
  • 出现异常现象的常见位置与常见诱因如下:
    • 框架内部抛出的异常:因使用不合规导致
    • 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
    • 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)
    • 表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)
    • 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)
  • 思考
    • 1.各个层级均出现异常,异常处理代码书写在哪一层
      所有的异常均抛出到表现层进行处理
      • 1.表现层处理异常,每个方法中单独书写,代码书写量巨大且意义不强,如何解决?------ AOP思想
  • 异常处理器
    集中的、统一的处理项目中出现的异常
    • 名称:@RestControllerAdvice
    • 类型:类注解
    • 位置:Rest风格开发的控制器增强类定义上方
    • 作用:为Rest风格开发的控制器类做增强
    • 范例:
    • 说明:
      • 此注解自带@ResponseBody注解与@Componenti注解,具备对应的功能
    • 名称:@ExceptionHandler
    • 类型:方法注解
    • 位置:专用于异常处理的控制器方法上方
    • 作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行
    • 范例:
    • 说明
      • 此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常

项目异常处理方案

  • 项目异常分类

    • 业务异常(BusinessException)
      • 规范的用户行为产生的异常
      • 不规范的用户行为操作产生的异常
    • 系统异常(SystemException)
      • 项目运行过程中可预计且无法避免的异常
    • 其他异常(Exception)
      • 编程人员未预期到的异常
  • 项目异常处理方案
    • 业务异常(BusinessException)
      • 发送对应消息传递给用户,提醒规范操作
    • 系统异常(SystemException)
      • 发送固定消息传递给用户,安抚用户
      • 发送特定消息给运维人员,提醒维护
      • 记录日志
    • 其他异常(Exception)
      • 发送固定消息传递给用户,安抚用户
      • 发送特定消息给编程人员,提醒维护(纳入预期范围内)
      • 记录日志

项目异常处理

①:自定义项目系统级异常

②:自定义项目业务级异常

③:

自定义异常编码(持续补充)

④:触发自定义异常

⑤:拦截并处理异常

⑥:异常处理器效果对比

案例:SSM整合标准开发

案例

①:自定义项目系统级异常

拦截器

拦截器概念

  • 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
  • 作用:
    • 在指定的方法调用前后执行预先设定的代码
    • 阻止原始方法的执行
  • 拦截器与过滤器区别
    • 归属不同:Filter属于Servlet技术,Interceptor.属于SpringMVC:技术
    • 拦截内容不同:Filter对所有访问 进行增强,Interceptor仅针对SpringMVC的访问("/")进行增强

入门案例

1.制作拦截器功能类

2.配置拦截器的执行位置

  • 拦截器入门案例
    ①:声明拦截器的bean,并实现HandlerInterceptor接口(注意:扫描加载bean)

    ②:定义配置类,继承WebMvcConfigurationSupport,实现addInterceptor方法(注意:扫描加载配置)

    ③:添加拦截器并设定拦截的访问路径,路径可以通过可变参数设置多个

    ④:使用标准接口WebMvcConfigurer简化开发(注意:侵入式较强)

拦截器参数

反射


拦截器工作流程分析

  • 多拦截器执行顺序
    • 当配置多个拦截器时,形成拦截器链
    • 拦截器链的运行顺序参照拦截器添加顺序为准
    • 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
    • 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

小结

  1. 拦截器链配置方式
  2. 拦截器链的运行顺序
    • preHandle:与配置顺序相同,必定运行
    • postHandle:与配置顺序相反,可能不运行
    • afterCompletion:与配置顺序相反,可能不运行
相关推荐
码蜂窝编程官方2 小时前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
AuroraI'ncoding3 小时前
时间请求参数、响应
java·后端·spring
计算机毕设指导65 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
ExiFengs6 小时前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
瓜牛_gn7 小时前
依赖注入注解
java·后端·spring
一元咖啡8 小时前
SpringCloud Gateway转发请求到同一个服务的不同端口
spring·spring cloud·gateway
java亮小白19979 小时前
Spring循环依赖如何解决的?
java·后端·spring
苏-言10 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
草莓base10 小时前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring
冰帝海岸17 小时前
01-spring security认证笔记
java·笔记·spring