努力经营当下,直至未来明朗!
文章目录
- 一、Spring MVC概述
- 1. MVC定义
- 2. MVC和Spring MVC的关系
- 二、为什么要学Spring MVC
- 三、如何学Spring MVC
- 一) 实现用户和程序的映射
- 方法1:路由@RequestMapping(“/xxx”)
- 方法2: 使用@PostMapping(“/xxx”) 只支持post请求方式访问
- 方法3:使用@GetMapping(“/xxx”) 只支持get请求方式访问
- 二) 获取用户请求参数
- 1. 获取单个参数
- 2. 获取多个参数
- 3. 获取对象
- 4. 表单参数
- 5. 实现前后端参数重命名@RequestParam
- 6. 设置参数必传@RequestParam
- 7. @RequestBody 接收JSON对象
- 8. 获取URL地址中参数@PathVariable
- 9. 上传文件@RequestPart
- 10. 获取Cookie/Session/header
- 三) 返回数据
- 练习:和计算器 (返回text/html)
- 返回JSON对象
- 练习:实现登录功能
- 请求转发或请求重定向【面试常问】
- 3. ==请求重定向和请求转发的区别==:【面试常问】
- 补充
- 1. @ResponseBody说明
- 2. 更多注解(官方API)
- 3. 扩充功能
- 4. 热部署
- 小结
普通小孩也要热爱生活!
一、Spring MVC概述
- Spring Web MVC的官方描述:
Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”
官网:Spring-Web
- 翻译
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。
- 相当于:Servlet是父类,Spring Web MVC是子类。即:可以将Servlet中的方法等 平移到Spring Web MVC。但是一般不会如此使用,Spring MVC提供了更简单的方式。
- Spring MVC包含于Spring框架
- 关键信息:
① Spring MVC 是⼀个 Web 框架。
② Spring MVC 是基于 Servlet API 构建的。
1. MVC定义
-
MVC,即Model View Controller,翻译过来即“模型、视图、控制器”。它是一种设计模式,这种设计模式将软件(项目)分为三部分:模型、视图和控制器。
-
模型、视图和控制器三部分的交互方式(重点)
-
模型、视图和控制器的概念:
① Model(模型):是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
② View(视图):是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
③ Controller(控制器):是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。
2. MVC和Spring MVC的关系
- MVC是一种设计思想,而Spring MVC是一个具体的实现框架。(其实也就类似于:IoC和DI)
- Spring MVC是基于MVC设计思想和Servlet API实现的一个Web项目,同时Spring MVC又是Spring框架中的的一个Web模块,它是随着Spring的诞生而存在的一个框架。
- Spring和Spring MVC诞生的历史是比较久远的,在他们之后才有了 Spring Boot。
二、为什么要学Spring MVC
- 现在绝⼤部分的 Java 项⽬都是基于 Spring(或 Spring Boot)的,⽽ Spring 的核⼼就是 Spring MVC。也就是说 Spring MVC 是 Spring 框架的核⼼模块,⽽ Spring Boot 是 Spring 的脚⼿架,因此我们可以推断出:现在市⾯上绝⼤部分的 Java 项⽬约等于 Spring MVC 项⽬,这是我们要学 Spring MVC 的原因。
- 图片:
三、如何学Spring MVC
- Spring MVC项目的创建:
基于Spring Boot 框架添加一个Spring Web(它使用的就是Spring MVC)依赖,此时项目就变成了Spring MVC项目。 - Spring MVC学习目标
1)实现用户和程序的映射(在浏览器输入URL地址之后,能够在程序中匹配到相应的方法)
2)服务器端要得到用户的请求参数
3)服务器端要将请求返回给用户(前端)
一) 实现用户和程序的映射
方法1:路由@RequestMapping(“/xxx”)
- 路由@RequestMapping(“/xxx”) 实现:
① @RequestMapping(“/xxx”)类上、方法上都可以添加,但是方法上必须添加(除非你不想将该方法暴露则不加)
② 返回非静态页面数据,一定要加上@ResponseBody;否则返回404。(如果不加@ResponseBody,则默认返回的是一个静态页面,就会根据方法中返回的内容作为页面名字去找该页面)
注:通过浏览器url去访问的所有请求都是get类型的
-
@RequestMapping特征:
1)@RequestMapping既能修饰类,又能修饰方法
2)@RequestMapping默认支持post、get等多种发送请求的方式。
-
实现只允许单种方式进行访问(如post):给@RequestMapping设置参数method,再加上路由地址value(之前没有写进行了缺省)
查看支持设置哪些参数,可以使用ctrl+左键进入@RequestMapping
访问结果:
① get不支持
② Post支持
建议所有地址信息都加上/,当然目前版本不加也是ok的
方法2: 使用@PostMapping(“/xxx”) 只支持post请求方式访问
方法3:使用@GetMapping(“/xxx”) 只支持get请求方式访问
二) 获取用户请求参数
1. 获取单个参数
-
参数强烈建议使用包装类,因为包装类是支持null的,而普通类如果为null就会报异常!
-
Url中注意?键值对的传入作为参数
2. 获取多个参数
-
获取多个参数的方法
-
使用url传入时注意键值对
① 如果不传入键值对,就是默认值
② ?后传入参数:url中String值是不需要加双引号的
3. 获取对象
-
将对象作为参数直接传入
-
前端传参(即:url中?后的写入方式):所有属性值都要传入
4. 表单参数
- 举栗子:
5. 实现前后端参数重命名@RequestParam
- 某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个time 给后端,⽽后端⼜是由 createtime 字段来接收的,这样就会出现参数接收不到的情况。如果出现这种情况,我们就可以使⽤
@RequestParam
来重命名前后端的参数值。 - 使用@RequestParam 来重命名前后端的参数值,使前后端参数达成一致。
- 举栗子:
① 参数重命名之前:
②对参数重命名:
6. 设置参数必传@RequestParam
-
在@RequestParam的源码中可以知道:@RequestParam是参数必传的,不传的话直接报错
-
可以手动设置为非必传参数:
设置required=false
-
[小结] @RequiredParam 注意事项:
如果在参数中添加@RequiredParam注解,那么前端一定要传递此重命名后的参数,否则就会报错;如果要想解决此问题,可以给@RequiredParam里面加上required = false
。
7. @RequestBody 接收JSON对象
-
Postman模拟post发送请求(选择body -> form表单):成功
-
Postman模拟JSON发送请求(选择body -> raw -> JSON):失败
注意:JSON字符串的书写:key一定要加””
- 所以:服务器端想要接收JSON对象需要使用@RequestBody注解(注意与返回非静态页面的@ResponseBody区分)
8. 获取URL地址中参数@PathVariable
- 将参数写入URL中可以提高SEO优先级(提高网站排名)
- 注:url中?后面是参数部分,前面是地址部分
- 举栗子:
9. 上传文件@RequestPart
- 注意
文件类型MultipartFile
以及保存文件的函数transferTo
- 举例子
1)固定路径
① 代码:
② 使用postman模拟实现(有文件:选择 Body -> form-data)
注:自己的文件参数名是@RequestPart括号中的名字。是参数名,不是真实的文件名
③ Send之后发现成功:
④ 但是存在一个问题:
因为目的文件的文件名已经固定,此时后续再传文件就会进行覆盖!
2)动态设置:写到配置文件中
① 需要修改的是:存入的本地目录、图片名称(名称不能重复)以及获取原上传文件的格式
② 将其写到配置文件中,便于后续修改等操作
③ 开发环境application-dev.yml
和生产环境application-prod.yml
的配置文件:因为有些配置在不同环境下是不同的。另外,还需要配置文件application.yml
来标识是生产环境还是开发环境。
④ 本地目录:
⑤ 图片名称(不能重复):时间戳(但是如果同一时间发送的话就会存在覆盖行为,所以不可取)、UUID(通用唯一识别码,推荐使用)
补充:
另外,id也是不可以重复的,取巧的话也可以使用id作为不重复的文件名称;但是存在局限性:只能使用一次。UUID是更加通用的!
10. 获取Cookie/Session/header
-
Spring MVC的方法是有两个隐含参数的,HttpServletRequest和HttpServletResponse,如果想要使用则直接进行显式使用即可。
-
获取Cookie:
① Servlet获取Cookie的方法:
Fn+f12 可以自己设置Cookie:
② 使用@CookieValue
的注解实现Cookie的读取:
可以在参数中实现多个@CookieValue,使用, 进行分隔。
- 获取header(请求头)里的信息
① Servlet获取:
② 使用@RequestHeader
注解获取
- 存储和获取Session
① 存储Session:Servlet和 SpringMVC操作是一样的
② 获取Sesison
A)方法一:Servlet模式
在getSession之前一定要先setSession。(直接get就是空!)
B)方法二:使用@SessionAttribute
注解
注意:通常是需要指定是非必须参数的;如果不指定,默认是必须参数,没有就会报错!
同样也是先setSession后getSession,否则就为空。
三) 返回数据
-
默认返回的是静态页面的名称(视图):因为之前是前后端不分离的,为了兼容。
-
加上 @ResponseBody注解返回的就是非静态页面数据。
@ResponseBody注解可以修饰类,也可以修饰方法。
① @ResponseBody注解修饰类:表示当前类中的所有方法返回的都是非静态页面的数据。
② @ResponseBody注解修饰方法:表示当前方法返回的是非静态页面的数据。
-
[主流]直接使用
@RestController
返回非静态页面数据(直接去掉类注解@Controller和@ResponseBody)
-
查看@RestController源码:(ctrl+左键):
@RestController就含有了@Controller + @ResponseBody
练习:和计算器 (返回text/html)
1)前端代码:
2)后端代码:
3)实现:
(输入后自动实现跳转,地址栏中参数也跟着改变)
返回JSON对象
练习:实现登录功能
注:生产环境一般用压缩的js(即:min.js)
-
需要在resources -> static 底下创建一个js包 -> 然后创建jquery-1.9.1.min.js文件【前端】
-
如果遇到404找不到min.js(也就是明明有min.js,但是访问不到的情况):
排查发现:target中没有该文件
解决方法:直接将target删掉重新启动即可
【扩展:已经存在某个文件,但是访问不到的情况】 -
hasLength函数
-
JSON.stringify(ret); 注意将JSON格式转为字符串的方法
-
① 前端发送JSON数据的标准格式:contentType: “application/json” 对应的是JSON字符串JSON.stringify()。
② 后端参数使用@RequestBody
注解(获取JSON对象)
请求转发或请求重定向【面试常问】
- 请求转发(forward) 两种实现方式:
1)类注解@Controller实现返回静态页面,注意return语句(省不省略forward都是ok的)
也就是说:请求转发forward是服务器端的行为,返回的是forward的页面的信息。
2)使用HttpServlet实现
- 请求重定向(redirect)两种实现方式:
1)类注解@Controller,注意return返回语句以及url变化
即:
① 请求重定向(redirect)之后,url会发生变化,变为重定向地址。
② 请求重定向(redirect)请求两次,状态码是302(临时重定向);不返回任何关于重定向的页面信息,都是直接访问的。
③ 请求重定向(redirect)发生在客户端(浏览器端)
【可以类比借钱来区分转发和重定向】
2)使用Response对象:
3. 请求重定向和请求转发的区别:【面试常问】
1)定义不同:转发forward是发生在服务器上,将目标地址返回的结果直接返回给客户端; 重定向redirect是发生在客户端上的,服务器将目的地址返回给客户端,然后客户端自己去完成目标地址的访问。
2)请求方/跳转方不同(一次、两次):forward一次,是服务器端的行为;redirect两次,是客户端的行为。
3)数据共享不同:forward请求和返回的数据共享;redirect两次请求的数据是不同的。
4)最终URL地址不同:forward不变,redirect改变。
5)代码实现不同
[请求转发速度比请求重定向快:因为forward只发送一次请求]
具体参考:请求转发和请求重定向的区别
补充
1. @ResponseBody说明
- @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成application/json 返回给前端。
- @ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者json,⽽不是视图。(也就是返回非静态页面数据)
2. 更多注解(官方API)
官方API
3. 扩充功能
- 不同平台的配置文件设置:
1)新建不同平台的配置文件
不同平台的配置文件的命名规则:
application-平台.yml (properties)
【必须这样命名,为了后续在application中使用方便】
2)在主配置环境中设置运行的配置文件
【注】如果只有一份就直接写在总配置文件application中
4. 热部署
热部署操作步骤
小结
- MVC是思想,Spring MVC是具体实现
- Spring MVC是基于MVC设计思想和Servlet API实现的一个Web项目
- Spring的核心是Spring MVC
- 路由@RequestMapping("/xx)可以用于类or方法
- @RequestMapping("/xx)适用于多种请求,可以限定只能某种请求方式
- 获取用户请求参数:单个、多个、对象、表单、JSON对象(@RequestBody)、url中参数、上传文件以及获取Cookie、Session、header。
- @RequestParam 设置参数必传以及重命名
- @ResponseBody、@RestController
- 请求转发forward 和 请求重定向redirect的区别
- 热部署