目录
前言
该文章旨在于帮助大家更清晰的认识和知道 前后端请求参数的交互和 spring在控制层的关键注解的了解,以帮助大家解决实际工作中 ,使用的过程中 只其然不知其所以然的状态。1.常用代码规范 直接参照 阿里的社区代码规范文档 下载地址
下载地址: 阿里巴巴java开发规范-嵩山版
本着不重复造轮子,拿来即用的原则。
2.针对于spring mvc & springboot 在进行控制层编写时注解说明
这里不介绍具体实现原理,不谈历史,只做说明
这里是前后端对接交互 矛盾点问题最多的地方
这里希望大家能够更清晰的认识这几个注解 包括其作用
这里说明一个http的资源规范定义
GET(查)、POST(增)、PUT(改)、DELETE(删)
在http的资源规范里面 明确要求 不同的请求类型代表不同的操作,但是目前大家在使用和操作的过程中,很自然而然的认为 post请求因为是安全的,而通用性的使用POST/GET, 这是因为 它们俩个同样能够进行 PUT/DELETE的操作
@RequestMapping
作用: 是用来标注具体请求URL,映射并绑定到具体方法和特定的类上。具体作用可参照Servlet中在web.xml中配置servlet的作用
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>ServletClass</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<!-- 这里是需要映射的控制器请求路径 -->
<url-pattern>servletUrl</url-pattern>
</servlet-mapping>
提供参数:
@RequestMapping 提供了很多可用参数,来帮助我们接收不同的请求
先来看一下注解源码
package org.springframework.web.bind.annotation;
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@org.springframework.web.bind.annotation.Mapping
public @interface RequestMapping {
java.lang.String name() default "";
@org.springframework.core.annotation.AliasFor("path")
java.lang.String[] value() default {};
@org.springframework.core.annotation.AliasFor("value")
java.lang.String[] path() default {};
org.springframework.web.bind.annotation.RequestMethod[] method() default {};
java.lang.String[] params() default {};
java.lang.String[] headers() default {};
java.lang.String[] consumes() default {};
java.lang.String[] produces() default {};
}
注意 Target 里面包含 ElementType.TYPE 和ElementType.METHOD 表示 该注解是可以在 方法和类上进行使用的。
@RequestMapping 参数说明:
value 1
path1
params2
method3
headers4
consumes & produces 5
params 属性说明:
params 正例 前端请求:
$.ajax({
url: '/test?id=123&name=张三'
});
params 正例 后端接收:
@RequestMapping(path = "/test", params={"id=123","name=张三"})
public String test() {
return "success";
}
params 反例 前端请求:
$.ajax({
url: '/test?id=123&name=李四'
});
此时结果一定是404
method 属性说明:
method 后端示例
这种写法意味着该控制器 支持 增、查、改的操作
//这种写法意味着该控制器 支持 增、查、改的操作
@RequestMapping(path = "/test",method = {RequestMethod.POST,RequestMethod.GET,RequestMethod.PUT})
public String test() {
return "success";
}
method 后端示例
这种写法意味着该控制器 支持 增、查、改的操作 但是不建议这么做 一定要指定该方法的资源请求方式
//这种写法意味着该控制器将会根据你的请求头 来决定你的操作是哪种
@RequestMapping(path = "/test")
public String test() {
return "success";
}
headers 属性说明:
只要设置了当前参数 比如 我这里设置 host - localhost:8080
前端请求heraders中如果传递过来的host不是 localhost:8080 那么将会跨域 或者导致 请求拒绝
@RequestMapping(path = "/test", headers="Host=localhost:8080")
public String test() {
return "success";
}
consumes & produces 属性说明:
consumes 属性说明:
consumes属性是限制请求类型的
后端示例 正例
//这里说明该方法只接收 任意请求形式 但是请求contentType 类型必须要是 application/json
//否则不接收请求
@RequestMapping(path = "/test", consumes="application/json")
public String test() {
return "success";
}
前端示例 正例
$.ajax({
url: '/test',
contentType:'application/json'
});
前端示例 反例
$.ajax({
url: '/test',
contentType:'application/x-www-form-urlencoded'
});
produces 属性说明:
produces 属性是用来限制 返回数据类型
后端示例 正例:
@RequestMapping(path = "/test", produces="application/json")
@ResponseBody
public String test() {
return "{id:123,name:张三}";
}
前端示例 正例:
$.ajax({
url: '/test',
dataType:'application/json'
});
前端反例:
$.ajax({
url: '/test',
dataType:'application/x-www-form-urlencoded'
});
@RestController & @Controller 的区别
作用: 该注解 是 @Controller 和 @ResponseBody的结合体
意味着如果你的类使用该注解 就不需要在每个方法 打上@ResponseBody
例 @RestController
@RestController
@RequestMapping("/test")
public class TestController {
//此时你的方法就可以这么写
@GetMapping(path = "/test", produces="application/json")
public String test() {
return "{id:123,name:张三}";
}
}
例 @Controller
@Controller
@RequestMapping("/test")
public class TestController {
//此时你的方法就要这么写
@GetMapping(path = "/test", produces="application/json")
@ResponseBody
public String test() {
return "{id:123,name:张三}";
}
}
@ResponseBody
作用: 将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给客户端
示例: 看上一章 ↑
注意: 如果返回对象,按utf-8编码。如果返回String,默认按iso8859-1编码,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,例如@RequestMapping(value="/cat/query",produces=“text/html;charset=utf-8”),前面是请求的路径,后面是编码格式。 ---- 一个莫得灵魂标注来源的小尾巴
@PathVariable
作用:
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
主要是根据请求方法进行类的区别
后端示例:
@GetMapping(path = "/test/{id}")
public String test(@PathVariable("id") Integer id) {
return id;
}
前端示例
$.ajax({
url: '/test/123'
});
该注解 一般使用GTE 资源请求方式使用 也就是所谓的REST 风格
@PostMapping
该注解只是请求方式不同具体参数 参照 @RequestMapping介绍
@GetMapping
该注解只是请求方式不同具体参数 参照 @RequestMapping介绍
@PutMapping
该注解只是请求方式不同具体参数 参照 @RequestMapping介绍
@DeleteMapping
该注解只是请求方式不同具体参数 参照 @RequestMapping介绍
3. 请求入参说明
基于以上说明 大概说明了一些参数入参反参的内容,这里 就重点说一下,这里也是众多 前后端分离开发造成矛盾最多的地方。 这里主要给大家说明俩个 参数注解
@RequestParm
语法:
@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)
value:参数名
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值---- 参考资源 :一个莫得灵魂标注来源的小尾巴
后端示例: 单参数
@GetMapping("test")
public String test(@RequestParam("name")String name){
return name;
}
后端示例: 数组
@GetMapping("test")
public String test(@RequestParam("name[]")List<String> name){
return name;
}
前端示例: 单参数
$.get('/test',{name:'张三'},(ref)=>{
})
前端示例: 数组
$.get('/test',{name:['张三','李四','王五']},(ref)=>{
})
注意 @RequestParm 的参数接收本质是帮你把前端的请求参数全部变成 Map<String, Object> 类型的数据
key是 String
value 是Object 也就是任意类型
注意该参数接收方式不要去接收对象 因为该注解获取参数请求是
Content-Type 为 application/x-www-form-urlencoded 不明白这个类型是什么意思
看这里 再不明白自己百度
@RequestBody
作用: 处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/json、application/xml等类型的数据
正例 后端示例: 对象
@PostMapping("test")
public String test(@RequestBody Test test){
return test.toString();
}
正例 前端示例: 对象
$.ajax({
url: '/test',
contentType:'application/json',
data:{
test:{
name:"张三",
id:1233213,
sex:'男',
add:[
'地址1',
'地址2'
...
]
}
}
});
该注解是专门用来处理 json 格式的对象数据 和 xml 格式的数据 所以请不要用@RequestParam 来做这个操作