SpringMVC中的常用注解和用法

1.@RequestMapping

@RequestMapping是路由映射:当用户访问URL时,用于将用户的请求对应到某个类的某个方法;

@RequestMapping可以作用于类,也可以作用于方法。以如下代码为例:

@RequestMappping作用于类Blog和方法hello(),当用户访问URL".../blog/hello"时,框架就会将用户请求对应到Blog类的hello()方法。

在本地电脑进行测试,使用浏览器访问"127.0.0.1:8080/blog/hello"可以看到浏览器成功显示"hello world":

也可以使@RequestMapping单独作用于方法,以如下代码为例:

现在@RequestMapping单独作用于hello(),用户访问URL"/hello",框架就会将用户请求直接对应到hello()方法。

在本地电脑进行测试,使用浏览器访问"127.0.0.1:8080/hello",浏览器也能成功显示"hello world":

同时,@RequestMapping支持多个HTTP协议的方法,如GET,POST,PUT,DELETE等,以满足不同业务场景的需求。

2.@RequestParam

@RequestParam是后端参数映射:接收到HTTP请求后,框架通过@RequestParam中的参数名称找到HTTP请求中的参数,并赋值给后端定义的参数。@RequestParam常用于接收GET请求中的查询字符串中的参数,以及POST请求body中form表单中的参数。

@RequestParam有三个功能:

1.从HTTP请求中获取到指定名称的参数后,可以赋值给后端定义的参数,后端定义的参数可以是不同的名字,以如下代码为例:

框架接收到HTTP的请求后,会从请求中寻找名字为"name"的参数,找到参数后,并将其赋值给参数"param"。在HTTP请求中,这个参数名是"name",后端可以定义不同名称的变量"param"接收该参数值。使用postman构造HTTP请求并接收响应,可以看到参数"name"已经成功赋值给"param",如下:

2.@RequestParam可以设置参数"required"为"false",即使后端没有接收到参数,也不会报错。如果不设置"required"为"false",并且HTTP请求中没有找到要找的参数,那么服务器就会报错,还是以上面的代码为例,使用postman构造不带"name"参数的HTTP请求,结果如下:

HTTP请求中没有携带参数"name",服务器的代码中又强制接收"name",服务器没有在请求中找到这个参数,因此返回错误码400,表示请求错误。

设置@RequestParam的参数"required"为"false",服务器的其它代码不变以及使用相同的HTTP请求,结果如下:

设置"required"为"false",表示参数"name"不是必需的,因此即使服务器没有在请求中找到这个参数,也没有报错,只是会将后端定义的参数设置为null。

@RequestParam支持基本数据类型传参,也可以支持引用类型传参,因此传参也可以传一个对象。

3.@RequestParam可以帮助构造。如果后端代码定义接收参数的类型为接口,不使用@RequestParam接收。接收到HTTP请求后,会提示"无构造方法"类型的错误。以如下代码为例:

使用postman构造HTTP请求,请求中带一个数组参数"list",服务器接收到请求后,提示错误,如下:

查看错误日志,发现提示错误:"java.lang.IllegalStateException: No primary or single unique constructor found for interface java.util.List",意思是List接口中没有构造方法,无法完成构造。而@RequestParam可以帮助完成构造,增加该注解并再次使用postman发送该请求,结果如下:

可以看到,虽然List没有构造方法进行实例化,但是@RequestParam帮助完成了构造,正确接收到HTTP请求中的数据。

3.@RequestBody

@RequestBody常用于接收HTTP请求中body中的json类型的数据,并映射到后端定义的参数。以如下代码为例:

使用postman构造POST请求,body中携带json格式的数据,使用@RequestBody修饰参数"student","student"中的属性接收json数据中相应的值,如下:

注意:json中的"name","age","id"和"student"中的属性是对应的,这些值都可以被成功接收。

4.@PathVariable

@PathVariable用于获取URL路径中的参数。这个注解需要结合@RequestMapping使用,以如下代码为例:

使用postman构造请求,URL路径中带有数字"123",表示"articleId","articleId"能够被成功映射给参数"id",测试结果如下:

注意:使用@PathVariable时,括号中的参数名必须和@RequestMapping中花括号括起来的参数名相同。当需要获取URL路径中的多个参数,每个参数都需要使用@PathVariable修饰。

5.@RequestPart

@RequestPart用于上传文件,并将图片映射到后端的文件对象。以如下代码为例:

使用postman构造HTTP请求,上传一张图片,服务器接收到请求后,获取图片并绑定参数"file",获取图片名称并返回,如下图:

6.@CookieValue

@CookieValue用于获取HTTP请求中的Cookie,并赋值给方法参数,以如下代码为例:

修改浏览器中的Cookie,添加Cookie "username",并将值修改为"admin",使用浏览器访问"127.0.0.1:8080/request/getCookie",getCookie()方法中的参数"cookie"拿到Cookie并返回字符串,结果如下:

还可以使用servletAPI中的HttpServletRequet对象调用getCookies()方法获取所有Cookie。

7.@SessionAttribute

@SessionAttribute用于获取会话中的属性,并赋值给方法的参数,以如下代码为例:

程序启动后,先使用浏览器访问URL "127.0.0.1:8080/request/setSession",设置会话的属性"username"为"admin";再通过浏览器访问URL "127.0.0.1:8080/request/getSession",获取属性"username"的值,能够成功获取到设置的值并返回。运行结果如下:

获取Session中的属性也可以通过servletAPI的方式,使用HttpServletRequest对象调用getSession()方法,获取session对象,再调用getAttribute()方法,获取属性。或者使用框架直接获取HttpSession对象,再调用getAttribute()方法获取属性。

8.@RestController

@RestController是复合注解,功能等于@Controller + @ResponseBody;

@Controller用于定义控制器,Spring框架启动时加载,把对象交给Spring管理;

@ResponseBody定义返回的数据为非视图,返回一个text/html信息;

简单来说,@Controller修饰类,类里面的方法返回一个html页面/视图;@ResponseBody修饰类,类里面的方法不会返回html页面,只会返回后端计算出来的响应数据。这样的目的是降低前端代码和后端代码耦合性,使得前后端分离,前后端维护各自的代码时,不会相互影响。

@ResponseBody既可以修饰类,也可以修饰方法。修饰类就表示类中所有的方法返回的都是数据,修饰方法就表示该方法返回的是数据。以如下代码为例:

上述代码中类使用@Controller修饰,使用浏览器访问URL "127.0.0.1:8080/resp/getIndex",返回一个静态页面,如下:

使用浏览器访问URL "127.0.0.1:8080/resp/getIndex2",返回响应数据,如下:

相关推荐
橘猫云计算机设计7 分钟前
基于微信小程序的疫情互助平台(源码+lw+部署文档+讲解),源码可白嫖!
java·大数据·开发语言·spring boot·微信小程序·小程序·汽车
m0_6724496014 分钟前
使用Java操作Excel
java·python·excel
customer0825 分钟前
【开源免费】基于SpringBoot+Vue.JS医院药品管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
无世世1 小时前
【Java从入门到起飞】面向对象编程(基础)
java·开发语言
Code哈哈笑1 小时前
【Java EE】JavaEE导读,探寻 JavaEE:解锁企业级开发的璀璨密码与进阶指南
java·java-ee
WeiLai11121 小时前
面试基础---Spring Cloud微服务负载均衡架构
spring boot·分布式·后端·spring·spring cloud·面试·架构
刘小炮吖i1 小时前
Java自动拆箱装箱/实例化顺序/缓存使用/原理/实例
java·缓存·面试
节点。csn1 小时前
java 项目中设计模式 之单例模式
java·单例模式·设计模式
路在脚下@2 小时前
门面设计模式和适配器模式有什么区别
java
土豆炒马铃薯。2 小时前
【Java 基础(人话版)】Java 虚拟机(JVM)
java·开发语言·jvm·后端·java基础·虚拟机