Spring MVC

1.关于Spring MVC

Spring MVC是基础spring框架基础之上,主要解决了后端服务器接收客户端提交的请求,并给予响应的相关问题.

MVC=Model+View+Controller

  • Model:数据模型,通常由业务逻辑层(Service Layer)和数据访问层(Data Access Object Layer)构成

  • View:视图

  • Controller:控制器

MVC只关心V-C之间的交互

2.创建Spring MVC工程

可参考IDEA-Tomcat

3.使用Spring MVC工程接收客户端的请求

在pom.xml中添加spring-webmvc

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.14</version>
</dependency>
​

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
​

2个配置类,一个Spring配置类,一个Spring MVC配置类( 实现WebMvcConfigurer接口)

项目初始化类,必须继承AbstractAnnotationConfigDispatcherServletInitializer

控制器类,用于接收客户端的某个请求,并予以响应结果

  • 当启动Tomcat时,会自动将项目打包并部署到Tomcat,通过自动打开的浏览器中的URL即可访问主页.

  • 启动Tomcat,项目就会自动创建并加载AbstractAnnotationConfigDispatcherServletInitializer的子类,即当前项目中自定义的SpringMvcInitialier,无论这个类放在哪个包中,都会自动创建并加载,由于会自动调用这个类中所有方法,所以会将Spring MVC框架处理的请求路径设置为 *.do,并执行对 cn.tedu.springmvc 的组件扫描,进而会创建 UserController 的对象,由于在 UserController 中配置的方法使用了 @RequestMapping("/login.do"),则此时还将此方法与/login.do进行了绑定,以至于后续随时访问/login.do时都会执行此方法

  • 注意:组件扫描必须配置在SpringMVc的配置类中

  • 注意:控制类的注解必须是@Controller,不可以是其他组件扫描注解

4.关于@RequestMapping注解

主要作用:配置请求路径与处理请求方法的映射关系

注解添加在控制器的方法之前或者控制器类上

@RequestMapping配置请求路径,请求方式,请求头,响应头

RequestMethod请求方式
GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。  
POST(CREATE):在服务器新建一个资源,调用insert操作。  
PUT(UPDATE):在服务器更新资源,调用update操作。  
DELETE(DELETE):从服务器删除资源,调用delete语句

不配置mothod则表示可以使用任何请求

GET, HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE;

Spring MVC框架还提供了@RequestMapping的相关注解

只能加在方法上面,限定请求方式
@DeleteMapping
@GetMapping
@PostMapping
@PutMapping

小结:

类上使用@RequestMapping,方法 上使用@GetMapping, @PostMapping等注解

5.关于@ResponseBody注解

@ResponseBody:响应正文

  • 配置"响应正文",则处理请求的方法的返回值则会直接发送到客户端

  • 不配置"响应正文",则处理请求的方法的返回值表示"视图组件的名称",当方法返回后,服务器不会直接响应,会根据视图组件的名称"在服务器找到对应的视图组件(不推荐,不是前后端分离)

将@ResponseBody添加到类上,所有方法都可以使用

Spring MVC还提供@RestController同时具有@ResponseBody和@Controller

Spring MVC内置了一系列的转换器(Converter) ,用于将方法的返回值转换为响应到客户端的数据,并且Spring

MVC会根据方法的返回值不同,自动选取某个转换器

不使用String作为处理请求的返回值类型

建议向客户端响应JSON格式的字符串,需要添加jackson-databind依赖

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>
​

jackson-databind依赖项中也有一个转换器,当SpringMVC调用的处理请求方法的返回值是SpringMVC没有默认匹配的转换器时,会自动使用jackson-databind转换器,jackson-databind转换器会解析方法的返回值,并就其处理为JSON格式的字符串,在响应头中将Content-Type设置为application/json

注意:在Spring MVC中,需要在SpringMVC配置类上添加@EnableWebMvc注解,否则响应时会导致出现HTTP406错误

6.接收请求参数

将各参数直接声明为处理请求的方法的参数

  • 客户端提交的请求中没有匹配名称的参数,获取到的是null

  • 客户端提交了参数名称,却没有值,获取到的是""(长度为0的空串)

  • 客户端提交了匹配的参数名称,且值是有效的,则可以获取到值

声明参数时:参数尽量使用包装类,使用基本类型会出现IllegalStateException

400:参数错误或者参数未提交

404:资源不存在

405:请求参数错误

406:头部错误

@RequestParam

  • 配置name属性:协调名称不统一

  • 配置required属性:默认为true,要求客户端必须提交请求参数

  • 配置defaultValue属性:当客户的没有提交参数时,使用默认值

参数较多时,将参数封装成数据类型,把数据类型作为参数

封装后使用Validation,不适用RequestParam

可以结合使用,一部分参数声明,一部分封装

7.RestFul

RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

资源:互联网所有的事物都可以被抽象为资源 资源操作:分为POST、DELETE、PUT、GET四种方法,使用不同方法对资源进行操作(增、删、改、查)

http方法资源操作幂等安全
GETSELECT
POSTINSERT
PUTUPDATE
DELETEDELETE

幂等性:对同一REST接口的多次访问,得到的资源状态是相同的。

安全性:对该REST接口访问,不会使服务器端资源的状态发生改变。

RestFul的设计风格典型表现就是:将某些唯一特征的请求参数

放在URL中,而不是放在URL的参数中

https://blog.csdn.net/weixin_46594796/article/details/114673114

在使用{}格式的占位符时,还可以结合正则表达式进行匹配,其基本语法是:

{占位符名称:正则表达式}

占位符的做法并不影响精准匹配的路径

8.关于响应正文的结果类型

当响应正文时,只要方法的返回值是自定义的数据类型,则Spring MVC框架一定会调用jackson-databind的转换器,就可以将结果转换为JSON格式的字符串.

类中用到了泛型,类的声明上就得有

静态方法(static方法)使用了泛型,静态方法声明得有泛型

100:就绪
​
200:成功
​
301 / 302:重定向
​
400:请求参数有误
401:后续学习再讲
403:后续学习再讲
404:请求资源不存在
405:请求方式错误
406:请求头不可接受
​
500:服务器内部错误

9.统一处理异常

自定义方法对异常进行处理,关于此方法

  • 注解:需要添加ExceptionHandler注解

  • 访问权限:应该是公有的

  • 放回值类型:可参考处理请求的方法的返回值类型

  • 方法名称:自定义

  • 参数列表:必须包含1个异常类型的参数,按需添加HttpServletRequest,HttpServletResponse等少量的特定类型参数,不可随意添加参数

//异常处理方法
@ExceptionHandler
public String handlerException(NullPointerException e){
    return "Error NullPointerException!";
}

将处理异常的代码放在专门的类中

在此类中添加@ControllerAdvice(@RestControllerAdvice)

可以将处理异常的方法放到所有控制器公共的父类中,让所有控制器继承

@RestControllerAdvice
public class GlobalExceptionHandler {
    //异常处理方法
    @ExceptionHandler({NullPointerException.class,ClassCastException.class})
    public String handlerNullPointerException(Throwable e){
        e.printStackTrace();
        return "Error NullPointerException or ClassCastException!";
    }
    @ExceptionHandler
    public String handlerThrowable(Throwable e){
        e.printStackTrace();
        return "Error Throwable!";
    }
​
}

10.拦截器Interceptors

拦截器可以运行在所有控制器处理请求之前和之后的一种组件.

目的并不是"拦截下来阻止运行",而且"拦截下来执行某些代码",其优势在于可作用于若干种不同的的请求的处理过程

使用拦截器需要自定义类,

  • 运行在处理请求之前,可以选择对当前请求进行阻止或放行

每个拦截器都必须注册才能被启用,注册过程通过重写WebMvcConfigureraddInterceptors方法

addPathPatterns拦截什么
excludePathPatterns除之外

11.SpingMVC的小结

  • 理解Spring MVC框架作用

    • 接收请求,响应结果,处理异常....

  • 掌握创建基于Maven的运行在Tomcat的webapp

  • 认识基础的依赖项

    • spring-contextjavax.servlet-apijackson-databind

  • 掌握配置SpringMVC的运行环境(使得控制器能接收请求)

  • 掌握以下注解的使用

    • @Controller /@RestController

    • @ResponseBody

    • @RequestMapping@GetMapping@PostMapping

    • @RequestParam/@PathVariable

    • @Exceptionhandler/@ControllerAdvice/@RestControllerAdvice

    • @EnableWebMvc

  • 掌握接收请求参数的方式

    • 将请求参数直接声明在参数列表

    • 将若干个请求参数进行封装,并将封装的类型声明在参数列表中

    • 如果是URL中的路径,需要使用@PathVariable

  • 掌握响应JSON格式的正文

    • 处理请求的方法必须添加@ResponseBody,或当前控制器类添加@ResponseBody,或当前控制器类添加@RestController

    • 在SpringMVC配置类上添加@EnableWebMvc

    • 在项目的pom.xml中添加jackson-databind

    • 处理请求的方法返回自定义的数据类型

  • 掌握响应JSON格式的正文,统一的响应类型的类的设计

  • 了解Restful风格

  • 掌握统一处理异常

  • 掌握拦截器的创建与配置

附:关于POJO

继承是一种利用已有的类快速创建新的类的机制

POJO:所有用于封装属性的类型都可以统称为POJO

常见的POJO后缀:BO,DO,VO,DTO

VO/DTO 就是Value Object和Data Transform object就是作为数据使用的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值