SSM框架学习笔记04 | SpringMVC

文章目录

  • 一、SpringMVC简介
  • 二、 请求与响应
    • 1. 请求映射路径
    • 2. get请求与post请求
    • 3. 响应
  • 二、REST风格
    • 1.简介
  • 三、 SSM整合
  • 四、拦截器
    • 1. 定义拦截器
    • 2.配置拦截器
    • 3.拦截器执行顺序
    • 4.拦截器参数
    • 5.多个连接器工作流程分析
    • 6.拦截器链的运行顺序


一、SpringMVC简介

SpringMVC技术与Servlet技术功能等同,均属于Web层开发技术。SpringMVC是一种基于Java实现MVC模型的轻量级Web框架。优点:轻便灵活。
在这里插入图片描述

  1. 使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标;
  2. 创建SpringMVC控制类;
  3. 初始化SpringMVC环境(同Spring环境),设置SpringMVC加载对应的bean;
  4. 初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理请求。
    在这里插入图片描述

二、 请求与响应

1. 请求映射路径

类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")

2. get请求与post请求

  • 普通参数: URL地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
//普通参数:请求参数与形参名称对应即可完成参数传递@RequestMapping("/commonParam")@ResponseBodypublic String commonParam(String name ,int age){System.out.println("普通参数传递 name ==> "+name);System.out.println("普通参数传递 age ==> "+age);return "{'module':'common param'}";}
  • post 请求乱码处理: 为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符集过滤器
   @Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
  • 普通参数: 请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
    @RequestMapping("/commonParamDifferentName")@ResponseBodypublic String commonParamDifferentName(@RequestParam("name") String userName , int age){System.out.println("普通参数传递 userName ==> "+userName);System.out.println("普通参数传递 age ==> "+age);return "{'module':'common param different name'}";}
  • POJO参数: 请求参数与形参对象中的属性对应即可完成参数传递
    @RequestMapping("/pojoParam")@ResponseBodypublic String pojoParam(User user){System.out.println("pojo参数传递 user ==> "+user);return "{'module':'pojo param'}";}
  • 嵌套POJO参数: 嵌套属性按照层次结构设定名称即可完成参数传递
    @RequestMapping("/pojoContainPojoParam")@ResponseBodypublic String pojoContainPojoParam(User user){System.out.println("pojo嵌套pojo参数传递 user ==> "+user);return "{'module':'pojo contain pojo param'}";} 
  • 数组参数: 同名请求参数可以直接映射到对应名称的形参数组对象中
   @RequestMapping("/arrayParam")@ResponseBodypublic String arrayParam(String[] likes){System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));return "{'module':'array param'}";}  
  • 集合参数: 同名请求参数可以使用 @RequestParam 注解映射到对应名称的集合对象中作为数据
 @RequestMapping("/listParam")@ResponseBodypublic String listParam(@RequestParam List<String> likes){System.out.println("集合参数传递 likes ==> "+ likes);return "{'module':'list param'}";}   
  • 集合参数:json格式
    1.开启json数据格式的自动转换,在配置类中开启 @EnableWebMvc
    2.使用 @RequestBody 注解将外部传递的json数组数据映射到形参的集合对象中作为数据
    @RequestMapping("/listParamForJson")@ResponseBodypublic String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)参数传递 list ==> "+likes);return "{'module':'list common for json param'}";}   
  • POJO参数:json格式
    1.开启json数据格式的自动转换,在配置类中开启 @EnableWebMvc
    2.使用 @RequestBody 注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应,@RequestBody 一个处理器方法中只可以使用一次。
    @RequestMapping("/pojoParamForJson")@ResponseBodypublic String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)参数传递 user ==> "+user);return "{'module':'pojo for json param'}";}   
  • 集合参数:json格式
    1.开启json数据格式的自动转换,在配置类中开启 @EnableWebMvc
    2.使用 @RequestBody 注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
    @RequestMapping("/listPojoParamForJson")@ResponseBodypublic String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 list ==> "+list);return "{'module':'list pojo for json param'}";}   
  • 日期参数
    使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
    @RequestMapping("/dataParam")@ResponseBodypublic String dataParam(Date date,@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){System.out.println("参数传递 date ==> "+date);System.out.println("参数传递 date1(yyyy-MM-dd) ==> "+date1);System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);return "{'module':'data param'}";}   

3. 响应

响应页面
返回值为String类型,设置返回值为页面名称,即可实现页面跳转

	@RequestMapping("/toJumpPage")public String toJumpPage(){System.out.println("跳转页面");return "page.jsp";}

响应数据(文本数据,JSON数据)
响应文本数据:返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
响应POJO对象:返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖 @ResponseBody 注解和 @EnableWebMvc 注解
响应POJO集合对象:返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖 @ResponseBody 注解和 @EnableWebMvc 注解
此处的 @ResponseBody 是类型转换器 HttpMessageConverter接口 在做事情

	//响应文本数据@RequestMapping("/toText")@ResponseBodypublic String toText(){System.out.println("返回纯文本数据");return "response text";}//响应POJO对象@RequestMapping("/toJsonPOJO")@ResponseBodypublic User toJsonPOJO(){System.out.println("返回json对象数据");User user = new User();user.setName("千旭");user.setAge(15);return user;}//响应POJO集合对象@RequestMapping("/toJsonList")@ResponseBodypublic List<User> toJsonList(){System.out.println("返回json集合数据");User user1 = new User();user1.setName("南昭");user1.setAge(15);User user2 = new User();user2.setName("洛兰");user2.setAge(12);List<User> userList = new ArrayList<User>();userList.add(user1);userList.add(user2);return userList;}

二、REST风格

1.简介

REST(Representational State Transfer),表现形式状态转换

@Controller
public class UserController {//设置当前请求方法为POST,表示REST风格中的添加操作@RequestMapping(value = "/users",method = RequestMethod.POST)@ResponseBodypublic String save(){System.out.println("user save...");return "{'module':'user save'}";}//设置当前请求方法为DELETE,表示REST风格中的删除操作//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id){System.out.println("user delete..." + id);return "{'module':'user delete'}";}//设置当前请求方法为PUT,表示REST风格中的修改操作@RequestMapping(value = "/users",method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user){System.out.println("user update..."+user);return "{'module':'user update'}";}//设置当前请求方法为GET,表示REST风格中的查询操作//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id){System.out.println("user getById..."+id);return "{'module':'user getById'}";}//设置当前请求方法为GET,表示REST风格中的查询操作@RequestMapping(value = "/users",method = RequestMethod.GET)@ResponseBodypublic String getAll(){System.out.println("user getAll...");return "{'module':'user getAll'}";}
}

简化版:

@RestController     //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
@RequestMapping("/books")
public class BookController {@PostMapping        //使用@PostMapping简化Post请求方法对应的映射配置public String save(@RequestBody Book book){System.out.println("book save..." + book);return "{'module':'book save'}";}@DeleteMapping("/{id}")     //使用@DeleteMapping简化DELETE请求方法对应的映射配置public String delete(@PathVariable Integer id){System.out.println("book delete..." + id);return "{'module':'book delete'}";}@PutMapping         //使用@PutMapping简化Put请求方法对应的映射配置public String update(@RequestBody Book book){System.out.println("book update..."+book);return "{'module':'book update'}";}@GetMapping("/{id}")    //使用@GetMapping简化GET请求方法对应的映射配置public String getById(@PathVariable Integer id){System.out.println("book getById..."+id);return "{'module':'book getById'}";}@GetMapping             //使用@GetMapping简化GET请求方法对应的映射配置public String getAll(){System.out.println("book getAll...");return "{'module':'book getAll'}";}
}

三、 SSM整合

在这里插入图片描述

四、拦截器

拦截器
拦截器: 是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
作用: 在指定的方法调用前后执行预先设定的代码;阻止原始方法的执行
拦截器与过滤器的区别:
归属不同:Filter属于servlet技术,Interceptor属于SpringMVC技术
拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

1. 定义拦截器

@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {@Override//原始方法调用前执行的内容//返回值类型可以拦截控制的执行,true放行,false终止public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String contentType = request.getHeader("Content-Type");HandlerMethod hm = (HandlerMethod)handler;System.out.println("preHandle..."+contentType);return true;}@Override//原始方法调用后执行的内容public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");}@Override//原始方法调用完成后执行的内容public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}

2.配置拦截器

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowiredprivate ProjectInterceptor projectInterceptor;@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");}@Overrideprotected void addInterceptors(InterceptorRegistry registry) {//配置拦截器registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");}
}

3.拦截器执行顺序

拦截器执行顺序

4.拦截器参数

class文件: com.test.controller.interceptor.ProjectInterceptor
前置处理

  • request: 请求对象
  • response: 响应对象
  • handler: 被调用的处理器对象,本质上是一个方法对象,对反射技术中的Method对象进行了包装
  • 返回值为false,被拦截的处理对象不执行

后置处理

  • modelAndView: 如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整

完成后处理

  • ex: 如果处理器执行过程中出现异常对象,可以针对异常情况进行单独处理
@Component
//定义拦截器类,实现HandlerInterceptor接口
//注意当前类必须受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {@Override//原始方法调用前执行的内容//返回值类型可以拦截控制的执行,true放行,false终止public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String contentType = request.getHeader("Content-Type");HandlerMethod hm = (HandlerMethod)handler;System.out.println("preHandle..."+contentType);return true;}@Override//原始方法调用后执行的内容public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");}@Override//原始方法调用完成后执行的内容public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}

5.多个连接器工作流程分析

  • 当配置多个拦截器时,形成拦截器链
  • 拦截器链的运行顺序参照拦截器添加顺序为准
  • 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
  • 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

多个拦截器工作流程分析

6.拦截器链的运行顺序

preHandle: 与配置顺序相同,必定运行
postHandle: 与配置顺序相反,可能不运行
afterCompletion: 与配置顺序相反,可能不运行


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/627661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI嵌入式K210项目(3)-GPIO控制

文章目录 前言一、背景知识二、背景知识二、开始你的表演代码实现 总结 前言 前面介绍了开发板和环境搭建的基本情况&#xff0c;接下来我们开始学习使用C进行裸板开发&#xff0c;本节课先来学习下K210最基础的功能&#xff0c;引脚映射和点灯。 在开始具体学习之前&#xff…

java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

TRB 2024论文分享:融合Transformer和自监督学习的长时交通流预测模型

TRB&#xff08;Transportation Research Board&#xff0c;美国交通研究委员会&#xff0c;简称TRB&#xff09;会议是交通研究领域知名度最高学术会议之一&#xff0c;近年来的参会人数已经超过了2万名&#xff0c;是参与人数和国家最多的学术盛会。TRB会议几乎涵盖了交通领域…

Ceph的介绍与部署

目录 存储基础 单机存储设备 DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; NAS&#xff08;网络附加存储&#xff0c;是通过网络附加到当前主机文件系统之上的存储&#xff09; SAN&#xff08;存储区域网络&#xff09; 单…

基于ssm的数学课程评价系统的设计与开发+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本数学课程评价系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

List转数组,使用toArray时,new String[0] 的数组空间大小怎么传?

我们在日常开发中&#xff0c;经常遇到List转数组&#xff0c;数组转List的场景。当我们List转数组时&#xff0c;一般使用这种方式&#xff1a; String[] queryTaskIdArr queryTaskIds.toArray(new String[0]); 但是toArray方法中的入参有什么需要注意的呢&#xff1f; 如下…

Hive日期函数详细讲解

Hive 提供了一系列的内建日期函数&#xff0c;用于处理日期和时间数据。以下是您提到的日期函数的详细讲解&#xff0c;包括案例和使用注意事项&#xff1a; FROM_UNIXTIME() 功能&#xff1a;将 Unix 时间戳&#xff08;秒为单位&#xff09;转换为日期时间格式。语法&#xf…

故障处理流程规范(新)

一、背景 为什么要重新制定故障处理流程&#xff1f; 2020年写过一篇文章&#xff1a; 故障处理流程和规范&#xff0c;在过去的这三年内&#xff0c;故障处理流程输出了好几个版本&#xff0c;但都没有很好的落地&#xff0c;所以本次的目标是&#xff0c;制定一个简单、易操…

【架构】docker实现集群主从扩容【案例3/4】

实现集群主从扩容 当整个集群扛不住流量的情况时&#xff0c;需要给集群扩容增加设备&#xff0c;由3主3从&#xff0c;扩为4主4从。实现&#xff1a; 示意图如下&#xff1a; 第一步&#xff1a;新创建两个节点&#xff08;redis-node-7&#xff0c;端口6387和 redis-node…

sqli-labs关卡25(基于get提交的过滤and和or的联合注入)

文章目录 前言一、回顾上一关知识点二、靶场第二十五关通关思路1、判断注入点2、爆显位个数3、爆显位位置4、爆数据库名5、爆数据库表名6、爆数据库列名7、爆数据库数据 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的…

11 最小字符子串

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果…

LeetCode每周五题_2024/01/15~01/19

文章目录 82. 删除排序链表中的重复元素 II题目题解 82. 删除排序链表中的重复元素 II 82. 删除排序链表中的重复元素 II 题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 题解 /**…

数据结构之list类

前言 list是列表类。从list 类开始&#xff0c;我们就要接触独属于 Python 的数据类型了。Python 简单、易用&#xff0c;很大一部分原因就是它对基础数据类型的设计各具特色又相辅相成。 话不多说&#xff0c;让我们开始学习第一个 Python 数据类型一list。 1. list的赋值 输…

【shell】读取表格文件的数据

碎碎念 shell在处理复杂问题的时候不具备优势&#xff0c;如果业务环境能够使用python的话用python又简单又好用&#xff0c;但是很多云平台的现场可能需要shell脚本文件&#xff08;还好是要求bash&#xff09; 但是现在有一个业务场景就是运维人员会把参数写在excel表格中 …

连接世界:2024 年 5G 及未来技术趋势

在不断发展的技术领域&#xff0c;2024 年有望实现突破性的进步&#xff0c;从而重塑我们与世界的联系方式。 这场革命的前沿是备受期待的 5G 技术的推出及其后续发展。 当我们步入互联无极限的未来时&#xff0c;可能性似乎是无限的。 5G的兴起&#xff1a; 开启互联新时代 …

《教育》期刊是什么级别的期刊?是正规期刊吗?能评职称吗?

《教育》以教育行业的各类新闻为重点&#xff0c;积极推广各地教育部门改革经验及优秀成果&#xff0c;努力挖掘教育一线先进单位和个人&#xff0c;充分发挥新闻舆论的监督作用。 收录情况&#xff1a;知网收录 投稿方式&#xff1a;教育类&#xff5c;《教育》省级 出版周期&…

ftp的介绍与安装

ftp 文章目录 ftp1. ftp简介2. ftp架构3. ftp数据连接模式4. 用户认证5. vsftpd5.1 vsftpd安装5.2 vsftpd配置5.3 vsftpd虚拟用户配置 1. ftp简介 网络文件共享服务主流的主要有三种&#xff0c;分别是ftp、nfs、samba。 FTP是File Transfer Protocol&#xff08;文件传输协议…

Java 常用加密解密

Java 常用加密解密 常见的加密算法可以分成三类&#xff0c;对称加密算法&#xff0c;非对称加密算法和Hash算法。 对称加密 指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用对称加密方法加密然后…

B端产品经理学习-B端产品的项目管理

项目管理的作用 指导Roadmap落地 每个节点的项目时间需要按照时间点落地&#xff0c;才不会影响后面的项目事件 为了明确需求&#xff0c;明确研发的工作 避免产研部门因为需求扯皮、研发部门抱怨需求文档不够清晰、在开发过程中增加很多细节需求、增加了研发的工作量、初次…

java自定义工具类在List快速查找相同字段值对象

根据对象某一字段名&#xff0c;获取字段值&#xff0c;将List转换为Map中包含list&#xff0c;Key为字段值&#xff0c;Value为相同字段值的对象list&#xff0c;快速定位具有相同字段值的对象&#xff0c;转换之后便于在Map中根据字段值快速查找相同字段值的对象 //List转Map…