初学SpringMVC被一些注解搞得头昏眼花,在ChatGPT的帮助下特定区分了一下它们,如有错误望指正.
1.1 @Controller和@RestController的区别
都是定义控制器的(Controller)的注解
-
@Controller注解的类的方法的返回值通常为视图(View),返回值可以通过返回字符串、ModelAndView等方式来相应客户端需求
-
@RestController结合了@Controller 和 @ResponsebBody的功能。该注解注解的类的方法的返回值是数据(一般是JSON或XML格式)而不是视图
-
//这段代码,@Controller注解,返回的是“Hello”视图,后者返回的是“hello”字符串数据 @Controller public class MyController { @GetMapping("/hello") public String hello() { return "hello"; } }
-
@Controller结合@RequestBody使用可以产生和@ResponseBody一样的效果
@Controller public class MyController { @GetMapping("/hello") @ResponseBody public String hello() { return "hello"; } }
-
至此@Controller和@RestController的区别应该是较为清楚的:一个返回视图,一个返回数据
1.2 @RequestMapping 和@GetMapping、@PostMapping的区别
-
@RequestMapping:@RequestMapping是一个通用的注解,可以用于处理任何类型的HTTP请求(GET、POST、PUT等)。通过设置不同的请求方法(method)属性,可以指定处理不同类型请求的方法。例如,@RequestMapping(method = RequestMethod.GET)表示处理GET请求。
-
@GetMapping用于处理Get请求:
-
@PostMapping用于处理Post请求:
-
Get请求和Post请求的差别:
-
参数传递方式:GET请求通过URL的查询字符串传递参数,参数会以键值对的形式附加在URL的末尾(例如:[Example Domain);而POST请求将参数放在请求的消息体中进行传递,不会暴露在URL中。]
-
数据传递大小限制:由于GET请求的参数直接暴露在URL中,因此其传递的数据大小通常受到浏览器或服务器对URL长度的限制(通常为几千个字符);而POST请求将参数放在消息体中,没有长度限制。
-
安全性:GET请求的参数暴露在URL中,容易被恶意获取,因此不适合传递敏感信息;POST请求将参数放在消息体中,相对安全性较高。
-
缓存:GET请求可以被浏览器缓存,可以通过设置缓存头来控制缓存策略;而POST请求默认不会被缓存。
-
幂等性:GET请求是幂等的,即多次重复请求不会产生副作用;而POST请求不是幂等的,多次重复请求可能会有副作用。
-
总的来说,GET请求适合传递少量的非敏感信息,比如查询操作;而POST请求适合传递较大量或敏感信息,比如表单提交、数据修改等操作。具体选择哪种请求方法取决于实际需求以及安全性考虑。
-
-
@RequestMapping 是通用的,Get请求和Post请求在传递参数的时候是不一样的形式。
1.3 @RequestBody的作用
-
@ResponseBody
注解表示该方法的返回值将直接作为HTTP响应的内容,而不是通过视图解析器进行渲染。
@Controller public class QuickController { @GetMapping("model/p2") @ResponseBody public User p1(){ User user = new User(); user.setName("lisi"); user.setAge(20); return user; } }
@RequestBody
注解将请求的body转换为User
对象,并返回该对象的字符串表示形式作为HTTP响应的内容。
@RestController public class ParameterController { @PostMapping("/param/json1") public String p6(@RequestBody User user){ return user.toString(); } }