本章摘要:本章重点介绍springboot中controller的使用。
上一篇:SpringBoot入门学习笔记-1-idea创建springboot项目_Bill老罗的博客-CSDN博客
现在Java多数人都用来写JavaWeb了,所以Controller变成很常用,也是最基础的必备技术,掌握了Controller的使用,就可以写对外接口了,进行SpringBoot的简单体验。
目录
一、@Controller与@RestController用法和区别
二、类文件外面添加 RequestMapping,相当于添加了一级路由,类里面的是二级路由。
form-data以健值对的方式传参(完整描述是multipart/form-data)
application/x-www-form-urlencoded也是键值对方式传参,多了转码处理。
具体差异网上很多介绍,这里说一下x-www-form-urlencoded与form-data差异重点:
form-data除了传数据外,一般用来传送文件。postman也能看出来:
application/json是前后端交互的主流数据格式。
POST请求类型为JSON时,我们一般会用Map或JSONOBJECT或JavaBean来接收。
一、@Controller与@RestController用法和区别
@RestController Spring4之后新加的注解,以前返回json
需要@ResponseBody配合@Controller来使用,现在只需要一个@RestController即可
可以看到都能实现相同的效果。
那有什么区别呢?
@RestController只能返回json格式的数据。不能返回文件。比如我要返回html\jsp\xml等文件,那就要使用@Controller配合视图解析器InternalResourceViewResolver才行。
比如,我在resources/static下面新建一个1.html文件,那么我就可以在控制层返回它:
注:当然,在static文件夹下,是可以直接localhost:8080/1.html访问的,这里只是为了演示Controller用途,生产中是可以把需要返回的文件放在非static文件夹的。
重点:@RestController = @Controller +@ResponseBody。@Controller注解可以返回文件。
二、类文件外面添加 RequestMapping,相当于添加了一级路由,类里面的是二级路由。
三、GET请求与传参
@RequestMapping 定义的接口,是不限定GET\POST的,所以都可以访问。
1、定义GET请求类型
可通过在RequestMapping中,通过method参数指定或直接用GetMapping指定。
@RestController
@RequestMapping("/get")
public class Get {
@RequestMapping(value = "/type1",method = RequestMethod.GET)
public String get1(){
return "RequestMapping with method=GET";
}
@GetMapping("/type2")
public String get2(){
return "GetMapping with method=GET";
}
}
2、请求参数,可以通过path或问号传参。
@GetMapping("/{id}/set")
public String get3(@PathVariable String id){
// @PathVariable定义路径参数,并在Mapping中{id}定义参数位置
return "path args " + id;
}
@GetMapping("/set")
public String get4(@RequestParam String key,@RequestParam String value){
// @RequestParam 定义参数
return "path args " + key +":"+value;
}
3、设置非必填参数
通过设置required =false来实现
@GetMapping("/set")
public String get4(@RequestParam(required = false)String key,@RequestParam String value){
// @RequestParam 定义参数
return "path args " + key +":"+value;
}
4、返回参数
方法前面的返回值类型就是接口的返回值类型。如上面我们都是返回String类型。
如果返回值类型比较复杂,可以用javaBean或Map类型,比如HashMap.
@GetMapping("/map")
public HashMap get5(){
// @RequestParam 定义参数
HashMap map = new HashMap<>();
map.put("aa","aa1");
map.put("bb","bb1");
return map;
}
注:生产中可能bean、jo对象更常见。
四、POST请求与传参
@RequestMapping 定义的接口,是不限定GET\POST的,所以都可以访问。
1、定义POST请求类型
可通过在RequestMapping中,通过method参数指定。或用PostMapping指定。
@RequestMapping(value = "/1",method = RequestMethod.POST)
public String p1(){
return "OK";
}
@PostMapping("/2")
public String p2(){
return "OK";
}
2、请求参数
GET请求中的传参方式都支持。同时增加了Body传参。
// @PathVariable 和 @RequestParam都支持
@PostMapping("/{id}/set")
public String post1(@PathVariable String id){
// @PathVariable定义路径参数,并在Mapping中{id}定义参数位置
return "path args " + id;
}
@PostMapping("/set")
public String post2(@RequestParam(required = false)String key,@RequestParam String value){
// @RequestParam 定义参数
return "path args " + key +":"+value;
}
然后,我们看到问号传参,其实就是Params传参,一般我们也称为url传参。
Body传参时,都有哪些类型呢?常见的有form-data,x-www-form-urlencoded,json
form-data以健值对的方式传参(完整描述是multipart/form-data)
@PostMapping("/form")
public HashMap post3(@RequestParam String key,@RequestParam String value){
// @RequestParam 定义参数
HashMap map = new HashMap<>();
map.put("key",key);
map.put("value",value);
return map;
}
上图代码示例中,接口/form中接收两个参数。分别是key\value,分别放在问号传参和form-data传参,发现都可以被@RequestParam参数接收。
application/x-www-form-urlencoded也是键值对方式传参,多了转码处理。
是POST表单提交的默认方式(如果不指定),看起来效果和form-data差不多。
具体差异网上很多介绍,这里说一下x-www-form-urlencoded与form-data差异重点:
x-www-form-urlencoded是POST表单提交的时默认格式,传数据时相对form-data是对中文字符等进行了转码处理,比如url转码后变成这样格式的controller%2520post%2520%25E4%,好处是不会乱码。
form-data除了传数据外,一般用来传送文件。postman也能看出来:
application/json是前后端交互的主流数据格式。
Controller会把Body中所有的数据,都做为一个@RequestBody 入参处理。
@PostMapping("/json")
public HashMap post4(@RequestBody String key){
// @RequestParam 定义参数
HashMap map = new HashMap<>();
map.put("key",key);
return map;
}
即然入参是一个JSON,那么我也用JSON来接收,是不是就不用转化了?
POST请求类型为JSON时,我们一般会用Map或JSONOBJECT或JavaBean来接收。
@PostMapping("/map")
public HashMap post4(@RequestBody HashMap map){
// @RequestParam 定义参数
return map;
}
3、返回参数
和GET方法一样,没有区别。一般都会有统一的returnObj返回。比如返回一个JsonObject,格式如下:{“code”:1000,msg:"OK",data:111111}。
或者用status代替code,表达请求成功还是失败。data里放业务逻辑加工后的返回结果数据。