控制器
- 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 "通配符请求";
}
**
可以请求到多层。*
只能请求到一层。