springmvc官方文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/
本篇文章主要介绍一下 @Controller、@GetMapping、@PostMapping、@RequestMapping、@RestController、@RequestBody、@ResponseBody 、@PathVariable、@RequestParam注解
1.@Controller
直接写在Controller层的类上面,主要负责处理前端控制器(DispatcherServlet )发过来的请求,经过业务逻辑层处理之后封装层一个model,并将其返回给view进行展示。(加了@Controller注解后就不用去实现Controller接口了)
2.@GetMapping,postMapping,@RequestMappig注解
get请求就用GetMapping,post请求用PostMapping,RequestMapping是两种请求都支持,其中,如果没有指定,SpringMVC会根据前端表单请求的类型自动判断,平时默认是get请求。
以requestMapping请求为例,其中有一些常见的参数
①value和path:这两个参数源码点进去发现其实都是一样的。都是用来指定路径,比如下面path=“/test”,那么访问这个方法的路径就是http://localhost:9090/test,其中9090是端口号。
补充:@AliasFor注解是用来表示这两个属性完全相同,相当于是别名,且不能同时出现,两个属性可以通过对方来取值
②produces是指定返回内容类型如 produces = “application/json;
③method指定请求类型,主要有 GET、PUT、POST、DELETE,默认为 GET
④charset:用来防止中文乱码,charset=UTF-8”
⑤params注解用于限定url访问的条件,比如下图中的params,表示url中username=root且passwd!=10时才能正确访问
2.@ResponseBody注解
用了@ResponseBody注解的方法不会走视图解析器,如果返回值是字符串那么会直接在页面上打印这个字符串,如果是
3.@RestController
@RestController注解相当于@ResponseBody和@Controller的结合
4.@RequestBody
GET方式无请求体所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。
注意:一个请求,只能用一个RequestBody;可以有多个RequestParam
如果参数是放在请求体中,传入后台的话,那么后台要用@RequestBody才能接收到;如果不是放在请求体中的话,那么后台接收前台传过来的参数时,要用@RequestParam()来接收,或则形参前什么也不写也能接收。
见下面注册功能的例子,ajax传入数据到后台,当@RequestBody修饰的形参是String类型的时候和Map类型恶的时候打印出来的值分别如下,可见,如果是形参是String,那么会把data转为字符串,如果是Map的话就会转为对应的map类型封装成key-value的形式(平时Map用的比较多)
5.@RequestParam
这里可以看一下源码,RequestParam里面其实有四个参数,其中name和value互为别名,作用相同,所以最多只能写三个,其中:
name/value :这个属性指定的值和url中传入参数的key的值要相同才能传入形参,如果没有这个参数的话那么形参的变量名要和url中的参数名字一样
required:决定这个参数是否是必要的,默认值为true
defaultValue:决定默认值(如果有设置这个属性的话,required会失效,因为有默认值就代表required=true)
下面是官方文档对四个参数的解释
比如下面这个例子,有对形参id做配置,对name不做配置,测试结果如果
@ResponseBody
@RequestMapping(path = "/test")
public String test(@RequestParam String name,@RequestParam(value = "ids",required =true,defaultValue = "1") String id){
System.out.println("name="+name);
System.out.println("ids="+id);
return "123";
}
①url正常:正常打印
②url中没有id,那么输出的id为默认值
③url中name没有指定值,那么返回的就是null(因为他没有默认值,且name不能不写,因为默认required为true)
6.@PathVariable
表示方法参数应绑定到URI模板变量的注释,该注解有三个属性(源码见下图):
①name/value:用于指定url中绑定要绑定的变量
②required:决定变量是否必须,默认为true
用法举例:
path中的name和形参中的name绑定,path中的ids和形参id绑定,然后测试的时候url中如果两个参数值都给了,那么测试正常,但是如果只给一个参数的话会发现required失效的情况
此时会发下required失效了,只给一个参数不行
解决required失效的方法:添加多个path
测试结果如下,id没有赋值的时候值为空
注意:如果没有指定required,那么默认为true,这时下面这种给出多个path的写法是错了,此时测试结果如下
此外,PathVariable还支持这种参数是map<String,String>,此时可以直接通过get(占位符)取到对应值
示例如下:
7.@RequestAttribute
可以直接用@RequestAttribute来获取到Request域中存在的值