SpringMVC

参考:《深入浅出 SpringBoot 2.X》

虽然说的是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的更多相关文章

  1. 不要再学 JSP 了,学 SpringBoot + Thymeleaf + Vue吧

    老读者就请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 读 ...

  2. 【C】 01 - 再学C语言

    “C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了”.这样说不无道理,这门古老的语言以其简单的语法.自由的形式的而著称.使用C完成工作并不会造成太大困扰,所以很少有 ...

  3. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

  4. 再学Java 之 interface的成员变量

    前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然 ...

  5. 【快学SpringBoot】Spring Cache+Redis实现高可用缓存解决方案

    前言 之前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,我们需要一个高可用的. ...

  6. 【快学springboot】13.操作redis之String数据结构

    前言 在之前的文章中,讲解了使用redis解决集群环境session共享的问题[快学springboot]11.整合redis实现session共享,这里已经引入了redis相关的依赖,并且通过spr ...

  7. 【快学springboot】12.实现拦截器

    前言 之前在[快学springboot]6.WebMvcConfigurer配置静态资源和解决跨域里有用到WebMvcConfigurer接口来实现静态资源的映射和解决跨域请求,并且在文末还说了Web ...

  8. 【快学springboot】8.JPA乐观锁OptimisticLocking

    介绍 当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的.为此,我们可以使用Java Persistence API提供的乐观锁定机制.它导致在同一时间对同一数据进行多次更新不会相互干扰 ...

  9. 【快学springboot】4.接口参数校验

    前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...

  10. Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。

    Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们. 这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到版权问题. 1.显示日期的 ...

随机推荐

  1. 【翻译】Spring Security - 如何解决WebSecurityConfigurerAdapter类已被弃用的问题?

    原文链接:Spring Security - How to Fix WebSecurityConfigurerAdapter Deprecated 原文作者:Nam Ha Minh 原文发表日期:20 ...

  2. C#面试题基础

    1.什么是GAC,他的作用是什么? 我的这篇文章有详细的介绍 https://www.cnblogs.com/zxtang/p/14313273.html 2.描述一个被protected inter ...

  3. K8s集群环境搭建

    K8s集群环境搭建 1.环境规划 1.1 集群类型 Kubernetes集群大体上分为两类:一主多从和多主多从 一主多从:一台master节点和多台node节点,搭建简单,但是有单机故障风险,适用于测 ...

  4. 【OpenStack云平台】openstack命令行管理之环境变量设置

    上传镜像(glance组件) glance 可以使用以下参数: ps:这些参数不是100%都需要的我们在上传镜像更加我们需求选择相对应的参数就好了 –id <IMAGE_ID> #镜像的I ...

  5. Destination folder must be accessible

    问题 Ecplise拖入文件夹项目时提示错误:Destination folder must be accessible 解决 导入的时候包不能直接拖入,要使用import导入,选择File-> ...

  6. [排序算法] 2路插入排序 (C++)

    前言 本文章是建立在 插入排序 的基础上写的,如果还有不懂 插入排序 的童鞋先停下脚步,可以先看看这里~ 直接/折半插入排序 2路插入排序解释 在 插入排序 中,当待插入元素需要插入的位置位于当前有序 ...

  7. i春秋wanna to see your hat?

    打开题目网页发现是个选择帽子的网页,点击超链接进入一个网页让我们输入我们的name然后匹配帽子颜色(其实不管怎么填都是绿色的)这里也有个注册窗口 先查看源码没什么特别发现,再试试抓包吧 在这个界面抓包 ...

  8. 银河麒麟V10 SP1服务器操作系统-单用户模式与救援模式调试方法

    单用户模式 单用户模式:该模式下系统并没有完全运行进来,只是部分程序运行,包括网络服务,ssh服务等部分服务未运行,因此无法通过远程登录到操作系        统.进入单用户方式进行系统维护由是ROO ...

  9. 重新认识下JVM级别的本地缓存框架Guava Cache(2)——深入解读其容量限制与数据淘汰策略

    大家好,又见面了. 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面.如果感兴趣,欢迎关注以获取后续更新. 通过<重新认识下JVM级别的本地 ...

  10. Selenium4+Python3系列(八) - Cookie、截图、单选框及复选框处理、富文本框、日历控件操作

    我所在的城市昨天出了近20+的阳性案例,但这丝毫没有 "影响" 到996的工作时间,当然,也没有影响到我想继续更新文章的决心. 一.cookie常用操作入门 上一篇有写过关于coo ...