SpringBoot---Controller
控制器
- Spring Boot提供了
@Controller和RestController两种注解来标识此类负责接收和处理HTTP请求。 - 如果请求的是页面和数据,使用
@Controller注解即可; - 如果只请求数据,可以使用
@RestController注解。
一个最简单的控制器
@RestController
public class hello() {
@GetMapping("/hello")
public String hello() {
return "hello world";
}
}
@Controller
@Controller
public class HelloController {
@RequestMapping("/hello")
public String index(ModelMap map) {
map.addAttribute("name", "cloud");
return "hello";
}
}
- 返回的是一个视图,就是一个页面。
- 示例中返回了hello页面和name的数据,在前端页面中可以通过
${name}参数获取后台返回的数据并显示。 - Controller通常与Theymeleaf模板引擎结合使用。(用了就不是前后端分离了)
RestController
- 返回的数据是以文本的形式,后端不涉及页面相关内容。(一般用这个)
- 默认情况下,@RestController注解会将返回的对象数据转换为
JSON格式。
原理

Model:用来存储数据
Controller:控制器,协调控制
View:视图
数据库里加载的属性先封装到Model,再通过Controller绑定到View上。
Controller还可以接收用户的请求,用户发送请求,控制器接收然后去Model取数据,再通过Controller来绑定到View,View最后再响应给用户。
路由映射
@RequestMapping注解主要负责URL的路由映射,它可以添加在Controller类或者具体的方法上。- 如果添加在Controller类上,则这个COntroller中的所有路由映射都会加上此映射规则。
- 如果只添加在方法上,则只对当前方法有效。
@RequestMapping注解包含很多属性参数来定义HTTP请求映射规则。常用的属性有:value:请求URL的路径,支持URL模板、正则表达式。method:HTTP请求方法。consumes:请求的媒体类型(Content-Type),如appllication/json。produces:响应的媒体类型。params、hearders:请求的参数以及请求头的值。
前三个用的比较多。
value属性
-
value支持简单表达式
@RequestMapping("/user") -
@RequestMapping支持使用通配符匹配URL,用于统一映射某些URL规则类似的请求
@RequestMapping("/getJson/*.json")当在浏览器中请求
/getJson/a.json或者/getJson/b.json时都会匹配到后台的Json方法。 -
@RequestMapping的通配符匹配非常简单实用,支持
*、?、**等通配符。- 符号
*匹配任意字符。 - 符号
?匹配单个字符。 - 符号
**匹配任意路径。
有通配符的优先级低于没有通配符的,比如/user/add.json比/user/*.json优先匹配。
有**通配符的优先级低于有*通配符的。
- 符号
Method匹配
-
HTTP请求Method有
GET、POST、DELETE等方式,HTTP支持全部的Method。 -
@RequstMapping注解提供了method参数指定请求的Method类型,包括
RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETEW、RequestMethod.PUT等值,分别对应HTTP请求的Method。 -
Method匹配也可以使用
@GetMapping、@PostMapping等注解替代。@RequestMapping(value = "/hello", method = RequestMethod.GET) //等价于 @GetMapping("/hello")
参数传递
- @RequestMapping将请求参数绑定到控制器的方法参数上,接收的参数来自
HTTP请求或请求url的QueryString - 当请求的参数名与Controller的业务方法参数名称一致时,@RequstMapping可以省略。
@PathValue用来处理动态的URL,URL的值可以作为控制器中处理方法的参数。@RequestBody接收的参数来自requestBody中,即请求体。一般用于处理非Content-Type:application/x-www-form-urlencoded等编码格式的数据,比如:application/json、application/xml等类型的数据。
简单示例
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello(String nickname) {
return "hello" + nickname;
}
}
此时在浏览器输入http://localhost:8080/hello?nickname=cloud
cloud就被传过去了,网页显示 hellocloud
- 一个参数使用
?。
http://localhost:8080/hello?nickname=cloud - 多个参数使用
&拼接。
http://localhost:8080/hello?nickname=cloud&phone=123
网页显示hellocloud123@RequestMapping(value = "/hello", method = RequestMethod.GET) public String hello(String nickname, String phone) { return "hello" + nickname + phone; } }
用法总结
GET
简单路由传递
//http://localhost:8080/getTest1
@RequestMapping(value="/getTest1", method= RequestMethod.GET)
public String getTest1() {
return "GET请求";
}
传递参数
@RequestMapping(value="/getTest2", method = RequestMethod.GET)
//http://localhost:8080/getTest2?nickname=cloud&phone=123
public String getTest2(String nickname, String phone) {
System.out.println("nickname:"+nickname);
System.out.println("phone:" +phone);
return "GET请求";
}
当传递的参数名与方法名不一样
- 这里需要用到
@RequestParam参数映射。 - 需要注意的是,加上了这个参数映射意味着这个参数是必须传递的,如果不传递则访问不到这个方法。
@RequestMapping(value="/getTest3", method=RequestMethod.GET) //http://localhost:8080/getTest3?nickname=cloud public String getTest3(@RequestParam("nickname") String name){ System.out.println(name); return "GET请求"; } - 如果希望这个参数是可选的,则需另外添加一个
required@RequestMapping(value="/getTest3", method=RequestMethod.GET) //http://localhost:8080/getTest3?nickname=cloud public String getTest3(@RequestParam(value = "nickname",require = false) String name){ System.out.println(name); return "GET请求"; }
POST
我们使用Apipost来发送post请求。
简单路由传递
```
@RequestMapping(value="/postTest1", method = RequestMethod.POST)
public String postTest1() {
return "POST请求";
}
```

传递参数
@RequestMapping(value = "/postTest2", method = RequestMethod.POST)
public String postTest2(String username, String password) {
System.out.println("username:" + username);
System.out.println("password:" + password);
return "POST请求";
}


- 使用Query就是拼接在地址后面。
传递对象
当我们传递的数据过多时,封装成一个对象更加简洁方便。
@RequestMapping(value = "/postTest3", method = RequestMethod.POST)
public String postTest3(User user) {
System.out.println(user);
return "POST请求";
}

传递JSON类型
接收JSON类型的数据需要加一个单独的注解@RequestBody
@RequestMapping(value = "/postTest4", method = RequestMethod.POST)
public String postTest4(@RequestBody User user) {
System.out.println(user);
return "POST请求";
}

通配符传递
@GetMapping("/test/**")
public String test() {
return "通配符请求";
}

**可以请求到多层。*只能请求到一层。

浙公网安备 33010602011771号