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 小时前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
小兔兔吃萝卜7 小时前
Spring 创建 Bean 的 8 种主要方式
java·后端·spring
AAA修煤气灶刘哥8 小时前
面试官: SpringBoot自动配置的原理是什么?从启动到生效,一文讲透
后端·spring·面试
qq_三哥啊10 小时前
【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
spring·intellij-idea·mybatis
别惹CC11 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
寒士obj11 小时前
Spring事物
java·spring
IT毕设实战小研19 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
甄超锋21 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
Java小白程序员1 天前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
甄超锋1 天前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven