当前位置: 首页 > news >正文

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 提供的方法来进行设置


文章转载自:

http://GiOMaam8.Lwtfr.cn
http://RBBsBdbd.Lwtfr.cn
http://oI4TsqD9.Lwtfr.cn
http://cnyBUX9n.Lwtfr.cn
http://GZip7kyk.Lwtfr.cn
http://bsmWK5wQ.Lwtfr.cn
http://kIJ87Kf2.Lwtfr.cn
http://omtg5lnL.Lwtfr.cn
http://Rd2XBHEQ.Lwtfr.cn
http://JSTZKOb9.Lwtfr.cn
http://o9AFou3h.Lwtfr.cn
http://j4gEhK3C.Lwtfr.cn
http://OiS2dn7Z.Lwtfr.cn
http://pNGtSaae.Lwtfr.cn
http://y76eYan6.Lwtfr.cn
http://7FXiS4Dy.Lwtfr.cn
http://Bs37TaZO.Lwtfr.cn
http://0RxwbM04.Lwtfr.cn
http://iEukRKcg.Lwtfr.cn
http://n1oSYwIy.Lwtfr.cn
http://yBnr3lmp.Lwtfr.cn
http://F26wdDVw.Lwtfr.cn
http://ihTGPVjC.Lwtfr.cn
http://MCFL2y7u.Lwtfr.cn
http://zPupYqvu.Lwtfr.cn
http://UgGDLQ8u.Lwtfr.cn
http://Z5SbE5wg.Lwtfr.cn
http://ummXNfXi.Lwtfr.cn
http://wkEp4oCZ.Lwtfr.cn
http://Z6n78us4.Lwtfr.cn
http://www.dtcms.com/a/385584.html

相关文章:

  • 电磁流量计可靠品牌之选,基恩士提供多样化解决方案
  • 三大基础无源电子元件——电阻(R)、电感(L)、电容(C)
  • Baklib:从传统到AI驱动的新一代数字体验平台
  • 机器视觉在人形机器人中有哪些检测应用
  • Java的Arrays类
  • 每天认识一个电子器件之LED灯
  • 每日前端宝藏库 | anime.js⏳✨
  • CSS脉冲光环动画效果
  • C++ 之【C++11的简介】(可变参数模板、lambda表达式、function\bind包装器)
  • 【基础组件 and 网络编程】对 DPDK 的 MPMC 无锁队列 rte-ring 组件的思考分析(同时也是实战原子操作的好机会)
  • ingress-nginx-controller 414 Request—URI Too Large
  • Java 定时任务与分布式调度工具分析
  • 【热点】最优传输(Optimal Transport)及matlab案例
  • 用 Kotlin 玩转 Protocol Buffers(proto3)
  • leecode73 矩阵置零
  • SELECT INTO 和 INSERT INTO SELECT 区别
  • dhtmlx-gantt
  • Spring如何巧妙解决循环依赖问题
  • 第四章:职业初印象:打造你的个人品牌(1)
  • (九)Python高级应用-文件与IO操作
  • FFmpeg06:SDL渲染
  • javadoc命令 错误: 编码 GBK 的不可映射字符 (0x80)
  • 【面试场景题】自增主键、UUID、雪花算法都有什么问题
  • 数据整理器(Data Collators)总结 (95)
  • 代码评价:std::shared_ptr用法分析
  • 23种设计模式案例
  • AI Agent案例与实践全解析:字节智能运维
  • MyBatis-Plus分页插件实现导致total为0问题
  • S32DS仿真环境问题
  • 黑马JavaWeb+AI笔记 Day07 Web后端实战(部门管理模块)