代码规范和spring控制层注解简要说明

it2024-05-07  59

目录

前言1.常用代码规范 直接参照 阿里的社区代码规范文档 下载地址2.针对于spring mvc & springboot 在进行控制层编写时注解说明@RequestMapping@RequestMapping 参数说明:params 属性说明:params 正例 前端请求:params 正例 后端接收:params 反例 前端请求: method 属性说明:method 后端示例method 后端示例 headers 属性说明:consumes & produces 属性说明:consumes 属性说明:produces 属性说明: @RestController & @Controller 的区别@ResponseBody@PathVariable@PostMapping@GetMapping@PutMapping@DeleteMapping 3. 请求入参说明@RequestParm@RequestBody

前言

该文章旨在于帮助大家更清晰的认识和知道 前后端请求参数的交互和 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 来做这个操作


value 属性跟path属性是一样的 用来填入 当前请求地址。 ↩︎ ↩︎

params 表示限制请求参数,并且表现形式为 www.xxx.com?id=123&name=张三 如果请求参数不为 id=123&name=张三 那么将会返回404 ↩︎

method 属性表示当前请求方式是 GET PUT POST 还是DELETE,当然由于该属性是数组形式所以 ↩︎

headers 这个属性表示限制请求头 ↩︎

consumes & produces 它们俩个的作用是限制 请求类型 和 返回类型 ↩︎

最新回复(0)