Java高级 | 【实验二】控制器类+相关注解知识
隶属文章: Java高级 | (二十二)Java常用类库-CSDN博客
系列文章: Java高级 | 【实验一】Spring Boot安装及测试 最新-CSDN博客
一、MVC模式
MVC(Model View Controller),是软件开发的一种思想,他把软件系统分为 以下三部分:
Model(模型):用来处理程序中数据逻辑的部分
View(视图):在应用程序中,专门和浏览器进行交互,展示数据的资源
Contreller(控制器):负责协调视图和模型之间的交互,主要功能是处理视图发来的请求。即,根据请求决定使用用哪一个模型来处理,以及处理完后需要跳回到哪一个视图,也就是用来连接视图和模型的。
MVC 它是一种思想,而SpringMVC 它是将这种思想进行了实现。SpringBoot 只是实现 SpringMVC 的一种方式。
二、SpringBoot基础之控制层Controller详解
1.Controller层主要工作
从HTTP请求中获取信息,提取参数,并将其分发给不同的处理服务(service层),并向前端返回service层处理后的数据(JSON数据或者ModelAndView对象)。
2.Controller层重要注解
Controller层主要包含了以下6个注解。
- @Controller
- @RequestMapping
- @ResponseBody
- @RestController
- @GetMapping
- @PostMapping
1、@Controller
@controller注解用于标识一个Java 类是一个控制器。
2、@RequestMapping
@RequestMapping注解告知Spring的控制器类或者函数映射到哪个URL,通常@RequestMapping参数有:
(1)注解在方法上
@RestController public class UserController { // 映射到方法上 // localhost:8080/user/login @RequestMapping("/user/login") public String login() { return "user login"; } // localhost:8080/user/register @RequestMapping("/user/register") public String register() { return "user register"; } } |
(2)注解在类和方法上
@Controller public String register() { |
(3)用 @RequestMapping 处理 HTTP 的各种方法
@RequestMapping中使用method 属性来声明HTTP请求所使用的方法类型。
@RestController |
(4)@RequestMapping 来处理多个 URI
@RestController @RequestMapping("/home") public class MultipleMapping { @RequestMapping(value = { "", "/page", "page*", "view/*,**/msg" }) String indexMultipleMapping() { return "Hello from index multiple mapping."; } } |
(5)带有 @RequestParam 的 @RequestMapping
@RequestParam 注解配合 @RequestMapping 一起使用,可以将请求的参数同处理方法的参数绑定在一起。
@RestController |
(5)使用 @RequestMapping 的header属性来处理消息头
post() 方法能同时接受 text/plain 还有 text/html 的请求
@RestController @RequestMapping("/home") public class ControllHeader { @RequestMapping(value = "/head", headers = { "content-type=text/plain", "content-type=text/html" }) public String post() { return "Mapping applied along with headers"; } } |
(6)使用 @RequestMapping 的params属性来处理请求参数
@RestController @RequestMapping("/switch") public class ControllSwitch { @RequestMapping(value = "/fetch", params = { "personId=10" }) String getParams(@RequestParam("personId") String id) { return "Fetched parameter using params attribute = " + id; } @RequestMapping(value = "/fetch", params = { "personId=20" }) String getParamsDifferent(@RequestParam("personId") String id) { return "Fetched parameter using params attribute = " + id; } } |
getParams() 和 getParamsDifferent() 两个方法都能处理相同的一个 URL (/home/fetch) ,但是会根据 params 元素的配置不同而决定具体来执行哪一个方法。
(7)使用 @RequestMapping 处理动态 URI
@RestController @RequestMapping("/dynamic") public class ControllerDynamicUriValue { //http://localhost:8080/dynamic/fetch/10 @RequestMapping(value = "/fetch/{id}", method = RequestMethod.GET) String getDynamicUriValue(@PathVariable String id) { System.out.println("ID is " + id); return "Dynamic URI parameter fetched"; } //http://localhost:8080/dynamic/fetch/tye/tom @RequestMapping(value = "/fetch/{id:[a-z]+}/{name}", method = RequestMethod.GET) String getDynamicUriValueRegex(@PathVariable("name") String name) { System.out.println("Name is " + name); return "Dynamic URI parameter fetched using regex"; } } |
3、@ResponseBody
@ResponseBody 注解表示方法的返回值应该直接写入 HTTP 响应体中,而不是被解析为视图。正常情况下,Controller类中函数返回是一个模板对象(页面),但是有时候我们希望返回值数值型(字符串或者Json格式数据),这时就需要添加@ResponseBody注解。@ResponseBody注解可以添加到类或者函数上。
@ResponseBody返回的是数据
4、@RestController
@RestController是一个组合注解,它结合了 @Controller 和 @ResponseBody 注解的功能(就相当于把两个注解组合在一起)。在使用 @RestController 注解标记的类中,每个方法的返回值都会以 JSON 或 XML 的形式直接写入 HTTP 响应体中,相当于在每个方法上都添加了 @ResponseBody 注解。
@RestController 适用于构建 RESTful 风格的 API,其中每个方法的返回值会直接序列化为 JSON 或 XML 数据并发送给客户端。而 @Controller 适用于传统的 MVC 架构,它负责处理请求并返回相应的视图。
@RestController下的方法默认返回的是数据格式,@Controller注解标注的类下面的方法默认返回的就是以视图为格式。
什么时候需要返回的是视图,什么时候需要返回数据?
当设计 RESTful API 时,一般的原则是:
如果客户端希望获取数据(例如 JSON、XML),则返回数据。
如果客户端希望展示数据(例如 HTML 页面),则返回视图。
5、@RequestMapping
@GetMapping注解可以用于类和方法上,用于定义HTTP GET请求的URL路径。当客户端发送HTTP GET请求时,Spring Boot会自动将请求映射到具有相应URL路径的控制器方法上。
6、@PostMapping
在 Spring Boot 中,我们经常需要编写 RESTful Web 服务,以便于客户端与服务器之间的通信。为了简化 RESTful Web 服务的开发,Spring Boot 提供了 @PostMapping 注解,它可以让我们更方便地编写 POST 请求处理方法。
@PostMapping是一个组合注解,它是@RequestMapping(method = RequestMethod.POST)的缩写。它用于处理HTTP POST请求的方法,只能标注在方法上。使用@PostMapping注解的方法将仅响应POST请求。
7、@GetMapping注解
@GetMapping也是一个组合注解,它是@RequestMapping(method = RequestMethod.GET)的缩写。它用于处理HTTP GET请求的方法,也只能标注在方法上。使用@GetMapping注解的方法将仅响应GET请求。