重学SpringBoot. step5 再学SpringMVC
SpringMVC
虽然说的是SpringBoot,但把SpringMVC将的很好,正是SpringMVC应用到SpringBoot中非常典型的应用方式。
多数SpringBootWeb的项目,都是用MVC,在SpringBoot的应用中,MVC变得极为简单,其不再需要单独的配置文件,要添加资源的映射和拦截器,跨域的配置,都可以通过实现WebMvcConfigurer,然后再其实实现相应的 方向即可添加这些自定义的功能。
处理器映射
最常用的五个请求类型:GET,POST,DELETE,PUT,OPTIONS
http有很多个请求类型,目前我只用过这五个。
一个协议对象的注解为
@RequstMapping("path")
@GetMapping,@PostMapping,@DeleteMapping @PutMapping
上面这五个注解的用法是一样的,但RequestMapping默认可以接收到五个请求类型,特定的请求类型需要使用特定的请求类型注解,Request也可以指定请求类型
@RequestMapping(value = "user",method = RequestMethod.DELETE)
其实这些都不是重点,你不能指望这篇文章提高你的MVC基础水平。
书中大量引用了URL参数,但这是不推荐的,固定的资源可以用URL路径传递值,动态的数据则使用POST进行请求。
自定义参数转换规则
第一,知道有这个东西,第二,知道怎么用。
需求:将Request请求的参数转成对象,1-username
Path参数,Request参数,都可以在自己的规则进行转换
http://localhost:8083/user/convert/1-man
http://localhost:8083/user/convert/user=1-man
@GetMapping("/convert/{user}")
public User stringToUser(@PathVariable("user") User user){
return user;
}
下面是转换时候用的类,他会自动注入到容器中,供使用
@Component
public class StringToUserConvertor implements Converter<String, User> {
@Override
public User convert(String source) {
String[] split = source.split("-");
System.out.println(source+" : source");
return new User().setUserName(split[1]).setId(Long.parseLong(split[0]));
}
}
返回的值就是,转换的类的类名
数据验证
首先你需要知道一些基础的注解
@NotNull @Future @DateTimeFormat
@DecimalMin
@Min @Max
@NotEmpty @Range(min=1,max10)
@Email @Size @Length
这些注解都有一个属性为message,就是报错之后需要传递的属性
然后就是自定义校验器
public class UserValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return clazz.equals(User.class);
}
@Override
public void validate(Object target, Errors errors) {
if(target == null){
errors.rejectValue("matherfather",null,"不能为空");
return;
}
User user = (User) target;
if(StringUtils.hasText(user.getUserName())){
errors.rejectValue("username 会不会吗?",null,"UserName只能为空啊,你会不会写?");
}
}
}
自定义的验证需要添加到WebDataBinder内,才则绑定成功
@InitBinder
public void initBinder(WebDataBinder webDataBinder){
webDataBinder.setValidator(new UserValidator());
}
拦截器
拦截器会根据添加的顺序进行执行,拦截器执行完后,需要返回一个boolean类型的值 ,如果为true则继续执行,为false则停止。
整体而言,是一个拦截器链,但会根据拦截器的执行 顺序。
拦截器有三个方法,分别是拦截前(preHandler),拦截后(postHandler),请求完成(afterHandler)
拦截器的实现就是实现 HandlerInteceptor,并且可以给对应的拦截器添加匹配的拦截规则
class TestInteceptor implements HandlerInteceptor{
...
}
// 需要添加到WebMvcConfigurar的实现类中
class TestConfig implements WebMvcConfigurar{
addInteceptors(InteceptorRegistry registry){
registry.addInteceptor(new TestInteceptor());
}
}
重学SpringBoot. step5 再学SpringMVC的更多相关文章
- 不要再学 JSP 了,学 SpringBoot + Thymeleaf + Vue吧
老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 读 ...
- 【C】 01 - 再学C语言
“C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了”.这样说不无道理,这门古老的语言以其简单的语法.自由的形式的而著称.使用C完成工作并不会造成太大困扰,所以很少有 ...
- [Python]再学 socket 之非阻塞 Server
再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...
- 再学Java 之 interface的成员变量
前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然 ...
- 【快学SpringBoot】Spring Cache+Redis实现高可用缓存解决方案
前言 之前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,我们需要一个高可用的. ...
- 【快学springboot】13.操作redis之String数据结构
前言 在之前的文章中,讲解了使用redis解决集群环境session共享的问题[快学springboot]11.整合redis实现session共享,这里已经引入了redis相关的依赖,并且通过spr ...
- 【快学springboot】12.实现拦截器
前言 之前在[快学springboot]6.WebMvcConfigurer配置静态资源和解决跨域里有用到WebMvcConfigurer接口来实现静态资源的映射和解决跨域请求,并且在文末还说了Web ...
- 【快学springboot】8.JPA乐观锁OptimisticLocking
介绍 当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的.为此,我们可以使用Java Persistence API提供的乐观锁定机制.它导致在同一时间对同一数据进行多次更新不会相互干扰 ...
- 【快学springboot】4.接口参数校验
前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...
- Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。
Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到版权问题. 1.显示日期的 ...
随机推荐
- C#文件路径
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Run ...
- Go语言核心36讲33
我们在前几次讲的互斥锁.条件变量和原子操作都是最基本重要的同步工具.在Go语言中,除了通道之外,它们也算是最为常用的并发安全工具了. 说到通道,不知道你想过没有,之前在一些场合下里,我们使用通道的方式 ...
- dlv远端调试go的问题
1.golang采用dlv 时提示 "could not launch process: could not open debug info " 在用dlv 远程debug 代码时 ...
- 基于Spring-AOP的自定义分片工具
作者:陈昌浩 1 背景 随着数据量的增长,发现系统在与其他系统交互时,批量接口会出现超时现象,发现原批量接口在实现时,没有做分片处理,当数据过大时或超过其他系统阈值时,就会出现错误.由于与其他系统交互 ...
- extern "C"的使用
在使用C++开发程序时,有时使用到别人开发的第三方库,而这第三库是使用C开发的.直接使用会报错如下: cpp error LNK2019: 无法解析的外部符号 "int __cdecl su ...
- 动态规划篇——DP问题
动态规划篇--DP问题 本次我们介绍动态规划篇的DP问题,我们会从下面几个角度来介绍: 区间DP 计数DP 树状DP 记忆化搜索 区间DP 我们通过一个案例来讲解区间DP: /*题目展示*/ 题目名: ...
- 关于mysql数据库user表没有password字段
解决 这个是因为mysql的版本问题,是mysql 5.7版本出现的,具体是mysql 5.7.x 开始变化的我不知道 新的字段变更为authentication_string 修改密码的方式还是和原 ...
- ThinkPHP6.0在phpstorm添加查询构造器和模型的代码提示
ThinkPHP6.0升级后 使用查询构造器和模型都没有了提示 原因是tp6源码中没有添加注释 找到Model.php * @method Query where(mixed $field, stri ...
- python 之excel文件读取封装
import os import xlrd PATH = lambda p: os.path.abspath( os.path.join(os.path.dirname(__file__), p) ) ...
- redis(二)
Redis简单使用 一. Redis的安装 Redis作为一款目前这个星球上性能最高的非关系型数据库之一. 拥有每秒近十万次的读写能力. 其实力只能用恐怖来形容. mac版本, brew: https ...