重学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.显示日期的 ...
随机推荐
- Ajax基础(中)
这节主要在上节的基础上学会如何使用Ajax 源码下载: 链接:https://pan.baidu.com/s/1kG-vACFxneAZqONdo97XrQ 提取码:k21y 在WebStorm中打开 ...
- Jenkins发版通知企业微信机器人
1)开始通知 在Jenkins发版过程的第一步添加下面内容,调用下面脚本实现机器人发版通知(注意脚本路径和传参) ${BUILD_USER}是Jenkins内置变量,执行发布的用户名,需要安装插件-B ...
- Xtrabackup使用帮助
目录 1.安装工具 2.下载后上传到需要备份的服务器 全备 1.安装完成后我们进行数据库备份执行以下命令 2.查看备份的数据 3.进入数据库,删除一个测试库 4.删除school库 5.备份数据目录 ...
- 重学c#系列——动态类型[二十二]
前言 该系列准备继续完善,一共108篇,持续更新. 正文 为什么有动态类型呢? 是因为很多东西天生就是动态类型的. 比如xml 和 json.cvs.数据库表,这些本来就是数据类型的. 在反射系列中提 ...
- Pinely Round 1 (Div. 1 + Div. 2)
比赛链接 A 题意 构造两个长为 \(n\) 排列,使得两排列有长为 \(a\) 公共前缀和长为 \(b\) 的公共后缀. 题解 知识点:构造. 注意到,当 \(a+b\leq n-2\) 时,中间段 ...
- Leetcode-SQL学习计划-SQL入门-1527.患某种疾病的患者【regexp正则表达式匹配】
链接:https://leetcode.cn/problems/patients-with-a-condition/ -- 1527.患某种疾病的患者 -- 链接:https://leetcode.c ...
- MySQL空间暴涨150G导致锁定,发生了什么
背景 12月1号中午突然收到大量报警,某客户环境操作数据库大量失败,报错信息如下图所示: 这个报错我是第一次见,一时间有点无所适从,但是从字面意思来看是MySQL目前处于LOCK_WRITE_GROW ...
- vba 数组判断与转换
Private Function CountArr(arr)'*****************************'计算数组是几维数组'***************************** ...
- MySQL函数--时间格式--流程控制if判断
目录 一:函数 1.MySQL什么是函数? 2.通过help查看函数帮助 3.移除指定字符 4.大小写转换 5.获取左右起始指定个数字符 6.返回读音相似值(对英文效果) 二:时间格式实战案例 1.时 ...
- HTTP协议图文简述--HTTP/HTTPS/HTTP2
01.准备 1.1.先了解下网络模型/TCP HTTP 连接是建立在 TCP* 协议之上的,其数据传输功能是由TCP完成的,那TCP又是什么呢? TCP 是一个单纯用来建立通信连接,并传输数据的基础协 ...