1. 建立连接
1.1 @RequestMapping
该注解是用来注册接口的路由映射的。
路由映射:当用户访问一个URL时,将用户的请求对应到程序中的某个类的某个方法的过程。
1.2 @RestController
一个项目中,会有很多个类,每个类中可能会有很多的方法,Spring程序时怎么知道要执行哪个方法呢?
Spring会对所有的类进行扫描,如果类加了注解@RestController,Spring才会去看这个类中的方法有没有加@RequestMapping注解。
2. 请求
2.1 传递单个参数
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r1")
public String r1(Integer age){//包装类型
return "接收到参数 age:" + age;
}
@RequestMapping("/r2")
public String r2(int age){//基本类型
return "接收到参数 age:" + age;
}
}
注意:
-
使用基本数据类型来接收参数时,参数必须传(除boolean类型),否则会报500错误。
-
对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null ;所以企业开发中,对于参数可能为空的数据,建议使⽤包装类型。
2.2 传递多个参数
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r3")
public String r3(String name, String password){
return "接收到参数 name:" + name + ", password:"+ password;
}
}
2.3 传递对象
Person类
java
public class Person {
private String name;
private String password;
private Integer age;
public Person() {
}
public Person(String name, String password, Integer age) {
this.name = name;
this.password = password;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
Controller:
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r4")
public String r4(Person person){
return "接收到参数 person:" + person;
}
}
2.4 后端参数重命名(后端参数映射)
假设:
-
前端传的参数名:
q -
后端接收的参数名:
keyword
这种传递参数和接收参数的变量名不一致的情况,就可以使用@RequestParam来重命名前后端的参数名。
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r5")
public String r5(@RequestParam(value = "q") String keyword){
return "搜索词为 :" + keyword;
}
}
注意: 使用@RequestOaram注解进行参数重命名时,参数就变成了必填参数。
2.4.1 非必填参数设置
只需要设置@RequestParam中的required = false:
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r5")
public String r5(@RequestParam(value = "q", required = false) String keyword){
return "搜索词为 :" + keyword;
}
}
2.5 传递数组
Spring MVC可以自动绑定数组参数的赋值。
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r6")
public String r6(String[] arr){
return "数组:" + Arrays.toString(arr) + ", length:" + arr.length;
}
}

2.6 传递集合
集合参数:和数组类似,同一个请求参数名有为多个,且需要使用 @RequestParam 绑定参数关系。
默认情况下,请求中参数名相同的多个值,是封装到数组.如果要封装到集合,要使用@RequestParam 绑定参数关系。
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r7")
public String r7(@RequestParam(required = false) List<String> list){
StringBuilder builder = new StringBuilder();
for (String s: list){
builder.append(s).append(",");
}
return "集合:" + builder.toString();
}
}

2.7 传递JSON数据
接收JSON对象,需要使用@RequestBody注解。
RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中。
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r8")
public String r8(@RequestBody Person person){
return "接收json数据:" + person;
}
}

2.8 获取URL中参数@PathVariable
@PathVariable:这个注解主要作用是在请求URL路径的数据绑定。
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/article/{articleId}")
public String r9(@PathVariable("articleId") Integer articleId){
return "r9 文章ID:" + articleId;
}
@RequestMapping("/article/{articleId}/{type}")
public String r10(@PathVariable("articleId") Integer articleId, @PathVariable String type){
return "r10 文章ID:" + articleId + ", type:" + type;
}
}
2.9 上传文件@RequestPart
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/r11")
public String r11(@RequestPart("file111") MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();
File destFile = new File("D:\\temp\\"+ originalFilename);
//上传文件
file.transferTo(destFile);
return "存储文件成功";
}
@RequestMapping("/r12")
public String r12(@RequestParam("file111") MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();
File destFile = new File("D:\\temp\\"+ originalFilename);
//上传文件
file.transferTo(destFile);
return "存储文件成功";
}
}
2.10 获取Cookie
2.10.1 传统获取Cookie
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie: cookies){
System.out.println(cookie.getName() + ":" + cookie.getValue());
}
}
return "获取cookie成功";
}
}
Spring MMVC 是基于Servlet API 构建的原始的Web框架,也是在Servlet的基础上实现的。
HttpServletRequest HttpServletResponse是Servlrt提供的两个类, 是Spring MVC 方法的内置对象,需要时直接在方法中添加声明即可。
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
HttpServletResponse对象代表服务器的响应,HTTP响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等。通过这个对象提供的方法,可以获得服务器响应的所有内容。
2.10.2 简洁获取Cookie
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue("name") String name){
return "获取cookie成功" + name;
}
}
2.11 获取Session
2.11.1 Session存储
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/setSession")
public String setSession(String name, HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("name", name);
session.setAttribute("age", 1);
return "设置session成功";
}
@RequestMapping("/setSession2")
public String setSession2(String name, HttpSession session){
// HttpSession session = request.getSession();
session.setAttribute("name", name);
session.setAttribute("age", 1);
return "获取session成功";
}
}
2.11.2 Session读取
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
HttpSession session = request.getSession(false);
String name = (String)session.getAttribute("name");
Integer age = (Integer) session.getAttribute("age");
return "从session中获取信息, name:" +name + ", age:" + age;
}
@RequestMapping("/getSession2")
public String getSession2(HttpSession session){
String name = (String)session.getAttribute("name");
Integer age = (Integer) session.getAttribute("age");
return "从session中获取信息, name:" +name + ", age:" + age;
}
@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute("name") String name){
return "从session中获取信息, name:" +name;
}
}
2.12 获取Header
2.12.1 传统获取
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String userAgent = request.getHeader("User-Agent");
return "从header中获取信息, userAgent:" +userAgent;
}
}
2.12.2 简洁获取
java
@RequestMapping("/request")
public class RequestController {
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){
return "从header中获取信息, userAgent:" +userAgent;
}
}
3. 响应
3.1 返回数据@ResponseBody
@ResponseBody既是类注解,也是方法注解。
如果该注解是作用在类上,表示该类的所有方法返回的都是数据,如果作用在方法上,表示该方法返回的数据。
4. @RestController 和 @Controller 有什么关联和区别?
早期的MVC概念中,后端会返回视图。

随着互联网的发展,项目开发变成了"前后端分离"的模式,Java主要是用来做后端项目的开发,所以也就不再处理前端相关的内容了。
MVC的概念也逐渐发生了变化,View不再返回视图,而是返回显示视图时需要的数据。所以 @RestController 返回的是数据;@Controller返回的视图 。
@RestController = @Controller + @responseBody
@Controller: 定义一个控制器,Spring框架启动时加载,把这个对象交给Spring管理。
@ResponseBody: 定义返回的数据格式为非视图。