SpringBoot---Controller

控制器

  • Spring Boot提供了@ControllerRestController两种注解来标识此类负责接收处理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格式。

原理

image
Model:用来存储数据
Controller:控制器,协调控制
View:视图
数据库里加载的属性先封装到Model,再通过Controller绑定到View上。
Controller还可以接收用户的请求,用户发送请求,控制器接收然后去Model取数据,再通过Controller来绑定到View,View最后再响应给用户。

路由映射

  • @RequestMapping注解主要负责URL的路由映射,它可以添加在Controller类或者具体的方法上。
    • 如果添加在Controller类上,则这个COntroller中的所有路由映射都会加上此映射规则
    • 如果只添加在方法上,则只对当前方法有效。
  • @RequestMapping注解包含很多属性参数来定义HTTP请求映射规则。常用的属性有:
    1. value:请求URL的路径,支持URL模板、正则表达式。
    2. method:HTTP请求方法。
    3. consumes:请求的媒体类型(Content-Type),如appllication/json。
    4. produces:响应的媒体类型。
    5. 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有GETPOSTDELETE等方式,HTTP支持全部的Method。

  • @RequstMapping注解提供了method参数指定请求的Method类型,包括RequestMethod.GETRequestMethod.POSTRequestMethod.DELETEWRequestMethod.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/jsonapplication/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
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
     public String hello(String nickname, String phone) {
    	 return "hello" + nickname + phone;
     }
    }
    
    网页显示hellocloud123

用法总结

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请求";
}
```

image

传递参数

@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请求";
}

image
image

  • 使用Query就是拼接在地址后面。

传递对象

当我们传递的数据过多时,封装成一个对象更加简洁方便。

  @RequestMapping(value = "/postTest3", method = RequestMethod.POST)
    public String postTest3(User user) {
        System.out.println(user);
        return "POST请求";
    }

image

传递JSON类型

接收JSON类型的数据需要加一个单独的注解@RequestBody

@RequestMapping(value = "/postTest4", method = RequestMethod.POST)
    public String postTest4(@RequestBody User user) {
        System.out.println(user);
        return "POST请求";
    }

image

通配符传递

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

image

  • **可以请求到多层。
  • *只能请求到一层。
posted @ 2023-03-17 13:22  月豕  阅读(176)  评论(0)    收藏  举报