Java Web 入门实战:SpringBoot+Spring MVC 从 0 到 1 学习指南
目录
JavaEE导入
SpringBoot 快速上手
环境准备
Maven
项目构建
依赖管理
Maven 仓库
Maven 设置国内源
配置当前项目 setting
编辑
配置新项目的setting
第一个 SpringBoot 程序
SpringBoot 项目创建
项目代码和目录介绍
运行项目
输出 Hello world
访问出错怎么办
404
500
无法访问此网站
Spring Web MVC 入门
什么是 Spring Web MVC
学习 Spring MVC
项目准备
建立连接
@ResquestController 和 @RequestMapping
Postman
请求
传递对象
后端参数重命名
非必传参数设置
传递数组
传递集合
传递 JSON 数据
获取 URL 中参数 @PathVairable
上传文件 @RequestPart
获取 Cookie/Session
Session:
Cookie 和 Session 的区别
获取 Cookie
获取 Session
获取 Header
响应
返回静态页面
@RestController 和 @Controller 的关联和区别
返回 JSON
设置状态码
设置 Header
设置 Content-Type
设置其他的 Header
JavaEE导入
前面的内容中,我们学习的都是 Java 的基础语法,在 JavaEE 中,主要是学习 Java 在企业中是如何应用的,围绕着如何适用 Java 来做 web 开发
之后学习的 JavaEE 项目均基于 B/S架构
在 JavaEE 中,我们会设计到 4 个框架的学习:Spring,Spring Boot,Spring MVC,Mybatis
Spring,Spring Boot,Spring MVC 均属于是 Spring 家族的产品
Mybatis 是一个持久层框架,主要是帮助我们更好的操作数据库
SpringBoot 快速上手
环境准备
idea 需要适用专业版,可自行搜索教程进行下载。
Maven
Maven 可以通过一小段的描述信息(.xml 文件)来管理项目的构建,报告和文档的项目管理工具。可以体现在两个方面:项目构建和管理依赖。
项目构建
Maven 为我们提供了一套简单的命令来完成项目的构建
依赖管理
Maven 通过 pom.xml 文件的配置获取 jar 包,而不用手动去添加 jar 包。获取的 jar 包,就是依赖。
适用 Maven,我们只需要在 pom.xml 中引入对应的依赖即可:
1. 在 pom 文件 <dependencies> 标签中,添加依赖坐标
2. 点击刷新按钮,引入新加入的依赖 jar 包
Maven 仓库
我们在 pom 文件中配置完依赖之后,点击刷新,Maven 会根据坐标的位置,去仓库里寻找 jar 包,并把他们下载下来,添加到项目中,这个 jar 包下载的地方就称为仓库
Maven 设置国内源
配置当前项目 setting
File -> Settings
配置新项目的setting
第一个 SpringBoot 程序
SpringBoot 是为了简化 Spring 程序开发的
SpringBoot 项目创建
File -> New -> Project
第一次打开 SpringBoot 项目需要加载很久,因为当前 SpringBoot 框架并没有在我们的本地仓库中
当下方加载完毕即可~
项目代码和目录介绍
pom文件:
pom.xml 中,我们主要看 <dependencies> 标签中的内容:
引入了两个依赖:
spring-boot-starter-web:包含了 web 应用开发所需要的常见依赖
spring-boot-starter-test:包含了单元测试所需要的常见依赖
目录介绍:
Spring Boot 项目有两个主要的目录:
src/main/java:Java 源代码
src/main/resources:静态资源或配置文件:(前端工程化后不需要了~)
/static 静态资源文件夹,比如前期学的 js css html 静态文件
/templates:模板资源文件夹
src/test/java:测试代码源代码
target:编译后的文件路径
pom.xml:maven 配置文件
运行项目
点击 main 的启动类就可以运行项目了
输出 Hello world
用 Spring Boot 来实现和浏览器及用户的交互
src/main/java 下,创建 HelloController 文件:
重新启动项目,在浏览器访问 http://127.0.0.1:8080/hello
访问出错怎么办
404
404 表示用户访问的资源不存在。大概率是我们前端写的 url 的路径和后端中注解中的路径不匹配
500
500 表示服务器出现内部错误,一般是服务器的执行代码过程中出现了特殊情况:
打开浏览器:
出现这种错误的适合,我们可以在后端 idea 的打印台中查找一下报错信息的日志:
(小技巧:看日志的时候,分段看,看每一段的第一行,耐住性子慢慢仔细看~可以借助豆包等等工具帮忙看~)
无法访问此网站
一般来说是 Tomcat 服务器启动失败了
这种情况下,我们需要检查 tomcat 是否启动,即 idea 中项目是否允许,或者检查 tomcat 的默认端口号 8080 是否被其他应用占用~~~
Spring Web MVC 入门
什么是 Spring Web MVC
基于 Servlet API 构建的原始 Web 框架,它已经被包含在 Spring 框架中了。正式名称为 Spring Web MVC,通常简称为 Spring MVC
我们前面已经讲过 MVC 架构,此处快速做复习:
MVC,即 Model,View,Controller,将软件系统分为模型,视图,控制器三个基本部分
MVC 是一种架构设计模式,也是一种规范思想,而 Spring MVC 是对 MVC 思想的具体实现,初次之外,Spring MVC 还是一个 Web 框架。
不过,Spring 在实现 MVC 的时候,也结合自身项目的特点,做了一些改变:
我们在前面创建第一个 Spring Boot 项目,我们勾选的 Spring Web 框架其实就是 Spring MVC 框架~
SpringBoot 是实现 Spring MVC 的一种方式。Spring Boot 中可以添加很多依赖,借助这些依赖实现不同的功能,Spring Boot 通过添加 Spring Web MVC 框架,来实现 web 功能。
学习 Spring MVC
web 框架,即用户在浏览器中输入了 url 后,我们的 Spring MVC 项目就可以感知到用户的请求,并给予响应。
即,我们要重点研究如何通过浏览器和后台服务器进行交互~
主要分为如下三个方面:
1. 建立连接:将用户(浏览器)和 Java 程序连接起来,即,访问一个地址,例如 http://127.0.0.1:8080/hello 就能够调用到我们的 Spring 程序
2.请求:用户发送请求会携带一些参数,例如:http://127.0.0.1:8080/hello?username=zhangsan&userId=10086,我们在 Java 程序中要想办法获取到参数。
3.响应:执行了 Java 程序中的业务逻辑之后,要把结果返回给浏览器。
项目准备
像前面第一个 SpringBoot 程序一样,勾选 Spring Web 模块即可~
建立连接
Spring MVC 中适用 @RequetMapping 来实现 URL 路由映射
注意:这里 RequestMapping 中的路径和方法名可以不一致~
接下来运行项目,浏览器输入:http://127.0.0.1:8080/sayHi,就可以看到程序返回的数据了~
@ResquestController 和 @RequestMapping
一个项目中会有很多类,Spring 会对所有的类进行扫描,如果类加了 @RequestController,Spring 才会看这个类里面的方法是否加了 @RequestMapping 注解
@RequestMapping 既可以修饰类,也可以修饰方法。当修饰类和方法的时候,访问的地址是类路径+方法路径
@RequestMapping 既支持 Get 请求,也支持 Post 请求。
我们可以指定@RequestMapping 来接收POST 的情况
Postman
测试后端代码,还需要一定的前端代码,我们可以直接适用 Postman 对自己的程序进行测试
创建请求:
请求
访问不同的路径,就是发送不同的请求,发送请求,会携带一些参数,我们在这里研究如何传递参数到后端,以及后端如何接收。
可以看到,后端正确拿到了 name 参数的。Spring MVC 会根据方法的参数名,找到对应的参数,赋值给方法。
如果参数名称不同,是无法获取参数的。
注意:当后端使用基本类型来接收参数,参数必须传递,否则会出现 500 报错,如果类型不匹配,会出现 400 报错。 --> 在企业开发中,对于参数可能为空的数据,建议使用包装类型
传递对象
有 person 对象
后端参数重命名
某些特殊情况下,前端传递的参数 key 和后端接收的 key 可能名称不一致,比如前端传递了 time 给后端,后端使用 timming 字段进行接收,就会出现参数接收不到的情况。我们可以使用 @RequestParam 来重命名前后端的参数值
非必传参数设置
如果我们实际业务前端的参数是一个非必传的参数,可以在 @RequestParam 中设置 required
在这个注解的源码中,可以看到 required 的默认值为 true,即默认是该注解修饰的参数是必传。我们就可以设置 required = false 来避免不传递时的报错
传递数组
Spring MVC 可以自动绑定数组参数的赋值
数组参数:请求参数名和形参数组名称相同且请求参数为多个:
http://127.0.01:8080/m5/arrayParam=zhangsan&Param=lisi&Param=wangwu,或者
http://127.0.01:8080/m5/arrayParam=zhangsan,lisi,wangwu
传递集合
集合参数:和数组类似,同一个请求参数名右多个,需要使用@RequestParam 绑定参数关系
默认情况下,请求中参数名相同有多个值,是封装到数组中,如果要封装到集合中,要使用 @RequestParam 绑定参数关系。
传递 JSON 数据
JSON 概念快速复习:JSON 是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息。其本质上是字符串,但可以在不同的语言中进行数据传递和交换。
JSON 的语法:
1. 数据在键值对中
2.数据由逗号分隔
3. 对象用 { } 表示
4. 数组用 [ ] 表示
5. 值可以为对象,也可以是数组,数组中可以包含多个对象4
可以使用工具对 JSON 字符串进行校验转换~在线JSON校验格式化工具(Be JSON)
传递 JSON 对象,需要使用 @RequestBody 进行注解
Postman 发送 JSON 请求参数:
获取 URL 中参数 @PathVairable
path vairable:路径变量
和字面表达意思一样,主要用于在请求 URL 路径上的数据绑定
使用浏览器发送请求:http://127.0.0.1:8080/m8/5/zhangsan
参数对应关系:
如果方法参数名称和需要绑定的 URL 中的变量名称不一致的时候,可以给 @PathVariable 的属性 value 赋值。
上传文件 @RequestPart
postman 发送请求:
获取 Cookie/Session
HTTP 协议自身是属于 “无状态” 协议(默认情况下,HTTP 西医的客户端和服务器的每一次通信之间没有直接的联系)。
实际开发中,我们是需要通信之间进行联系的,例如一个用户在第二次登录网站之后,服务器应该知道这个用户之前登录过~
上述图片中的令牌,通常就存储在 Cookie 字段中。
但服务器这边也需要记录令牌的信息,以及令牌对应的用户信息,这个就是 Session 机制所作的工作。
Session:
先理解会话这个概念。
计算机领域中,会话是一个客户与服务器之间不中断的请求响应,对客户的每个请求,服务器都能识别出请求来自于同一个客户。当一个未知的客户端项应用程序发送第一个请求时,就开始了一个对话。当客户明确结束会话,或在一个时限内客户未发送任何请求,会话就结束了。
服务器在同一时间会接收到许多请求,要分辨出这些请求来自那些个用于,也就是属于那些个会话,就需要在服务器这边记录每个会话以及用户的信息的对应关系。
Session 是服务器为了保存用户信息而创建的一个特殊的对象。
Session 对象本质上是一个哈希表,里面存储了一些键值对结构,用于存储用户信息~
SessionId 是服务器生成的一个“唯一性字符串”,从 Session 机制来看,这个唯一性的字符串称为 SessionId。在整个登录流程,也可以称这个唯一性字符串称为 token
流程:
1. 当用户登录的时候,服务器在 Session 中新增一个记录,并把 sessionId 返回给客户端(通过 HTTP 响应中的 Set-Cookie 字段返回)
2. 客户端后续再给服务器发送请求的时候,需要在请求中带上 sessionId(通过 HTTP 请求中的 Cookie 字段携带)
3. 服务器收到请求后,根据请求中的 sessionId 在 Session 信息中获取到对应的用户信息,再进行后续操作。如果未找到,则会重新创建 sessionId,并把 sessionId 进行返回。
补充:Session 是默认保存在内存中的,如果重启服务器 Session 数据就会丢失。
Cookie 和 Session 的区别
Cookie 是客户端保存用户信息的一种机制。Session 是服务器保存用户信息的一种机制。
Cookie 和 Session 之间主要通过 SessionId 进行关联。
Cookie 和 Session 经常会一起配合使用,但不是必须配合~
获取 Cookie
简洁的方式获取 Cookie
获取 Session
Session 存储
Session 读取
读取 Session 可以使用 HttpServletRequest
getAttribute 方法返回类型为 Object,我们知道里面的数据为 String 类型,可以安全强转。
简洁获取 Session 的方法
获取 Header
简洁获取 Header
响应
返回静态页面
创建前端页面 index.html
运行 http://127.0.0.1:8080/index
出现 bug,http 响应将 /index.html 当作了 http 响应正文的数据。
我们需要把 @RestController 改为 @Controller
@RestController 和 @Controller 的关联和区别
我们前面提到的 MVC 模式,后端也会负责返回视图,是比较早期的概念。
随着不断发展,前端工程化,Java 主要是用来做后端项目的开发了,也就不再处理前端相关的内容了。
MVC 也逐渐发生了变化,View 不再返回视图,而是返回显示视图时需要的数据。
前面使用的 @RestController 其实就是返回的数据
@RestController = @Controller + @ResponseBody
@Controller:定义一个控制器,Spring 启动时加载,把这个对象交给 Spring 进行管理
@ResponseBody:定义返回的数据格式为非视图,返回一个 text/html 信息
当我们想要返回视图的时候,把 @ResponseBody 去掉就可以~
@ResponseBody 既是类注解,又是方法注解。
如果作用在类上,则表示该类的所有方法,返回的都是数据,如果作用在方法上,表示该方法返回的是数据。
如果一个类的方法里面,既有需要返回数据的,又有需要返回视图的,就把 @ResponseBody 注解添加到对应的方法上即可~
注意,如果上面的代码中的 returnData 方法中,去掉 @ResponseBody 注解,则会出现 404 报错。因为程序会根据我们写的代码认为需要返回的是视图,根据内容去查找文件,但是查询不到,所以路径不存在,报错 404
如果后端返回数据时,有 HTML 代码,也会被浏览器进行解析
返回 JSON
Spring MVC 也可以返回 JSON
后端方法返回结果为对象
设置状态码
Spring MVC 会根据我们方法的返回结果自动设置响应码,但我们程序员也可以手动指定状态码
当我们访问页面后,发现状态码并不会影响页面的展示
设置 Header
Http 响应报头会向客户端传递一些附加信息,这些信息通过 @RequestMapping 注解的属性来实现
@RequestMapping 源码:
设置 Content-Type
通过设置 produces 属性的值,设置响应报头的 Content-Type
如果我们不设置 produces,方法返回结果为 String 类型的时候,Spring MVC 默认的返回类型为 text/html
produces 设置返回类型的同时,也可以同步设置响应编码
设置其他的 Header
需要使用 Spring MVC 中的内置对象 HttpServletResponse 提供的方法来进行设置