目录
📕前言
🌴项目准备
🌲建立连接
🚩@RequestMapping注解
🚩@RequestMapping 注解介绍
🎄@RequestMapping是GET还是POST请求?
🚩通过Fiddler查看
🚩Postman查看
🚩注解介绍
🚩@Target注解
📕前言
我们说springmvc现在更加合适的是叫springweb,既然是Web框架,那么当⽤⼾在浏览器中输⼊了url之后,我们的SpringMVC项⽬就可以感知到⽤⼾ 的请求,并给予响应.
咱们学习SpringMVC,重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互.
主要分以下三个方面:
- 1. 建⽴连接:将⽤⼾(浏览器)和Java程序连接起来,也就是访问⼀个地址能够调⽤到我们的 Spring 程序。
- 2. 请求:⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数,所以请求这块主要是获取参数 的功能.
- 3. 响应:执⾏了业务逻辑之后,要把程序执⾏的结果返回给用户,也就是响应.
比如用户去银存存款:
1. 建⽴连接:去柜台
2. 请求:带着银⾏卡,⾝份证去存款
3. 响应:银⾏返回⼀张存折.
对于SpringMVC来说,掌握了以上3个功能就相当于掌握了SpringMVC.
🌴项目准备
Spring MVC项⽬创建和SpringBoot创建项⽬相同,在创建的时候选择SpringWeb就相当于创建了 Spring MVC的项⽬
创建项⽬时,勾选上SpringWeb模块即可,如下图所⽰:
项目创建好以后,不要着急写代码,运行一下项目,看是否能正常启动
🌲建立连接
🚩@RequestMapping注解
在Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤
我们先来看看代码怎么写
创建⼀个 UserController 类,实现⽤⼾通过浏览器和程序的交互,具体实现代码如下:
这时候我们使用浏览器访问 http://127.0.0.1:8080/hello 就可访问
上述这一系列的过程,就说明我们的连接已经建立好了,通过这个url和后端服务器建立了连接,后端服务器返回了一个结果,客户端接收到了这个结果。
🚩@RequestMapping 注解介绍
@RequestMapping 是SpringWebMVC应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的 路由映射的.
表⽰服务收到请求时,路径为/hello的请求就会调⽤hello这个⽅法的代码.
路由映射:当⽤⼾访问⼀个URL时,将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射
既然@RequestMapping 已经可以达到我们的⽬的了,我们为什么还要加@RestController呢?
我们把 @RestController 去掉,再来访问⼀次:
修改代码后要重新启动项目,刷新web页面:
可以看到,程序报了404,找不到该⻚⾯,这是客户端错误,通常认为是url不存在。也就是说使用@RequestMapping时要带上@RestController,带上其他的注解也可以,当前认为是带上@RestController。
此时就有疑问了,我们的@RequestMapping它表示建立连接了,已经和外面建立连接了,为什么还需要使用@RestController注解。
那我们使用其他注解行不行(此处只是演示,具体介绍后续讲述):
去掉@RequestMapping:
通过上述过程发现,使用@RequestMapping进行路由映射的话需要和其他注解一起使用,不一定需要和@RestController。
那@RestController起到的作用?
⼀个项⽬中,会有很多类,每个类可能有很多的⽅法,Spring程序怎么知道要执⾏哪个⽅法呢? Spring会对所有的类进⾏扫描,如果类加了注解@RestController,Spring才会去看这个类⾥⾯的⽅法 有没有加 @RequestMapping 这个注解,当然他的作⽤不⽌这⼀点,咱们先⽤,后⾯再详细讲。当前可简单的理解为,加上这个注解之后给spring做了一个标识,让spring知道哪个程序里面是有路由映射相关的信息的.
🎄@RequestMapping是GET还是POST请求?
🚩通过Fiddler查看
可以看到是一个GET请求:
🚩Postman查看
上述通过Fiddler抓包看到是一个GET请求,那么它只支持get请求吗,我们使用Postman来构造Post请求,是否可以?
构造请求步骤如下:
- 第一步
- 第二步
页面相关介绍如下:
此时就发现,不管是GET请求还是Post请求都是OK的,就可以得出一个结论,@RequestMapping是GET请求还是Post请求这个问法就不对,这个是什么请求与@RequestMapping无关,get和post是请求的属性,所以是你在发送请求的时候,是采用什么样的方式去发送的,那这里采用的是get和post,我们应该为@RequestMapping支持的是get还是post请求?通过Postman去验证,发现是全都支持的,包括delete,put请求等......
那么问题来了,如果我只想让那个请求是 POST 请求 或者 GET 请求呢?
我们该怎么做呢?
其实做法很简单,在"hello2"的后面写一个逗号,再写method按回车即可
查看method源码,method需要传递的是一个RequestMethod类型的数组,也就是可支持多个数据
查看RequestMethod源码,可以看到就是我们所使用的http的请求方式
即只需在method=后面跟上你所需要的请求方式即可,只需一个可用可不用中括号,需要多个加上中括号即可
此时在发送一个PUT请求:当前就出错了
发送一个GET/POST请求:
简单写法,仅支持一个请求:
这里就不再过多演示
小结:
- @RequetMapping默认支持所以请求方式
- 通过method指定请求方式
- @GetMapping指定支持Get请求,@PostMapping指定支持Post请求...
🚩注解介绍
我们查看上述注解的一个写法:
可以看到上图中@RequestMapping的括号中,就是写的注解的值,通过观察@RequestMapping的源码之后,就是再给@RequestMapping里面的参数复制,第一种写法是一种键值对的形式,第二种写法就是一个值,没有key;也就是说注解中括号里的参数只有一个时,那么key可以省略,会把这个值默认复制给value属性,也就是默认value="hello",当有多个参数时,key就不能省略了。
当前我们写的@RequestMapping注解的括号中都加了一个 / ,我们试一下不加行不行
发送结果:发现也可以的,建议都加上!
🚩@Target注解
我们在观察@RequestMapping注解可以发现,RequestMapping注解上面还有一些注解:
可以看到@Target里面有两个值,一个TYPE,一个METHOD;@Target表示这个注解可以应用在哪里,比如说有的注解是类注解,只能加在类上,有的注解是方法注解,有些是参数注解,就是通过@Target注解来区分。
如果@Target括号中有TYPE,表示它可以加在类上;如果@Target括号中有METHOD表示可以加在方法上。那么上面的@RequestMapping就表示可以加在类上和方法上。
我们查看@RestController注解的源码:发现只有TYPE,那么就只能加在类上
将@RequestMapping加在类上:(注:此时该类存在多个注解,多个注解无先后顺序)
发送请求:此时发送请求就会404
注意:如果类注解有@RequestMapping,方法上也有@RequestMapping,那么就需要通过类路径+方法路径进行拼接,也就是 /user/hello。这些注解的路径也可以是多层,如(/user/vv)
总结:上述主要是一个建立连接的过程,对于请求和响应在后续文章介绍