注解解析直达目录
1.用于接收前端给后端的json数据-@RequestBody
1.1需求分析
如今前端与后端主流的数据交互格式就是json,当我们前端页面需要向后端传递数据时,我们springMVC给了我们一个注解,就是@RequestBody。它可以将前端数据接收,并且为程序所用。
1.2具体情境
前端:假设为一个用户信息的收集,表单验证
后端:需要得到前端用户填写的数据
1.3最佳实操
-
引入webjar(用于前端主页导入JQuery)
添加maven依赖
<dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.5.1</version> </dependency>
添加后,整个项目中就会有一个JQuery,路径为:
http://localhost:8080/webjars/jquery/3.5.1/jquery.js
-
编写前端代码
我们采用ajax的发送方式,编写index.html,这样子就可以直接用localhost:8080访问
<html> <head> <meta charset="UTF-8"> <title>测试</title> </head> <body> <form> <input type="button" value="点我发送" id="sub"/> </form> <script src="webjars/jquery/3.5.1/jquery.js "></script> <script type="text/javascript"> $(document).ready(function(){ $("#sub").click(function(){ $.ajax({ url:'http://10.136.9.228:8080/test',//向后端发送的路径,请改为你自己的ip contentType:'application/json;charset=utf-8',//发送的数据类型是json以及字符编码 data:'{"name":"张三","age":18}',//发送的数据 type:'post',//发送的方式 success:function(data){//成功的回调函数 console.log(data); },error:function(error){//发送失败的回调函数 console.log(error) } }) }) }); </script> </body> </html>
-
编写实体类User
package com.springweb.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data//get,set方法 @ToString//tostring方法 @AllArgsConstructor//全参数构造方法 @NoArgsConstructor//无参数构造方法 public class User { private String name; private int age; }
-
编写Controller
package com.springweb.controller; import com.springweb.pojo.User; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; @RestController public class TestController { @RequestMapping("/test") public void po(@RequestBody User user){ System.out.println("传来的用户名是"+user.getName()+", 传来的用户的年龄是"+user.getAge()); } }
1.4运行结果以及分析
我们这里用ip:8080的方式,如果还是访问localhost:8080,向后端发送请求时会产生跨域问题,所以采用ip:8080
点击后控制台输出传输到后台的数据
SpringMVC看见当你的User被RequestBody注解时,当前端给对应的请求时,就会自动解析JSON字符串,将字符串的内容封装入User中,但是如果json的key值与User中的对象值不相等,则认为是无效的值,所以不会封装,使用时注意key值与属性值对应即可
2.获取restful风格url中的参数值 -@PathVariable
2.1需求分析
我们现在所上的网站基本上是这样的一个格式
XXX.COM/xxx/xxx
如果我们仍然用原生的servlet的话很难做到这样的url,像这样的url格式,我们称之为restful风格
2.2具体情境
我们可以用路径变量进行传值,第一个代表什么意思,第二个代表什么意思,等等
2.3最佳实操
-
编写Controller
@RequestMapping("/user/{id}/{name}") public Map getUser(@PathVariable("id") Integer id, @PathVariable("name") String name){ Map map=new HashMap<String,Object>(); map.put("id",id); map.put("name",name); return map; }
-
访问
localhost:8080/user/1/liweihua
2.4运行结果以及分析
访问后的数据回显根据你的url内的值变化而变化
分析:
url中第二个路径代表id,第三个代表name,当访问匹配时,将路径变量中的参数取出并将map赋值,回显到浏览器,所以url不同,则回显的map值也不同
3.获取http请求的header部分信息 - @RequestHeader
3.1需求分析
当一个客户机相当于浏览器向web服务器发送一个请求时,需要发送一个请求的命令行,一般是GET或者POST命令,当发送POST命令时,还会向服务器发送一个叫“Content-Length”的请求头(Request Header) 用来指明数据长度,除此之外,还会发送一些其他的Headers,如:
Accept-Charset 浏览器支持的字符编码
User-Agent (客户端的类型,一般用来区分不同的浏览器)
等
我们可以通过请求头来给不同客户机做出不同的兼容性体验等等
3.2具体情境
我需要对Edge浏览器和Google浏览器做出不同的反应,知道客户端的类型是怎样的,方便我们做出适配
3.3最佳实操
新增一个RequestMapping
@RequestMapping("/header")
public String b(@RequestHeader("User-Agent") String client,@RequestHeader("Accept-Encoding") String encoding){
return "客户端是"+ client + "<br/>支持的编码是" + encoding;
}
不同浏览器访问localhost:8080/header
3.4运行结果以及分析
谷歌浏览器出现如下
IE是这样的
4.获取矩阵变量的值 - @MatrixVariable
4.1需求分析
Spring3.2后,该注解出现,目的是为了拓展URL请求地址的功能
多个变量可以使用“;”(分号)来分隔,如果是一个变量的多个值,可以使用逗号来分隔,或者可以使用重复的变量名
4.2具体情境
我们知道,在实际开发中,当Cookie没有被禁用之前,客户端向服务器发送请求时,会将保存在Cookie中的sessionId取出并发送给服务器,服务器将session中的值取出,但是,当Cookie被禁用的时候,我们取不到sessionId,就没有办法取出session的值,就可以采用矩阵变量的方式,将sessionid发送给服务器,形式如下:
/path/sell;sessionId=xxxxx
4.3最佳实操
- 写Mapping
@RequestMapping("/school/{schoolId}")
public String a(@PathVariable("schoolId") String schoolId, @MatrixVariable("sid") int studentId){
return "学校id是" + schoolId + "学生id是" + studentId;
}
-
访问
http://localhost:8080/school/1;sid=111
4.4运行结果以及分析
正常运行结果是
如果你没有过配置,那么你肯定会出现400的错误,因为SpringBoot默认禁用掉了矩阵变量的配置,将Url中的“;”(分号)自动剔除,会找不到对应的矩阵变量
解决办法:
新增一个配置类,实现WebMvcConfigurer接口,设置UrlPathHelper中的自动屏蔽分号为关闭
@Configuration
public class Config implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer){
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
5.让被注释的方法在一个Controller中首先被执行 - @ModelAttribute
5.1需求分析
需要对Controller中的成员变量进行初始化等操作,或者想要在访问Controller下的Mapping之前执行一段程序,就可以使用ModelAttribute
由于@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
5.2具体情境
Controller中有一个data成员变量,我想为它赋值,作为初始化,当有请求被响应时,可以获取初始化后的值
5.3最佳实操
-
编写Mapping
@RequestMapping("/modelattribute") public String test(){ return data; }
-
编写ModelAttribute
private String data="none";//Controller的成员变量是data @ModelAttribute public void init(){ data="wuhu";//执行初始化操作 }
5.4运行结果以及分析
访问 localhost:8080/modelattribute
发现不再是成员变量最开始的值“none”,而是回显了一个“wuhu”
当SpringMVC匹配到请求时,会先执行被ModelAttribute注解的代码,将data赋值为wuhu,所以再次访问时值就会产生变化
6.获得Cookie - @CookieValue
6.1需求分析
将cookie中的值取出,方便服务器做出对应的响应
6.2具体情境
先设置用户端的Cookie,再从服务器中读取,发送给界面
6.3最佳实操
-
新建创建Cookie的Mapping
@RequestMapping("/setCookie") public String setCookie(HttpServletResponse response){ Cookie cookie = new Cookie("userName","huaye"); response.addCookie(cookie); return "设置成功!"; }
-
新建获取Cookie的Mapping
@RequestMapping("/cookieValueTest") public String cookieValueTest(@CookieValue(value = "userName") String userName) { System.out.println("通过@CookieValue获得用户名:" + userName); return "Cookie中的用户名是"+ userName; }
-
访问
localhost:8080/setCookie
-
访问
localhost:8080/cookieValueTest
6.4运行结果以及分析
再访问
7.普通参数传递 - @RequestParam
7.1需求分析
多用于普通请求参数的提交和表单的提交等等
7.2具体情境
用户需要提交自己的id和用户名到后台验证
7.3最佳实操
-
编写RequestMapping
@RequestMapping("/Param") public String pa(@RequestParam("id") int userid,@RequestParam("name") String username){ String x="传入的用户id是"+userid+"传入的用户名是"+username; return x; }
-
访问
localhost:8080/Param?id=xxx&name=xxx
7.4运行结果以及分析
运行结果
传递的参数会在后台进行匹配,id与@RequestParam中的value值进行匹配,匹配成功就赋值给被成功匹配的RequestParam注解的参数,于是id就赋值给userid;name就赋值给了username