Spring框架系列之SpringMVC

Spring框架系列之SpringMVC



前言

表述层框架
配置方式:controller添加相关注解实现功能,添加SpringMVC配置类,创建IoC容器加载配置类。不同的时他们需要实现相关的接口。

一、SpringMVC简介和体验

1.1 SpringMVC介绍&作用

1、SpringMVC定义:全称Spring Web MVC,是基于Servlet API构建的原始Web框架,即Spring Framework中的模块spring-webmvc。
控制层框架:Strust、WebWork、Strust2、SpringMVC
2、SpringMVC优势:

  • Spring 家族原生产品,对接IOC容器等基础设施
  • 解决表述层各细分领域问题
  • 内部组件化,可插拔式组件即插即用,配置相应组件即可实现功能
  • 代码清新简洁提升开发效率、性能卓著
    3、SpringMVC的作用覆盖表述层:
  • 简化接收前端参数( 形参列表 )
  • 调用业务逻辑:该怎么调还怎么调,没简化
  • 简化后端数据响应(返回值)
    表述层的作用:请求映射、数据输入、视图界面、请求分发、表单回显、会话控制、过滤拦截、异步交互、文件上传、文件下载、数据校验、类型转换
    4、springmvc简化参数接收和响应:
    请求数据接收:handler形参列表
    前端数据响应:handler的return关键字

1.2 核心组件和调用流程

1、Spring MVC:即web框架,围绕前端控制器模式设计,中央 Servlet DispatcherServlet 做整体请求处理调度!SpringMVC还提供其他特殊的组件协作完成请求处理和响应呈现。
2、相关概念

  • Spring MVC组件理解:把controller中定义的每一个方法称作handler!!
  • DispatcherServlet : [ CEO ]处理和分发全部请求。
  • HandlerMapping : [秘书]内部缓存handler(controller方法)和handler访问路径数据,被DS调用查找路径对应的handler。
  • HandlerAdapter : [经理]处理请求参数和处理响应数据数据。
  • DS—通过HandlerAdapter (适配器角色)间接调用—→handler。
  • Handler :[打工人]一个controller的方法是控制层的一个处理器。是Controller类内部的方法简称,自定义用来接收参数,向后调用业务,最终返回响应结果
  • ViewResovler : [财务]简化模版视图页面查找的,但是在前后端分离项目中后端只返回JSON数据,不返回页面。
    Spring MVC请求处理流程

1.3 Spring MVC配置流程

  • 导入依赖:springioc的依赖spring-context、springwebmvc的依赖spring-webmvc、web的依赖jakarta.jakartaee-web-api即servlet得api
  • controller内自定义handler:
    • 加上注解@RequestMapping:向handlerMapping中注册的方法注解
    • @ResponseBody:直接返回string字符串给前端, 不要找视图解析器!
  • SpringMVC配置类:该配置类实现规范接口WebMvcConfigurer (该接口用于配置jsp对应的视图解析器)
    • 引入第三方依赖HandlerMapping 、HandlerAdapter方式:自动导入【⭐】;不添加,SpringMVC会自动检查并加载(因为@EnableWebMvc会自动加载经理&秘书);@Bean方式配置
    • 开启SpringMVC注解支持:@EnableWebMvc (handlerMapping、handlerAdapter加入到ioc容器、添加jackson转化器、具体添加jackson转化对象方法)===在 XML 配置使用 < mvc:annotation-driven >
  • 搭建SpringMVC环境:即相当于创建Spring IoC容器(该容器加载SpringMVC的配置类)
    用于指定service/mapper、springmvc配置类、dispatcherServlet的处理路径
    • 实现SpringMVC提供的接口AbstractAnnotationConfigDispatcherServletInitializer,该接口替代web.xml方案,实现完全注解方式。
    • Springmvc框架会自动检查当前类的实现类,会自动加载接口相关方法,getServletMappings:设置DispatherServlet对应处理的地址
  • 启动测试:打包到tomcat中,访问相应的地址。
    • WebApplicationInitializer:是上面AbstractAnnotationConfigDispatcherServletInitializer接口爷爷,每当web项目启动,就会自动调用该接口的onStartup,可以进行ioc容器初始化、dispactherServlet地址。如果没有这个那么需要在web.xml中配置servlet。

二、SpringMVC接收数据

2.1访问路径设置

@RequestMapping(value=“”, method= )
1、用来注解handler方法:关联请求的 URL 地址和处理请求的方式(handler方法),建立映射关系。SpringMVC接收指定请求,找到在映射关系中对应的方法来处理这个请求。
2、注解位置:类上——应用于该类下的所有方法;方法上:针对该handler方法有效,比如user在类上,login在方法上得到user/login完整路径。写在类上起了一个优化作用,方法上必加。
3、value属性:设置地址,可以不以/开头,但是@WebServlet必须以/开头

  • 精准地址:@RequestMapping(value = {“地址1”, “地址2”}),其中value可以省略
  • 模糊地址:* 任意一层字符串,** 任意层任意字符串

4、method属性:指定请求方式,SpringMVC 将HTTP协议定义的八种请求方式封装到下面这个枚举类。默认情况下只要地址正确,任何请求方式都可以访问。
如@RequestMapping(value=“login”, method=RequestMethod.POST) == @PostMapping(“login”)
两种写法是一样的效果,如果指定了请求方法不符合就会出现405异常!!
5、对应的进阶注解:@GetMapping、@PostMapping、@PutMapping、@PatchMapping、@DeleteMapping,进阶注解只能写在handler方法上。

枚举类

public enum RequestMethod {
  GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

2.2 接收参数(重点)param/路径/json

1、HTTP请求中的参数类型:param(?或/路径)、json,因此接收也按照这三种方式接收

  • param:不支持嵌套;支持简单数据类型:字符串、数值和布尔类型等;可以无序;被编码为 ASCII 码(如name=john doe→john%20doe);
  • json:支持嵌套;支持复杂数据类型:数组、对象等;要求必须有序;被编码为UTF-8;

2、不同数据类型的参数接收

  • param参数:形如url?name=xx&age=18
    • 直接接值:利用handler方法的形参列表接值,要求参数名 = 形参名,类型相同。
    • 绑定参数接值:如果参数名 != 形参名,利用注解@RequestParam将 Servlet 将请求参数(即查询参数或表单数据)绑定到控制器中的方法参数。
      注解@RequestParam:value指定绑定的请求参数名(只有这一个时可以直接写值);required默认true即要求请求参数必须传递;defaultValue为请求参数提供默认值
    • 一名多值:如多选框,使用该请求参数类型的list集合来接值,同时请求参数名=形参名,必须为对应形参添加注解@RequestParam,只有这样spingmvc才会将请求参数赋给定义的集合list。如果不加这个注解会将其中一个值放入会报类型异常错误!
    • 实体对象接值:定义一个接收参数的实体类需要get/set方法,该实体类作为形参接值,springmvc会将请求参数name和age映射到实体类属性上。要求实体类属性名=请求参数名!
  • 路径 参数接收:参数在路径上,访问路径不用指定参数名直接写值在地址上。形如url/value1/value2
    • 设计动态路径:@GetMapping(“user/{id}/{name}”)
    • 接收路径参数:@PathVariable将 /user/{id} 路径下的 {id} 映射到控制器方法的一个参数中。{动态标识}=形参名自动赋值,如果不等需要绑定参数接值。该注解的属性设置与@RequestParam一致。
      @PathVariable:处理路径传递参数;允许将 URL 中的占位符映射到控制器方法中的参数。
  • json 参数接收:前提定义了相关的实体类用于接收,属性名=请求参数名
    • 实现方式:@RequestBody 注解:当前方法接收 JSON 数据,并将其转换为 Java 对象传递给handler方法进行处理,value属性指示请求体应该映射到哪个参数上。
    • 出现问题:前端传json给后端接收会报异常,不支持json数据类型处理,没有json类型处理的工具(jackson)?
      • 原因:java原生api只支持路径参数和param参数,不支持json数据类型处理,json就是前端的格式。同时没有json类型处理的工具(jackson)
      • 解决:导入json处理的依赖jackson-databind→给springmvc配置类添加注解@EnableWebMvc即给handlerAdpater配置json转化器

2.3 接收cookie&请求头数据

1、接收cookie:接收http请求参数cookie
注解@CookieValue:将 HTTP Cookie 的值绑定到控制器中的方法参数。
2、请求头
@RequestHeader:将请求标头绑定到控制器中的方法参数

接收参数:param、路径、json、cookie、请求头

@Controller
@RequestMapping("param")
public class ParamController {
    /**
     * 前端请求: http://localhost:8080/param/value?name=xx&age=18
     * 1.1 param直接接值:要求: 参数名 = 形参名。出现乱码正常,json接收具体解决
     * @return 返回前端数据
     */
    @GetMapping(value="/value")
    @ResponseBody
    public String setupForm(String name,int age){
        System.out.println("name = " + name + ", age = " + age);
        return name + age;
    }
    //1.2 param绑定参数接值:@RequestParam,一些属性@RequestParam(value = "stuAge",required = false,defaultValue = "18"
    @GetMapping(value="/value")
	@ResponseBody
	public Object paramForm(@RequestParam("name") String name, 
	                        @RequestParam("age") int stuAge){
	    System.out.println("name = " + name + ", age = " + stuAge);
	    return name+stuAge;
	}
	/**前端请求: http://localhost:8080/param/mul?hbs=吃&hbs=喝
     * 1.3 param一名多值:list集合接值
     */
	 @GetMapping(value="/mul")
	 @ResponseBody
	 public Object mulForm(@RequestParam List<String> hbs){
	     System.out.println("hbs = " + hbs);
	     return hbs;
	 }
	//1.4 param实体类接值:需要定义用于接收参数的实体类
	@PostMapping(value = "/value")
    @ResponseBody
    public String addUser(User user) {
        // 在这里可以使用 user 对象的属性来接收请求参数
        System.out.println("user = " + user);
        return "success";
    }
    /**
    * 路径:/param/user/1/root  -> id = 1  uname = root
    * 2 路径参数接收:动态路径+接收路径参数
    */
    @GetMapping("/user/{id}/{name}")
	@ResponseBody
	public String getUser(@PathVariable Long id, @PathVariable("name") String uname) {
	    System.out.println("id = " + id + ", uname = " + uname);
	    return "user_detail";
	}
	/**
    * postman测试
    * 3 json接收:前提定义一个实体类用于接收json数据,
    */
	@PostMapping("/person")
	@ResponseBody
	public String addPerson(@RequestBody Person person) {//接收 JSON 数据,并将其转换为 Java 对象
	  // 在这里可以使用 person 对象来操作 JSON 数据中包含的属性
	  return "success";
	}
	/**cookie请求:JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
	* 4 @CookieValue 注释将 HTTP Cookie 的值绑定到控制器中的方法参数
	*/
	@GetMapping("/demo")
	public void handle(@CookieValue("JSESSIONID") String cookie) { 
	  //...
	}
	//5 请求头:@RequestHeader将请求标头绑定到控制器中的方法参数
	@GetMapping("/demo")
	public void handle(
	    @RequestHeader("Accept-Encoding") String encoding, 
	    @RequestHeader("Keep-Alive") long keepAlive) { 
	  //...
	}
}

2.4 原生Api对象获取(handler方法的形参/操作扩展)

网址:https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html
如果想要获取请求或者响应对象,或者会话等,可以直接在形参列表传入,并且不分先后顺序。接受原生对象,并不影响参数接收。
支持的控制器方法参数如下

控制器方法参数Description
@RequestParam访问 Servlet 请求参数param,参数值将转换为声明的方法参数类型
@PathVariable接收路径参数注解,需使用注解@GetMapping设计动态路径
@RequestBody用于访问 HTTP 请求正文。正文内容通过使用 HttpMessageConverter 实现转换为声明的方法参数类型。即json请求参数用实体类型接收(需导入json依赖、@EnableWebMvc注解开启支持json数据处理)
@CookieValue用于访问Cookie。Cookie 值将转换为声明的方法参数类型
@RequestHeader用于访问请求标头。标头值将转换为声明的方法参数类型
ServletRequest/ServletResponse请求/响应对象
HttpSession强制存在会话。这样的参数永远不会为 null
InputStream/Reader/OutputStream/Writer用于访问由 Servlet API 公开的原始请求/响应正文
Model/ModelMap共享域对象,并在视图呈现过程中向模板公开
Errors, BindingResult验证和数据绑定中的错误信息获取对象

2.5 共享域获取(实现不同web应用程序组件传递数据)

上面只是对如何接收参数进行了详细的描述,这里是对接收参数后,在不同的web应用程序的多个组件之间如何传递数据,比如controller层的不同组件之间如何传递数据?因此出现了共享域的概念,将数据保存在不同的共享域中,根据需要进行选择和使用。
1、共享域概念:在 Servlet 中存储数据,以便在同一 Web 应用程序的多个组件中进行共享和访问。相当于快递柜:作用范围、怎么存、怎么取?
共享域理解
2、共享域分类:

  • ServletContext:该对象可以在整个 Web 应用程序中共享数据。用于保存整个 Web 应用程序的全局配置信息、所有用户共享的数据。
  • HttpSession:该对象可以在同一用户发出的多个请求之间共享数据,但局限于同一个会话。比如保存用户登录状态,让用户在多个页面间保持登录状态。
  • HttpServletRequest:该对象可以在同一个请求的多个处理器方法之间共享数据。比如保存请求的参数和属性,让处理器方法之间可以访问这些数据。
  • PageContext:该对象是在 JSP 页面Servlet 创建时自动创建的。它可以在 JSP 的各个作用域中共享数据。包括作用域:pageScope、requestScope、sessionScope、applicationScope

3、springmvc获取不同级别的共享域

  • request级别共享域:model、modelMap、map、原生request对象——声明在handler方法的形参中;在handler方法中创建modelAndView对象。
  • session级别共享域:HttpSession 形参——声明在handler方法的形参中
  • application级别共享域:自动注入servletContext,springmvc会在初始化容器的时候,讲servletContext对象存储到ioc容器中!

2.6接收参数总结

接收参数用法总结

三、SpringMVC响应数据

3.1 handler方法分析&web开发模式

1、handler:一个controller的方法是控制层的一个处理器。

@GetMapping
public Object handler(简化请求参数接收){//参数列表只支持param参数,其余全部要对应的注解
    调用业务方法
    返回的结果 (页面跳转,返回数据(json))
    return 简化响应前端数据;
}

2、Web开发模式:

  • 前后端分离:前端的界面—接口分离—后端的业务逻辑。前端负责页面的呈现和用户交互,后端负责业务逻辑和数据存储。数据交互使用json/XML,提高效率,有利于代码重用和维护。
    相当于开发一个接口,就是针对接收的json和响应的json!!
  • 混合开发:前端和后端的代码集成在同一个项目中,共享相同的技术栈和框架。数据使用页面跳转方式。减少学习成本和部署难度,但是代码耦合性很高,维护和升级难度较大。
    前后端分离/混合框架开发

3.2 页面跳转控制(混合开发模式下)

1、jsp动态网页技术
JSP(JavaServer Pages)是一种动态网页开发技术,一种基于 Java 技术的 Web 页面制作技术。JSP 首次运行时会被转换为 Servlet,然后编译为字节码,从而可以启用 Just-in-Time(JIT)编译器,实现更高效的运行。JSP 支持多种标准标签库,包括 JSTL(JavaServer Pages 标准标签库)、EL(表达式语言)等,可以帮助开发人员更加方便的处理常见的 Web 开发需求。
在 HTML 中嵌入 Java 代码:生成动态页面,以便使用 Java 进行数据库查询、处理表单数据和生成 HTML 等动态内容;JSP 与 Servlet 结合:开发复杂的Web 应用程序。
2、开发跳转页面步骤
(1)导入jsp依赖servlet:jakarta.servlet.jsp.jstl-api
(2)创建jsp页面(html中嵌入java代码),其位置在webapp/WEB-INF/下,避免外部直接访问,因为jsp需要视图解析器处理后返回页面。用途:获取共享域的数据,动态展示页面。
tips:资源放在webapp下可以被外部直接访问。
(3)快速响应模板页面:①配置视图解析器需实现WebMvcConfig接口:配置jsp对应的视图解析器;②定义handler返回视图:方法返回值改成字符串类型(对应中间的视图名称),注意不能添加@ResponseBody(直接返回给浏览器,不找视图,不走视图解析器)
运行逻辑:外部访问handler方法定义的路径,handler方法返回视图并将参数放入共享域中,对应的试图解析器解析该视图调用相关的jsp页面,jsp页面从共享域中取值生成的页面有视图解析器返回给handler方法最终展示。
3、转发:修改handler方法的返回值即可。return “redirect:/demo”。显示第一个字源地址。
4、重定向:同上。return “forward:/demo”。显示最后一个字源地址。
不使用springmvc用request\response情况下:转发是项目下的资源跳转,路径可以忽略applicationContext,不用谢根路径,而重定向项目内外都可以,不能忽略。
使用springmvc情况下:默认会添加根路径,转发和重定向到项目下资源路径都是一样的,都不需要添加项目根路径,填写项目下路径即可。

3.3 返回json数据(前后端分离)【重点】

controller类添加注解@EnableWebMvc:将handlerMapping、handlerAdapter加入到ioc容器、添加jackson转化器、具体添加jackson转化对象方法
添加注解@ResponseBody:

  • 用于将handler方法return的对象序列化为 JSON 或 XML 格式的数据,并发送给客户端。即数据直接放入响应体返回,不会再走视图解析器。注意此时快速查找视图以及转发和重定向都不生效。
  • 位置:类/方法上。
  • 注解@RestController=@ResponseBody+@Controller

3.4 返回静态资源处理

1、静态资源定义:资源本身已经是可以直接拿到浏览器上使用的程度了,不需要在服务器端做任何运算、处理。典型的静态资源包括:纯HTML文件、图片、CSS文件、JavaScript文件
将静态资源放在webapp下的某个文件夹中,确保编译后存在。
2、问题:404错误!!因为DispatcherServlet 的 url-pattern 配置的是“/”,这表示整个 Web 应用范围内所有请求都由 SpringMVC 来处理。对 SpringMVC 来说,必须有对应的 @RequestMapping 才能找到处理请求的方法
3、请求流程:dispatcherServlet去handlerMapping中找有没有对应的handler,如果没有,就找不到返回404错误。
4、解决方法:在spring配置类中开启静态资源处理。但是其他原本正常的handler请求访问不了了,因此必须要添加注解@EnableWebMvc加入json处理器

//开启静态资源处理 :源码定义了转发行为,相当于二秘书!!
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

四、RESTFul风格设计和实战

4.1 RESTFul风格概述

1、RESTFul风格下的功能和对应接口设计
1、客户端和java程序通过Http协议传输。http协议:url(地址)、请求方式(get/put/delete/post)、传递参数(param/json/path)
2、RESTFul风格:一种基于Http和标准化的设计原则的软件架构风格——设计路径url、选择请求方式、请求参数。用于设计网络应用程序和服务之间的通信。

  • 作用:更好地设计HTTP协议的API接口
  • RESTFul风格特点:
    • 【要求】每个资源对应一个唯一的标识符。比如URI(统一资源标识符)或者一个 URL(统一资源定位符)。标准的HTTP协议请求:URL+请求方式确定具体的动作。路径设计从原来携带动标识,改成名词,对应资源的唯一标识即可!因为要求handler不一样的是地址+请求方式都不一样才是不一样。
    • 【要求】客户端使用符合HTTP协议定义的请求方式对服务端资源进行操作:GET(获取)、POST(新建/更新)、PUT(更新)、DELETE(删除资源) 。即根据接口的具体动作,选择具体的HTTP协议请求方式。
    • 资源的表现形式是XML或者JSON
    • 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。
  • RESTFul风格好处:
    • 含蓄、安全:具体数据名称不知
    • 风格统一:“/”划分哥哥单词,表达语义格式简单一致。
    • 无状态:在调用一个接口(访问、操作资源)时,可不用考虑上下文、当前状态。
    • 严谨规范:严格按照HTTP1.1协议中定义的请求方式本身的语义进行操作
    • 简介、优雅:之前CRUD需要设计4个不同URL,现在一个即可,只是请求方式不一样的而已。
操作传统风格REST风格URL 地址+ REST风格请求方式
保存/CRUD/saveEmp/CRUD/empPOST
删除/CRUD/removeEmp?empId=2/CRUD/emp/2DELETE
更新/CRUD/updateEmp/CRUD/empPUT
查询/CRUD/editEmp?empId=2/CRUD/emp/2GET

4.2 RESTFul风格实战

1、RESTFul风格下的功能和对应接口设计

功能接口和请求方式请求参数返回值
分页查询GET /userpage=1&size=10(param方式){响应数据}
用户添加POST /user{user 数据}(json方式){响应数据}
用户详情(根据id)GET user/1路径参数(路径方式){响应数据}
用户更新(根据id)PUT /user{user 更新数据}(json方式){响应数据}
用户删除(根据id)DELETE /user/1路径参数(路径方式){响应数据}
条件模糊(条件keyword 模糊关键字)GET /user/searchpage=1&size=10&keywork=关键字(param方式){响应数据}

为什么多条件模糊、分页查询使用请求参数传参param?查询用户详情使用路径传参?
查询单一资源使用路径传参可以明确指定资源;查询一个资源的集合即多条用户记录,使用请求参数可以通过组合不同参数来限制查询结果。
RESTFul风格下传递请求参数有多种方式:路径参数、请求参数、请求体。

  • 路径参数:指定资源的唯一标识或者ID。
  • 请求参数param:用于指定查询条件或者操作参数,请求参数限制在10个以内。
  • 请求体:敏感信息,最好使用POST和请求体来传递参数。
    GET、DELETE没有请求体传参方式,POST、PUT可以使用请求体传参方式。
    2、接口实现
    使用不同的注解@GETMapping来标识handler方法,参数列表的接收也实现对应的方式。

五、SpringMVC其他扩展

5.1 全局异常处理机制

异常:网络连接异常、数据格式异常、空指针异常等等
1、异常处理方式:

  • 编程式异常处理:在每个代码中编写处理异常的逻辑(检测及其处理),例如try-catch 块捕获异常,catch 处理代码,在 finally 执行一些清理操作。异常处理代码混杂在业务代码中,可读性较差。
  • 声明式异常处理:【推荐】将异常处理的逻辑从具体的业务逻辑中分离出来。为方法或类标注相应的注解(如 @Throws 或 @ExceptionHandler)。可以统一项目处理异常思路
    2、基于注解的声明式异常处理
  • 声明异常处理控制器类:使用注解@RestControllerAdvice = @ResponseBody(直接返回json字符串)+@ControllerAdvice (当前类的异常处理controller)。执行出现异常后会到响应的异常处理handler方法。
  • 声明异常处理hander方法:发生对应的异常会调用。普通的handler方法要使用@RequestMapping注解映射路径,发生对应的路径调用。
  • 配置文件扫描控制器类配置:确保异常处理控制类被扫描。

5.2 拦截器使用

1、拦截器:在程序中,使用拦截器在请求到达具体 handler 方法前,统一执行检测
只要有重复的就可以放在Filter中:登陆保护、权限处理…
在springmvc中只有一个servlet即DispatchServlet,外部请求先经过它,它再进行转发(秘书、经理、视图解析器),过滤器Filter只能在DispatchServlet之前拦截,但是springmvc提供了HandlerInterceptor可以在内部进行拦截(handler前后、视图解析器后)。

拦截器 Springmvc过滤器 javaWeb
相似点拦截请求,才能执行后续操作;对请求执行了必要操作后放请求过去,访问原本的资源
工作平台springmvc基础上Servlet容器中
拦截范围springmvc负责的请求web应用
ioc容器支持在 IOC 容器中,可以直接从 IOC 容器中装配组件需要调用专门的工具方法得到IOC 容器

2、拦截器使用:

  • 创建拦截器类:定义对应三个位置的拦截方法
  • 修改配置类SpringMvcConfig 添加拦截器:默认拦截全部、精准配置、排除配置
    3、多个拦截器作用&执行顺序:SpringMVC 会把所有拦截器收集到一起
  • preHandle() 方法:按照配置顺序。在handler执行之前(编码格式设置、登陆保护、权限处理),方法形参有请求对象、响应对象、要调用的方法对象。
  • postHandle() 方法:按照配置相反的顺序。handler执行完毕(对结果处理)。方法形参有请求对象、响应对象、要调用的方法对象、返回的视图和共享域数据。
  • afterCompletion() 方法:按照配置相反的顺序。整体处理完毕。方法形参有请求对象、响应对象、要调用的方法对象、异常对象。

5.3 参数检验

在表述层对数据进行检查,将错误的数据隔绝在业务逻辑层之外。
1、JSR 303: Java 为 Bean 数据合法性校验提供的标准框架,包含在 JavaEE 6.0 标准中。过在 Bean 属性上标注注解指定校验规则,并通过标准的验证接口对Bean进行验证。由Hibernate实现,springmvc支持这套实现。
易混注解:@NotNull包装类型不为null;@NotEmpty集合类型不为null;@NotBlank字符串不为null、“ ”。
2、参数校验实现

  • 导入依赖:java校验注解jakarta.jakartaee-web-api、hibernate校验及校验注解hibernate-validator及hibernate-validator-annotation-processor
  • 在实体上应用校验注解
  • handler标记和绑定错误收集:在handler方法得形参加上注解@Validated使验证注解生效。如果是param参数这样即可,如果是json还需要加注解@RequestBody 。
    如果不符合校验规则,会直接向前端抛出异常。但是想接收错误绑定信息,自定义返回结果:在handler方法形参(校验对象, BindingResult sult),要求bindingResult必须紧挨着校验对象!再在handler方法中定义result.harError(表示是否有绑定错误)判断自定义返回错误信息。handler方法如下:
  @PostMapping("save")
//在实体类参数和 BindingResult 之间不能有任何其他参数, BindingResult可以接受错误信息,避免信息抛出!
public Object save(@Validated @RequestBody User user, BindingResult result){
    //判断是否有信息绑定错误! 有可以自行处理!
    if (result.hasErrors()){
        System.out.println("错误");
        String errorMsg = result.getFieldError().toString();
        return errorMsg;
    }
    //没有,正常处理业务即可
    System.out.println("正常");
    return user;
}

六、SpringMVC总结

核心点掌握目标
springmvc框架主要作用、核心组件、调用流程
简化参数接收路径设计、参数接收、请求头接收、cookie接收
简化数据响应模板页面、转发和重定向、JSON数据、静态资源
restful风格设计主要作用、具体规范、请求方式和请求参数选择
功能扩展全局异常处理、拦截器、参数校验注解
  • 32
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值