首页 > 其他分享 >SpringBoot---Controller

SpringBoot---Controller

时间:2023-03-17 13:35:24浏览次数:33  
标签:SpringBoot 请求 public --- String Controller nickname hello RequestMapping

控制器

  • 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

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

标签:SpringBoot,请求,public,---,String,Controller,nickname,hello,RequestMapping
From: https://www.cnblogs.com/cloud0-0/p/17225327.html

相关文章

  • TCP/IP网络编程 -- (十二)I/O复用
    TCP/IP网络编程--(十二)I/O复用如果为了并发使用多进程服务器,代价很大。因为创建进程需要大量的运算和内存空间,并且相互之间的数据交换也要用管道这种相对复杂的方法复用......
  • pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?(pytest-assume)
    (19-pytes断言失败后,怎样保持后续的断言继续执行?(pytest-assume))1引入pytest使用assert进行断言,如果有多个断言,第一个失败了,那么后续的断言将不会执行;那么如果第一个断......
  • BUUCTF Crypto 1-20
    https://blog.csdn.net/ao52426055/article/details/1093046461、MD5MD5在线网站解密2、一眼就解密base64解码3、URL编码控制台解码decodeURI()、decodeURICompon......
  • C语言校园核酸检测管理程序[2023-03-17]
    C语言校园核酸检测管理程序[2023-03-17]实习(实训)任务书一、实习的目的和任务C语言课程设计主要是检验学生运用C语言进行系统开发的能力,以及考查学生综合运用各学科进行......
  • 【Android 逆向】【攻防世界】人民的名义-抓捕赵德汉1-200
    1.这一题下载下来是个jar文件,感觉很android关系不大,但还是放在了mobile这个分类下了2.直接javajar运行,提示需要输入密码#java-jar169e139f152e45d5ae634223fe53e6b......
  • BUUCTF MISC 41-60
    41、秘密文件题目提示的盗取了文件,于是首先过滤FTP协议,追踪一下TCP流,发现存在一个压缩包于是尝试用foremost提取,得到一个加密的压缩包没有任何提示,尝试四位数暴力破解......
  • BUUCTF MISC 61-80
    61、黑客帝国打开题目给的TXT文件发现很像文件的十六进制,导入010查看一下,发现是一个rar文件将文件另存为rar得到一个加密的压缩包,无任何提示,先尝试四位纯数字爆破得到......
  • python Non-zero exit code (2)
    一、相关命令python进入命令行命令,python退出命令,quit() 二、Non-zeroexitcode(2)解决方案直接在pyCharm中使用终端命令,确保在同一个项目之下对于不同的pyt......
  • 牛客网手撕代码(1-30)
    1.四选一多路选择器题目制作一个四选一的多路选择器,要求输出定义上为线网类型状态转换:状态序号d011d110d201d300解法input[1:0]d1,d2,d......
  • BUUCTF Crypto 21-40
    21、RSA1:::tipsp=863763376725700856709965348654109117132049150943361544753916243791124417588566780639841179052408355344515811350222774520620532769093950403......