JavaEE进阶 - Spring MVC 程序开发 - 细节狂魔_java ee包含安卓开发吗

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取


获取用户请求参数

传递单个参数

在 Spring MVC 中可以直接⽤⽅法中的参数来实现传参.

在传递单个参数的时候,最常传递的参数是 id。
因为 id 通常是通过 primary key’(主键)来设置的,具有唯一性。
有助于我们获取到唯一的数据。
这里我们不去访问数据,直接通过访问方法来演示一下就行,
主要是了解用法
在这里插入图片描述

上述这种方式,只要 获取的参数名称,与前端传输的参数名称一致,就能获取到对应的参数值。
在这里插入图片描述
如果 前端参数名称 和 映射方法的参数名称,不一样。
不但获取不到,还会报错!
在这里插入图片描述

图中说到 映射方法的参数类型,不能使用基本数据类型。
虽然正常情况下,代码运行没问题,和 使用 包装类 的效果一样。
但是像遇到上述这种特殊问题(前端传输参数名称 和 映射方法名称 不相符),代码就会报错。
在这里插入图片描述


获取多个参数 / 表单参数传递(非对象)

我们简单实现 回显服务。
传递什么参数,就返回什么参数。

方法还是一样的,只要 前端传递的参数名称 和 后端映射方法参数名称相同,就能够获取一个,甚至多个参数。
在这里插入图片描述
如果你看这个 URL 有点懵,建议你还是先去看看 我的 HTTP协议的文章,再来看这个。

但是目前这个代码存在很大的问题,就是参数一旦增加。
我们就得手动去添加,还可能漏掉某个参数,
而且,维护的时候,也很难看清楚代码,参数太多了!维护性极低。

那么,我们该怎么去处理呢?
接着往下看!


获取多个参数 / 获取对象

获取对象,那就很简单了!!!
映射方法 只需要 一个 对象参数 就行了。
在这里插入图片描述
获取对象参数的重点,还是在 前端传参的时候,参数名称 要与 对象中的属性名称相对应,Spring MVC 就会自动 对 对象的属性 进行赋值。
如果名称不匹配,那么,这个参数传输的毫无意义。


拓展

后端参数重命名(后端参数映射:@RequestParam)

跟给 Bean 对象重命名 是一样的意思。
就是给 参数 改个名字。

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致!

⽐如前端传递了⼀个time 给后端,⽽后端⼜是由 createtime 字段来接收的,这样就会出现参数接收不到的情况.
如果出现这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。

特殊情况,比如:
在将来的某一天,公司晚上突然加班,需要紧急添加一个需求。
更重要的是:产品明天就要上线了。
紧急加班嘛,代码就写的有点“粗”。
前后端,并没沟通好。
假设,做的一个登录功能的扩展
然后,产品是凌晨 2点上线的。
代码也就没有经过严格的测试。
因为 测试可能都下班,都是研发人员 去硬怼的。

第二天用的时候,运维发现了问题,通知 开发 / 测试 人员,某某功能有问题。
比如:无论用户怎么输入,一直提示填写用户名。

最终,排查出的问题:
前端在传输参数的时候,参数名字 叫做 name,而后端参数是叫做 username。
这样就会导致一直拿不到 用户名的值。
这个时候,我们有两种解决方案。
1、让后端的代码适应前端的代码,修改映射方法的参数名称(username >> name)。
但是一个问题也随之而来。
就是啊,这个 username 已经在映射方法中,使用了很多次了。
这一改,方法中的代码全都得动!
而且存在漏改的风险!

2、让前端的代码,适应后端的代码。
让前端传回的参数 name >> username
这也会存在一个问题,像这种做完一个大项目的时候。
前端的人都休假,回到家直接关手机睡觉了。
但是这个bug 又很紧急!

总结:前端失联,后端不想改。

这个时候,就可以使用 后端参数重命名了。

后端参数重命名,就是把前端传过来的参数名称,进行转移赋值。

就是说:前端参数名称不变,还是name;后端接收到之后,将其参数名称的数值,赋值到 后端的 username 参数上。
此时,对于 后端来说,前端的 name,就是 username 了。
因为两者的value 值,都是一样的。

具体的实现方法,还是通过注解的方式来解决。
使用 @RequestParam 注解,就可以搞定了。
在这里插入图片描述
这里有一个细节:
如果这个重命名操作的属性,是对象里面的,就不能这么去用!!!

上面的那个 username ,并不是 UserInfo 中的属性,只是一个普通的 字符串变量名.
我都没将 UserInfo 类注入到Spring 中,更别提获取到类中的属性。
在这里插入图片描述

虽然也有方法可以处理这种情况,但不是这个注解,是另一个。
(后面在 讲 MyBatis 的时候,会说这个)

但如果映射方法的参数是一个对象,那就没办法了。
这个你就只能和前端交流了,让他配合你的操作。
将 前端参数名称 修改成 和 后端对象中的属性名称 一样。
或者你配合他的代码。。。。
将类中的属性名修改成 和 前端参数一样的名称。
在这里插入图片描述
总之,看谁能说服谁。。。总会有一方妥协的。

口才,对于开发人员,也是非常重要的。
开发人员,不仅要和 产品经理 据理力争,还要和前端讲道理,讲配合。
测试,也同样需要沟通。
有时候他认为这是一个bug,然而并不是,或者说不重要。
因为压根就不会出现这种情况,没人会这样去使用软件。
因此这个bug等同于虚设。


@RequestParam 的进一步理解: required属性

在这里插入图片描述


表单参数传递(对象)

表单传递对象参数,还是一样的。
接受对象参数时,前端参数该怎么传,就这么传。
在这里插入图片描述
上面是一个 get 方法的请求。

下面我们来通过 postman 构造一个 post 方法的 表单请求
在这里插入图片描述
总的来说,没有难点。


@RequestBody 接收JSON对象 - 特殊

有的人看到这个,感觉so easy!
既然 JSON 也是一个对象,这跟上面没有区别嘛。
还是一样的,前端直接传输一个 JSON 对象,映射方法这边还是使用一个对象去接收。
下面,我就来验证一下,程序能不能接收一个 JSON 对象的数据?
在这里插入图片描述
通过获取普通对象的方法,来获取一个 json 格式的对象参数。显然是不行的!

由此,不难得出结论:
只要不是 json 格式的数据,无论是 GET 还是 POST 方法的请求,都没有问题!
这一点在前面的例子中,就已经充分体现出来了。

也就是说:想要通过接收 json 对象,需要通过其它的方法来实现。
当然还是注解,这个注解就是标题的 @ RequestBody 注解
在这里插入图片描述

PS:注意!不要迷糊了!!!!
我们使用的 @RequestBody,不是 @ResponseBody。。。
@ResponseBody: 表示返回的数据是一个非静态的页面。

而 @RequestBody,是告诉 映射方法接下来接收到的数据是一个JSON 格式的数据。
方便对 JSON 数据,进行解析。

结论:
服务器端想要实现 json 数据的接收,就需要使用 @RequestBody 注解。


获取URL中参数@PathVariable - 特殊

这个就厉害了,它不满足于从 请求的正文 和 URL 中的查询字符串 中 获取参数了。
而是从 URL 中获取参数。

注意!我的描述:
@PathVariable注解,不满足从 请求的正文 和 URL 中的查询字符串(参数部分),获取 参数。
而是直接从 URL地址 中 获取参数。
在这里插入图片描述
不得不说:这种sao操作,作者也是第一次听闻。

举个例子:DOTA 都知道吧?一个推塔游戏。

比如,
我们现在想要获取到一个 英雄的信息。
在这里插入图片描述
一般情况下,我们获取英雄信息的方式,都是同 URL 的 查询字符串部分来获取的。
如:http://data2.uuu9.com?heroname=影魔

而通过 URL地址的方式来获取英雄信息:http://data2.uuu9.com / 66 / 影魔 /
假设 66 是它的 ID。
那么,通过以往的方式去获取这个英雄的信息,可以吗?
很明显,是不可以!!!!
我们前面所学的方法,就没有一个针对 URL地址部分的!

那么问题来了,为什么有正常的方式不用,用这种非主流的方式来获取参数呢?

这个就涉及到 SU(搜索引擎) 的优化。
什么是 SU 的优化呢?
在这里插入图片描述

需要注意的是:
使用 第二种形式的URL,也是存在 " 缺点 " 的!

在这里插入图片描述

不过 Spring MVC 又提供了一个新的注解 @PathVariable。

其实也很好理解:path variable == 路径变量。

随之而来的是:路径肯定是存在两种形式的。
1、参数
2、路径
那我们该如何区分 那个是参数,那个是路径呢?
路径的写法不变,还是 “/xxx”
而参数的,就是在 / 后面,加上 大括号,将其后面的内容括起来: “/{xxx}”
在这里插入图片描述
需要注意的一点:
在这里插入图片描述


上传文件 - @RequestPart

现在不是之前那种简单数据了,它可能是一个数据流。
它传过来的是一个 “流”。

比如:
我们在进行用户注册的时候,要上传一个头像(图片)。
也就是说:上传的数据,就是这个图片的字节流。
类似于这种上传文件的形式,我应该怎么去获取呢?
通过 @RequestPart 注解,并将 文件名称 作为 参数放入其中,同时还需要借助 Spring 提供 MultipartFile对象。
MultipartFile,就是专门用来接收文件的。
在这里插入图片描述

还没完,其实上述操作,还存在问题。

问题就出在 图片 和 存储路径,都被写死了。
在这里插入图片描述
我们再来想象一个场景。
在这里插入图片描述
所以,不能这么去写!!!
在这里插入图片描述


拓展:不同平台运行的配置文件设置 - 优化存储目录

首先,我们先来补充 关于日志文件的知识补充。

在这里插入图片描述
这样做的好处:
哪怕配置文件再多,我们也就只需要修改 主配置文件中的一个参数,就可以调用对应的配置文件了 。

总结:
1、针对各个平台,创建专属的配置文件
2、配置文件的命名规则:application + 分隔符“ - ” + 平台名称(可简写) + .格式【必须这么去写 】
3、在主配置文件中设置 运行的配置文件。【spring.profiles.active】


图片名称不能重复 && 获取原图格式 问题

先把 主配置文件中 的 参数 改成 develop (开发环境)
在这里插入图片描述
要不然识别不了,毕竟我们现在是在本地操作。

下面,我们先来解决 图片名称 问题。
第一种:时间戳

通过 时间戳 来命名图片,是存在问题的。
其实 “巧合”,在互联网中是很常见的。
因此,很有可能就有那么几个人,同时,上传图片。
还是会造成 图片名称 的重复,导致 原先的图片被覆盖。
只是发生的概率要小一些。
因此,不可取的。
因为 它不适合用于 并发执行的情况。

第二种:UUID(全局唯一标识符)

UUID就不会从出现 时间戳的情况。
UUID 会使用 你的网卡,随机数,等等,,,各种各样的信息来对 文件 进行命名。
在这种条件下,命名重复的概率,几乎不可能出现。

现在 存储路径的问题 搞定了,图片名称重复的问题 搞定了。
就剩下 获取 原上传图片 的 格式 了。

其实 MultipartFile 对象中,提供了 一个 API(getOriginalFilename)。
getOriginalFilename:获取原始的文件名称
名称里面都有什么?有文件后缀啊!
想办法截取文件后缀,不就可以了嘛。

问题都有了解决方案,接下来就是实施环节。
在这里插入图片描述
注意!我们通过取巧的方式,来做的。
其实 uid 来也可以进行操作。

但是 局限性很强!
使用 uid 来 命名 图片,只能使用一次。【唯一性】
但是!可能还有其它图片,都是与用户相关的。
当然,你可以通过添加前缀的方式来实现。

总的来说:还是更推荐使用 UUID 的方式,因为它更通用性更强。


获取Cookie/Session/header

这三个是比较特殊,在有些场合,才会用到,
其中 获取 Session 是比较常见的。

这三项,通常都不是(使用的一方)用户 自动去上传的。
都是由 前端工程师,或者是由系统给我们上传的。

比如说:
Cookie,是浏览器自身去实现的。
它会在每一次请求中,都会把域名底下所有的 cookie 都带上。
这都属于 浏览器自身的行为。
当然,如果前端工程师愿意的话,他也可以 发送 cookie 给后端。

Session,也是一样。
也是前端的浏览器自动发送给后端的。
但是后端是需要获取到 Session 的。
毕竟,它用的比较多。
因为,用户在登录的时候,是需要通过 session 来验证用户信息的。

header,有些场景下,前端还会在 header 里面,设置自定义的header。
然后,传递到后端。
系统的header信息,有些时候,也是需要获取的。
至于为什么要获取 header,因为 header 里面有一个 userAge。
userAge 里面就记录了当前访问用户的操作系统信息,以及他所使用的浏览器信息。
那我就可以每一次请求一个接口的时候,统计用户 的 浏览器 和 操作系统 的信息。
在拿到 用户 浏览器 和 操作系统的信息之后,方便对其进行分析。
根据 分析的结果,做一个排列,看看哪种浏览器的永辉最多,那个操作系统的用户最多。
来进行针对性处理和优化。
就是说:产品能够更好的兼容这些比较热门的操作系统 和 浏览器。

总之,一句话:我可以不用,但是不能不会!
至少我是知道有这么几个东西的。


知识铺垫:获取 Request 和 Response 对象

因为 Spring MVC 就是 基于 Servlet API 来实现的。
也就是说:Servlet 那一套 是 完全适用于 Spring MVC 的。

在 Spring MVC 里面,每一个方法都有2个 “隐藏参数”、
【HttpServletRequest 和 HttpServletResponse】
在这里插入图片描述
下面我们就来验证一下功能。
在这里插入图片描述
根据结果,更加证明了 Spring MVC 是 支持 Servlet API 的。


获取 Cookie

获取 Cookie 的方式有两种:
1、基于 Servlet 提供 的 API 来获取 Cookie

在这里插入图片描述
虽然,方法是可以的.。
但是这种读取的方式,其实是有点“繁琐的”!
因为需要先获取 请求对象,通过对象提供的方法,来获取 所有的cookie。
而 繁琐,就体现在这一步!
通常情况,我们获取 cookie 数据的时候,不会全拿,只拿取其中的一个。

由此,Spring MVC 提供一个新的注解,来往下看。

2、简洁的获取 Cookie - @CookieValue

在这里插入图片描述
这就很方便了!
想要那个 cookie 值,将其 cookieName 作为 @CookieValue 注解 的 参数,就能获取到对应的value值。
当然,你还需要准备一个 “参数” 来接收。


获取 header(获取请求头中的信息)

获取 header 的 方法,也有两种:
1、 基于 Servlet API

在这里插入图片描述

2、简洁获取 Header—@RequestHeader

在这里插入图片描述
相比于 Servlet API,注解的方式,还是更简单一点的.


存储 和 获取 Session

为什么 Session 多出一个 存储 的 操作呢?

原因很简单!
就跟获取 cookie 的 时候一样!
你都没有 session,我还获取干什么??
所以,才会多出这一步。

更特别的是:关于 存储 操作,只能通过 servlet API。
因为存储操作,是没有办法用参数来表示的。

在这里插入图片描述

读取操作,是有两种方法的。
1、servlet API

在这里插入图片描述

2、更简洁的获取 session - 使用 注解 :@SessionAttribute

在这里插入图片描述
至于为什么需要加上一个 required 属性,并置为 false!
这因为 在使用 注解 获取 session 对象的时候,没有判断句!
即:如果访问 getSession2 方法的时候,没有设置 session 会话,并且内置属性。
此时,它就直接报错!因为它找不到对应 key 值!
这是因为 @SessionAttribute 注解中,有required的属性。
这个前面在讲 @RequestParam 的时候,就讲了。
不会像 servlet 那样,返回一个 空值(页面什么都不显示)。
这个值,必须得有!!!
在这里插入图片描述
解决的方法,就是将 required 属性,置为false。
表示这个 key 值,并不是非要找到!
而是找不到就算了!
在这里插入图片描述


返回数据给前端

通过上⾯的学习我们知道,默认请求下⽆论是 Spring MVC 或者是 Spring Boot 返回的是视图(xxx.html),⽽现在都是前后端分离的,后端只需要返给给前端数据即可,这个时候我们就需要使⽤@ResponseBody 注解了。

这我们已经在前面演示了。
这里再稳固一下。
在这里插入图片描述
当我们加上 @ResponseBody 注解的时候,它认为我们返回的是一个非静态页面数据。
它就会直接显示。
在这里插入图片描述

既可以修饰类,也可以修饰方法。
修饰类,表示 类中所有的方法的返回值,都是一个非静态页面的数据。
修饰方法,表示 该方法的返回值,是一个非静态页面的数据。

但是,还是有点麻烦。。
毕竟,还是需要写两个注解。

于是,Spring MVC 又提供了一个新的注解。
结合了 @Controller 和 @ResponseBody,两者之间的功能。
这个新的组合注解叫做 @RestController

简单来说:可以将 @RestController 理解为是 HTTP 的 controller 类注解。

这是目前主流的使用注解。

那么,什么@RestController 能够代替两个注解的工作呢?
这四因为 @RestController 里面实现了这两个 注解。
【按住 Ctrl,左键点击 RestController,就可以进入源码。】
在这里插入图片描述


练习

实现计算器功能 - form 表单

可使⽤ postman 传递参数,或使⽤ form 表单的⽅式提交参数。
前端⻚⾯代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
 content="width=device-width, user-scalable=no, initialscale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>计算器示例</title>
</head>
<body>
<form action="/calc">
    <h1>计算器</h1>
    数字1:<input name="num1" type="text"><br>
    数字2:<input name="num2" type="text"><br>
    <input type="submit" value=" 点击相加 ">
</form>
</body>
</html>

代码,我已经给你了,下面来跟着我的脚步来看具体的实现步骤。
在这里插入图片描述
是不是非常简单?!
我们不用再去 写一些获取参数的操作了,直接当成一个普通方法来处理.
需要强调的是:参数名称 要与前端传输的参数名称 一致,
不一样也行,使用 @RequestParam 来进行重命名操作,记得将 required 属性置为 false。

另外,方法的参数,需要使用包装类。
如果使用 基础数据类型来接收前端参数,如果前端返回一个 null,就会 数值 与 类型不匹配。
还有,因为使用 包装类,所以允许前端返回一个 null 值。
因此,我们需要做一步 校验(验证 数据是否非空),避免造成空指针异常。
所以,我们再稍微修改一下代码。

在这里插入图片描述

此时,计算器的功能,才算真正完成了!

这里,我们还可做一个业务优化。
在显示结果的页面,设置一个返回键。
在这里插入图片描述


拓展: Spring MVC 的 热部署 设置

在经过上述的学习,我们不难发现:每次修改代码之后,都需要重启 项目。
这就麻烦!这里我们就可以通过设置热部署来解法双手。

在这里需要明白一件事:
为什么需要重启项目,我们的效果才是根据最新的代码来呈现的。
在这里插入图片描述

因此,作为一个“合格”的程序员,怎么可以让自己那么累呢!
当然是 配置热部署。让它 “实时更新” target 目录中的内容。

“实时更新”:修改完代码之后,大概在 3 ~ 4 s 之后,才会热部署完成。
即:自动更新了 target 中的内容(实际上,自动生成了一个新的target。将原来的覆盖,所以才会那么耗时!)

热部署的运行原理:
它会检测 当前源代码中,有没有发生改动?
如果改动了,热部署 就会拿到一个 改动事件。
在拿到源代码改动事件之后,它会自动帮我们重启项目。

虽然,还是通过重启项目的方式,来让改动的代码生效。
但是!我们不需要再去手动点击重启了!

自动重启项目消耗的时间,前面也说了。
大概 3~4 s 的样子,热部署就完成了。
此时,你再去访问,看到的效果,就是最新的了。

下面,我们就来配置热部署。


1.添加热部署框架⽀持

在 pom.xml 中添加如下框架引⽤:
PS: 一般我们在创建 Spring Boot(Spring MVC) 项目的时候,就已经添加了这个框架。
在这里插入图片描述
如果你忘记加了,或者是一个老项目,也不要紧。
前面在讲 日志文件 添加 lombok 依赖的时候,给你们介绍了一款插件 Edit Starters
在这里插入图片描述
可以快捷插入所需的框架支持。
这个我就不多讲,如果你没装,你就先去看这个部分。
看完,你就知道怎么操作了。


2、Settings 开启项⽬⾃动编译

在这里插入图片描述


3.开启运⾏中热部署

刚才开启的是 idea 的热部署。
和 程序运行热部署设置没关系。
设置情况分为两种。

1、低版本 Idea 设置(IntelliJ IDEA 2021.2 之前的版本)

在这里插入图片描述

2、⾼版本 Idea 设置(IntelliJ IDEA 2021.2 之后版本)

在这里插入图片描述

经过上述操作,我们的热部署就完成了。


4.使⽤ Debug 启动项目(⾮Run)

在这里插入图片描述

这是因为有些人的idea,即使前面三步都完成了,热部署仍然无法生效。
使用 debug 运行项目,就不会存在这个问题。

当然 你 使用 run ,热部署也能生效。
那就随便了。


效果展示

在这里插入图片描述

看到这个效果,说明热部署已经设置成功了,并且已经运行了。
以后,就不用我们去手动重启项目了。


模拟登录功能,前端使⽤ ajax,后端返回 json 给前端。

前端代码

知识铺垫:前端三剑客之 JavaScript
前端三剑客之 CSS前端三剑客之 HTML

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
 content="width=device-width, user-scalable=no, initialscale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="js/jquery-1.9.1.min.js"></script>
    <title>Document</title>
    <script>
 // ajax 提交
 function mysub(){
 //1、判空
 // 输入框中的值
 let username = jQuery('#username');
 let password = jQuery('#password');
 // jQuery.trim 去空格
 if(jQuery.trim(username.val()) == ''){
 alert("请输入用户名!");
 return;
 }
 if(jQuery.trim(password.val()) == ''){
 alert("请输入密码!");
 return;
 }
 jQuery.ajax({
 // 请求使用方法
 type: "POST",
 // 映射方法路径
 url: '/user/login2',
 // 请求正文
 data: {"username": username.val(),"password": password.val()},
 // 除了 服务器范湖的结果
 success: function(result){
 alert(result);
 }
 });
 }
 </script>
</head>
<body>
<div style="text-align: center;">
    <h1>登录</h1>
    ⽤户:<input id="username">
    <br>
    密码:<input id="password" type="password">
    <br>
    <input type="button" value=" 提交 " onclick="mysub()"
 style="margin-top: 20px;margin-left: 50px;">
</div>
</body>
</html>

将上述的代码,放入一个 HTML 文件中。
在这里插入图片描述
需要注意的是 ajax 是需要依赖于 jQuery 的。
所以我创建一个 js 包,用来存储 jQuery。
在这里插入图片描述


后端代码

在这里插入图片描述


效果图

在这里插入图片描述


小拓展:前端返回一个json数据,后端可以接收。

前面,我们是直接接收 参数的。
在这里插入图片描述
前面也讲过,要想接收一个 JSON 数据,是需要借助 @RequestBody 注解的。
问题,就在于,前端如何构造一个 JSON 数据。(了解)

后端代码支持获取 JSON 格式的数据,前端整体不改,值修改访问路径。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得出结论:
前后端的数据格式要匹配。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

g.csdnimg.cn/ce7496824e2040da80d624af2a4ac17e.png)

需要注意的是 ajax 是需要依赖于 jQuery 的。
所以我创建一个 js 包,用来存储 jQuery。
在这里插入图片描述


后端代码

在这里插入图片描述


效果图

在这里插入图片描述


小拓展:前端返回一个json数据,后端可以接收。

前面,我们是直接接收 参数的。
在这里插入图片描述
前面也讲过,要想接收一个 JSON 数据,是需要借助 @RequestBody 注解的。
问题,就在于,前端如何构造一个 JSON 数据。(了解)

后端代码支持获取 JSON 格式的数据,前端整体不改,值修改访问路径。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得出结论:
前后端的数据格式要匹配。

[外链图片转存中…(img-aNdbE6s8-1715763084246)]
[外链图片转存中…(img-U6jF9hYS-1715763084246)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值