Spring MVC框架2(spring MVC框架的核心类以及三大组件)
ccwgpt 2024-09-26 07:48 33 浏览 0 评论
RESTful基础
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以 使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作 为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型 为新增、变更、删除所调用资源
RESTful只是一种设计风格,并不是一种规定,也没有明确的或统 一的执行方式
RESTful的设计风格的典型表现就是:将某些唯一的请求参数的值放在 URL中,使之成为URL的一部分,例如:
// – https://www.zhihu.com/question/28557115
//– 这个URL的最后一部分28557115应该就是这篇贴子的id值,
//而不是使用 例如?id=28557115这样的方式放在URL参数中。
在开发实践中,以处理用户数据为例,可以将URL 设计为:
- – /users:查看用户列表
- – /users/9527:查询id=9527的用户的数据
- – /users/9527/delete:删除id=9527的用户的数据
RESTful建议根据希望实现的数据操作不同而使用不同的请求方式:
通过学习,HTTP请求方式包括:GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
- – 查询:使用GET请求
- – 新增:使用POST请求
- – 修改:使用PUT请求
- – 删除:使用DELETE请求
在开发实践中,仅使用GET、POST这2种请求方式的做法更为常见,主要因为:
- – 某些业务可能非常复杂,可能同时需要执行增、删、改、查的多种数据操作,不便于界定使用POST、DELETE、PUT、GET请求方式中的哪一种
- – 大部分开发者更习惯于只使用GET、POST这2种请求方式
通常,以查询为主要目标的请求使用GET请求方式,否则,使用POST请求方式
在RESTful风格的URL中,大多是包含了某些请求参数的值,在使用 Spring MVC框架时,当需要设计这类URL时,可以使用{名称}进行占位, 并在处理请求的方法的参数列表中,使用@PathVariable注解请求参数, 即可将占位符的实际值注入到请求参数中!
// /user/3/info.do
@GetMapping("/{id}/info.do")
public UserVO info(@PathVariable Long id) {
System.out.println("即将查询 id = " + id + " 的用户的信息……");
UserVO userVO = new UserVO();
userVO.setUsername("cc");
userVO.setPassword("12345678");
userVO.setEmail("123@qq.com");
return userVO;
}
【提示】在以上代码中,URL中使用的占位符是{id},则方法的参数名称也 应该是id,就可以直接匹配上!如果无法保证这2处的名称一致,则需要 在@PathVariable注解中配置占位符中的名称,例如:
@GetMapping("/{userId}/info.do")
public UserVO info(@PathVariable("userId") Long id) {
// ...
}
在使用{}格式的占位符时,还可以结合正则表达式进行匹配,其基本语法是:
{占位符名称:正则表达式}
//当设计成以上URL时,仅当占位符位置的是纯数字的URL才会被匹配上,
//如果不是纯数字的刚出现404错误页面。
@GetMapping("/{id:[0-9]+}/info.do")
@GetMapping("/{id:[0-9]+}/info.do")
public UserVO info(@PathVariable Long id) {
System.out.println("即将查询 id = " + id + " 的用户的信息……"); // ...
}
@GetMapping("/{username:[a-zA-Z]+}/info.do")
public UserVO info(@PathVariable String username) {
System.out.println("即将查询 用户名 = " + username + " 的用户的信息……"); // ...
}
@GetMapping("/{id:[0-9]+}/info.do")
public UserVO info(@PathVariable Long id) {
System.out.println("即将查询 id = " + id + " 的用户的信息……"); // ...
}
@GetMapping("/{username:[a-zA-Z]+}/info.do")
public UserVO info(@PathVariable String username) {
System.out.println("即将查询 用户名 = " + username + " 的用户的信息……"); // ...
}
// http://localhost:8080/springmvc01_war_exploded/user/list/info.do
@GetMapping("/list/info.do") public UserVO list() {
System.out.println("即将查询 用户的列表 的信息……"); // ...
}
如果使用/user/list/info.do,则会匹配到以上代码中的最后一个 方法,并不会因为这个URL还能匹配第2个方法配置的{username:[a-zA- Z]+}而产生冲突,所以,使用了占位符的做法并不影响精准匹配的路径
RESTful的小结(需要掌握的知识点)
- RESTful是一种风格,并不是规范或标准
- RESTful的典型表现有: – 将某些唯一的请求参数的值放在URL中,使之成为URL的一部分 – 根据希望实现的数据操作不同而使用不同的请求方式
- 将请求参数设计到URL中时,可以在@RequestMapping或 相关注解配置URL时使用{名称}进行占位
- 在处理请求的方法的参数列表中,为占位符对应的参数添加 @PathVariable,Spring MVC会自动获取URL中的值注入到参数中
- 当占位符中的名称与方法参数的名称不一致时,需要配置 @PathVariable注解的参数
- 在URL的占位符中,可以使用正则表达式限制占位符的文本格式,不冲突的多个使用了正则表达式的相同格式URL可以共存
- 使用了正则表达式的占位符的,与不使用占位符的,相同格 式的URL可以共存,且优先匹配到不使用占位符的
响应正文的结果类型
当响应正文时,只要方法的返回值是自定义的数据类型,则Spring MVC 框架就一定会调用jackson-databind中的转换器,就可以将结果转换为JSON格式的字符串
通常,在项目开发中,会定义一个“通用”的数据类型,无论是哪个控制 器的哪个处理请求的方法,最终都将返回此类型
public class JsonResult<T> {
private Integer state; // 业务返回码
private String message; // 消息
private T data; // 数据
// Setters & Getters
private JsonResult() { }
public static JsonResult<Void> ok() { return ok(null); }
public static <T> JsonResult<T> ok(T data) {
JsonResult<T> jsonResult = new JsonResult<>();
jsonResult.state = State.OK.getValue();
jsonResult.data = data;
return jsonResult;
}
public static JsonResult<Void> fail(State state, String message) {
JsonResult<Void> jsonResult = new JsonResult<>();
jsonResult.state = state.getValue();
jsonResult.message = message;
return jsonResult;
}
public enum State {
OK(20000),
ERR_USERNAME(40400),
ERR_PASSWORD(40600);
Integer value; State(Integer value) {
this.value = value;
}
public Integer getValue() { return value; }
}
}
统一处理异常
Spring MVC框架提供了统一处理异常的机制,使得特定种类的异常对应 一段特定的代码,后续,当编写代码时,无论在任何位置,都可以将异常直接抛出,由统一处理异常的代码进行处理即可
– 无论哪种异常(包括RuntimeException及其子孙类异常),只要没有显式的使用 try...catch语法进行捕获并处理,均视为抛出
关于统一处理异常,需要自定义方法对异常进行处理,关于此方法:
- – 注解:必须添加@ExceptionHandler注解
- – 访问权限:应该是公有的
- – 返回值类型:可参考处理请求的方法的返回值类型
- – 方法名称:自定义
- – 参数列表:必须包含1个异常类型的参数,并且可按需添加HttpServletRequest、 HttpServletResponse等少量特定的类型的参数,不可以随意添加参数
@ExceptionHandler
public String handleException(NullPointerException e) {
return "Error, NullPointerException!";
}
//注意:以上处理异常的代码,只能作用于当前控制器类中各个处理请求的 方法,
//对其它控制器类的中代码并不产生任何影响,
//也就无法处理其它控 制类中处理请求时出现的异常!
为保证更合理的处理异常,应该:
- – 将处理异常的代码放在专门的类中
- – 在此类上添加@ControllerAdvice注解
- – 由于目前主流的响应方式都是“响应正文”的,则可以将@ControllerAdvice替换为 @RestControllerAdvice
//创建GlobalExceptionHandler类
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler public String handleException(NullPointerException e) {
return "Error, NullPointerException!";
}
}
处理的方法的参数中的异常类型,就是Spring MVC框架将统一处理的异常类型,例如将参数声明为Throwable类型时,所有异常都可被此方法进行处理!但是,在处理过程中,应该判断当前异常对象所归属的类型,以针对不同类型的异常进行不同的处理
Spring MVC允许存在多个统一处理异常的方法,这些方法可以在不同的 类中,只要处理的异常的类型不冲突即可(允许继承)
- – 如果有2个或多个方法都处理NullPointerException,是错误的
- – 如果同时存在2个方法,分别处理NullPointerException和 RuntimeException,是允许的
//多个方法处理异常
@ExceptionHandler
public String handleNullPointerException(NullPointerException e) {
return "Error, NullPointerException!";
}
@ExceptionHandler
public String handleNumberFormatException(NumberFormatException e) {
return "Error, NumberFormatException!";
}
@ExceptionHandler
public String handleThrowable(Throwable e) {
e.printStackTrace();
return "Error, Throwable!";
}
在开发实践中,通常都会有handleThrowable()方法(方法名是自定义 的),以避免某个异常没有被处理而导致500错误!
– 此方法中应该输出异常的相关信息,甚至跟踪信息,否则,当程序运行此至处时,可 能不便于观察、分析、记录出现异常
@ExceptionHandler注解还可用于配置被注解的方法能够处理的异常的类型,其效力的优先级高于在方法的参数上指定异常类型
在开发实践中,建议为每一个@ExceptionHandler配置注解参数,在注 解参数中指定需要处理异常的类型,而处理异常的方法的参数类型只需要包含@ExceptionHandler配置的类型即可,甚至可以是Throwable
//使用{}同时捕获多个异常进行处理
@ExceptionHandler({ NullPointerException.class, ClassCastException.class })
public String handleNullPointerException(Throwable e) {
return "Error, NullPointerException or ClassCastException!";
}
@ExceptionHandler(Throwable.class)
public String handleThrowable(Throwable e) {
return "Error, Throwable!";
}
拦截器(Interceptor)
在Spring MVC框架中,拦截器是可以运行在所有控制器处理请求之前和 之后的一种组件,并且,如果拦截器运行在控制器处理请求之前,还可以选择对当前请求进行阻止或放行。
【注意】拦截器的目的并不是“拦截下来后阻止运行”,更多的是“拦截下 来后执行某些代码”,其优势在于可作用于若干种不同请求的处理过程, 即写一个拦截器,就可以在很多种请求的处理过程中被执行。
只要是若干种不同的请求过程中都需要执行同样的或高度相似的代码,都可以使用拦截器解决,典型的例如验证用户是否已经登录等等。
需要使用拦截器时,需要自定义类,实现HandlerInterceptor接口
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("LoginInterceptor.preHandle()");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("LoginInterceptor.postHandle()");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("LoginInterceptor.afterCompletion()");
}
}
每个拦截器都必须注册才会被启用,注册过程通过重写 WebMvcConfigure接口中的addInterceptors()方法即可
@Configuration // 此注解不是必须的
@EnableWebMvc
@ComponentScan("cn.tedu.springmvc") // 必须配置在当前配置类,不可配置在Spring的配置类
public class SpringMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/user/login.do");
}
}
- 当进行访问时,在浏览器窗口中将看到一片空白,在Tomcat控制台可以 看到preHandle()方法已经执行
- 当把拦截器中preHandle()方法的返回值改为true时,在Tomcat控制台 可以看到依次执行了preHandle() -> 控制器中处理请求的方法 -> postHandle() -> afterCompletion()
- preHandle()方法的返回值为true时,表示“放行”,为false时,表示 “阻止
关于注册拦截器时的配置,使用链式语法可以先调用addInterceptor()方法添加拦截器,然后调用addPathPatter()方法添加哪些路径需要被拦截, 此方法的参数可以是String...,也可以是List<String>,在编写路径值时, 可以使用*作为通配符,例如配置为/user/*,则可以匹配/user/login.do、 /user/reg.do等所有直接在/user下的路径,但不能匹配/user/1/info.do, 如果需要匹配若干层级,必须使用2个连续的星号,例如配置为/user/**
一旦使用通配符,就有可能导致匹配的范围过大,例如配置为/user/**时, 还可以匹配到/user/reg.do(注册)和/user/login.do(登录),如果此 拦截器是用于“验证用户是否登录”的,则不应该对这2个路径进行处理, 那么,配置拦截器时,还可以在链式语法中调用excludePathPattern()方法,以添加“排除路径”(例外)
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/user/**")
.excludePathPatterns("/user/reg.do", "/user/login.do");
}
Spring MVC小结(需要掌握知识点)
关于Spring MVC框架:
– 理解Spring MVC框架的作用
– 接收请求,响应结果,处理异常
– 掌握创建基于Maven的运行在Tomcat的Webapp
– 认识基础的依赖项 – spring-webmvc、javax.servlet-api、jackson-databind
– 掌握配置Spring MVC的运行环境(使得控制器能接收到请求)
– 掌握以下注解的使用:
- – @Controller / @RestController
- – @ResponseBody
- – @RequestMapping / @GetMapping / @PostMapping ...
- – @RequestParam / @PathVariable
- – @ExceptionHandler / @ControllerAdvice / @RestControllerAdvice
- – @EnableWebMvc
– 掌握接收请求参数的方式:
- – 将请求参数直接声明在处理请求的方法的参数列表中
- – 将若干个请求参数进行封装,并将封装的类型声明在处理请求的方法的参数列表中
- – 如果是URL中的路径,则需要使用@PathVariable
– 掌握响应JSON格式的正文的做法:
- – 处理请求的方法必须添加@ResponseBody,或当前控制器类添加@ResponseBody, 或当前控制器类添加@RestController
- – 在Spring MVC配置类上添加@EnableWebMvc
- – 在项目的pom.xml中添加了jackson-databind – 处理请求的方法返回自定义的数据类型
– 掌握响应JSON格式的正文时,统一的响应类型的类的设计
– 了解RESTful风格
– 掌握统一处理异常
– 掌握拦截器的创建与配置
学习记录,如有侵权请联系删除
相关推荐
- 如何基于Spring Security框架实现权限管理
-
SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架,用于保护基于Spring的应用程序。SpringSecurity主要是从两个方面解决安全性问题:web请求级别:使...
- 一个轻量级 Java 权限认证框架,Sa-Token 让鉴权变得简单、优雅!
-
一、框架介绍Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权等一系列权限相关问题。官网文档:...
- 16.3K Star!简洁高效的Java权限认证与会话管理框架——Sa-Token
-
简介今天给大家推荐一个轻量级的Java权限认证框架——Sa-Token。它可以为JavaWeb应用同完整的权限认证解决方案,它的目标是简化权限管理和登录认证的流程,具备高度灵活性和简单易用的特点。S...
- 从Shiro迁移到Sa-Token:老版JeecgBoot项目权限框架平滑升级方案
-
背景介绍对于许多维护老版JeecgBoot项目的开发者来说,权限框架的升级一直是个棘手问题。这篇文章分享一种实用的方案,用于将老版JeecgBoot中的ApacheShiro替换为更现代的Sa-To...
- 刑法框架体系,对照着框架体系学习可以事半功倍哦
-
有了它,妈妈再也不用担心我司考过不啦!有了它,妈妈再也不用担心我司考过不了啦!其他部门法正在陆续整理制作中哦看不清的话请戳http://mp.weixin.qq.com/s?__biz=MzA3NDE...
- 全新体验版Windows QQ上线,实现三端统一
-
7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。记者从腾讯获悉,继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构...
- 农村自建房造价多少?包工头教你怎么算
-
通常我们在找专业人士设计农村自建房设计图时,不管你是打算建独栋一层别墅还是独栋二层别墅或是独栋三层别墅,你是否也找他们打听过相应的房屋工程造价呢?下面简单介绍一下农村自建房的傻瓜式造价估算:1、砖混结...
- QQ大会员品牌运营策划与设计(qq大会员有哪些个性装扮)
-
编辑导语:在互联网产品越来越同质化的今天,做出有差异性和符合品牌调性的设计是品牌运营过程中需要重视的问题。本文作者从QQ大会员品牌项目实践出发,分享了品牌运营设计过程中遇到的一些问题以及具体操作方案,...
- 支持鸿蒙平台,腾讯视频ovCompose跨平台框架发布
-
IT之家6月3日消息,腾讯开源今日官宣发布腾讯视频ovCompose跨平台框架,其是腾讯大前端领域Oteam中,腾讯视频团队基于ComposeMultiplatform生态推出的...
- 腾讯 QQ Mac 版推倒重做,全新 1.0 版本开启内测
-
IT之家9月1日消息,据多位IT之家小伙伴投稿,腾讯QQMac版近日迎来了全新通用版内测,版本号重新由1.0开始,目前放出的体验版为1.0.4-305。从下图可以看到,该版本在U...
- 全新体验版Windows QQ正式上线官网,实现三端统一
-
7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。记者从腾讯获悉,继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构...
- QQ,到了不能不变的境地(怎么发qq邮件到别人邮箱)
-
相比微信一个小更新,乃至一个小动作,都能上热搜的顶级热度。隔壁的老大哥QQ,显得有些冷清。即使更新再快,功能再激情,都很难引起用户们的集体讨论。机友们细想一番,咱们的老朋友QQ,有多久没上过热搜啦?真...
- 基于Electron框架全面重做:全新Linux版QQ开启公测
-
来源:快科技不久前,腾讯QQ项目组曾发布预告,宣布QQforLinux新版本即将开启公测。现在,新的Linux版QQ已经开启公测,不过目前仅支持x86架构,arm64架构还仍在适配中。与此前极为简...
- QQ全面升级?基于Electron技术的Windows内测版本预计将于明年推出
-
在2022年,作为经典的聊天软件的QQ在经历多次的功能调整后,正式选择基于新技术开发新版本的QQ。今日,据相关媒体报道,腾讯QQ项目组发布预告:QQforLinux将在本周迎来公测,全新的QQf...
- 跨平台三端重构正式统一,QQ Windows全新体验版上架官网
-
7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构,实现了桌面端Q...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 如何基于Spring Security框架实现权限管理
- 一个轻量级 Java 权限认证框架,Sa-Token 让鉴权变得简单、优雅!
- 16.3K Star!简洁高效的Java权限认证与会话管理框架——Sa-Token
- 从Shiro迁移到Sa-Token:老版JeecgBoot项目权限框架平滑升级方案
- 刑法框架体系,对照着框架体系学习可以事半功倍哦
- 全新体验版Windows QQ上线,实现三端统一
- 农村自建房造价多少?包工头教你怎么算
- QQ大会员品牌运营策划与设计(qq大会员有哪些个性装扮)
- 支持鸿蒙平台,腾讯视频ovCompose跨平台框架发布
- 腾讯 QQ Mac 版推倒重做,全新 1.0 版本开启内测
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)