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

前言

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


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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值