目录
Spring Framework中Web模块包含了 spring-web 、 spring-webmvc 、 spring-websocket 和 spring-webmvc-portlet 4 个模块.
spring-web 模块提供了web开发所需要的基础特性,如文件上传,基于IoC容器初始化 Servlet 监听器等.
spring-webmvc 模块包含了Spring的 MVC 实现,及 REST 方式的web服务.
SpringMVC框架围绕 DispatcherServlet(前端控制器) 这个核心展开,它负责截获请求并将其分派给相应的处理器处理.
1、MVC设计模式介绍
MVC(Model View Controller)是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分.
Model(模型):😗 是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据.
View(视图):😗 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的.
Controller(控制器):😗 是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据.
2、@Controller注解
@Controller注解在类上使用,标注该类是Web控制器,其和@Component注解等价,只不过在Web层使用,用来区分类的作用.
3、@RequestMapping注解
@RequestMapping注解可以指定请求与处理方法之间的映射关系,该注解可以在控制器类的级别和其方法级别上使用,例如:
//映射到 test1()方法的路径为 "/test1/1"
@Controller
@RequestMapping("/test1")
public class TestController {
@RequestMapping(value="/1")
public String test1(){
return "forward:/home.html";
}
@RequestMapping注解能够处理的HTTP请求方法有: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE .
如果要将一个请求映射到一个特定的HTTP方法,需要在@RequestMapping中使用method参数声明HTTP请求所使用的方法类型.例如:
//指定服务提供的请求方法为get
@RequestMapping(value = "/1", method = RequestMethod.GET)
public String test1(){
return "forward:/home.html"; }
4、控制器方法的返回
这里列举几个常用的返回类型:
👉详细参考
4.1 返回String类型
有两种使用方式:
- 返回一个路径的字符串,可以使用 redirect:/服务路径 表示重定向到某个路径,forward:/服务路径
表示转发到某个路径,如果前边不写默认就是转发.
例如:
@Controller
public class TestController {
@RequestMapping("/test1")
public String test1(){
//转发方式跳转页面
return "forward:/home.html";
}
}
@Controller
public class TestController {
@RequestMapping("/test2")
public String test2(){
//重定向方式跳转页面
return "redirect:/home.html";
}
}
这里复习一下转发和重定向的区别:
forward:请求成功返回200状态码,只发起一次请求,url不改变,服务端拿到资源路径,把资源作为响应体返回;
redirect:请求成功返回3xx状态码,发起二次请求,url改变,服务端响应3xx+Location,浏览器根据Location自动跳转到资源页面.
- @RequestMapping结合@ResponseBody使用,返回的字符串会作为响应体内容. 此时响应的Content-Type为
text/plain 或 text/html.
@ResponseBody注解表示将控制器方法的返回序列化作为响应体内容返回前端.
例如:
//此时页面不会发生跳转而是显示字符串"forward:/home.html"
@Controller
@RequestMapping("/test1")
public class TestController {
@RequestMapping(value="/1")
@ResponseBody
public String test1(){
return "forward:/home.html";
}
4.2 返回普通的Java类型
-
返回类型为Object,一般使用带Getter,Setter方法的模型类
-
结合@ResponseBody使用,表示将对象序列化后的数据放在响应体返回
-
在SpringBoot中默认响应的Content-Type为 application/json
-
非字符串对象会自动序列化为 json字符串
例如:
@Controller
@RequestMapping("/test1")
public class TestController {
@RequestMapping("/4")
@ResponseBody
public Object test4(){
Map<Integer, String> map = new HashMap<>();
map.put(1, "张三");
map.put(2, "李四");
map.put(3, "王五");
return map;
}
在浏览器访问 /test1/4 路径的结果:
{“1”:“张三”,“2”:“李四”,“3”:“王五”}
在application.properties文件中添加:
spring.jackson.serialization.indent-output=true
美化后的结果为:
{
“1” : “张三”,
“2” : “李四”,
“3” : “王五”
}
4.3 返回ResponseEntity
由SpringMVC框架提供的ResponseEntity,可以灵活的设置响应状态码,响应头,响应体,例如:
@RequestMapping("/7")
public ResponseEntity test7(){
Map<Integer, String> map = new HashMap<>();
map.put(1, "张三");
map.put(2, "李四");
map.put(3, "王五");
return ResponseEntity.status(200).body(map);
}
5、@ResponseBody注解说明
- 返回类型为String,表示响应Content-Type: text/plain或text/html,且响应体为控制器方法的字符串返回值.
- 返回类型为普通Java类型,表示响应Content-Type: application/json,以返回对象序列化为json后作为响应体.
- @ResponseBody可以使用方法上也可以使用在类上,如果使用在类上表示该类中所有方法都是默认以返回值作为响应体,也就是所有方法都使用@ResponseBody.
如果返回值为null,表示响应体内容为空
6、组合注解
可以使用组合注解来完成同时定义多个注解的效果,如:@RestController,@GetMapping,@PostMapping
- 在类上使用@RestController = 在类上使用@Controller + @ResponseBody
- 在方法上使用@GetMapping = 在方法上使用@RequestMapping(RequestMethod=GET)
- 在方法上使用@PostMapping = 在方法上使用@RequestMapping(RequestMethod=POST)