
概述
SpringMVC再熟悉不过的框架了,因为现在最火的SpringBoot的内置MVC框架就是SpringMVC。我写这篇文章的动机是想通过回顾总结一下,重新认识SpringMVC,所谓温故而知新嘛。
为了了解SpringMVC,先看一个流程示意图:

从流程图中,我们可以看到:
- 接收前端传过来Request请求。
- 根据映射路径找到对应的处理器处理请求,处理完成之后返回ModelAndView。
- 进行视图解析,视图渲染,返回响应结果。
总结就是:参数接收,定义映射路径,页面跳转,返回响应结果。
当然这只是最基本的核心功能,除此之外还可以定义拦截器,全局异常处理,文件上传下载等等。
1. 定义Controller
@RequestMapping
@Controller
@RequestMapping("/requestMapping/controller")
public class RequestMappingController {
@RequestMapping("/demo")
public String demo() {
return "HelloWord";
}
}
2. 接收参数
2.1 在@RequestMapping映射方法上写上接收参数名:
@RequestMapping(value = "/restful", method = RequestMethod.POST)
public String post(Integer id, String name, int money) {
System.out.println("id:" + id + ",name:" + name + ",money:" + money);
return "post";
}
2.2 @RequestParam参数名绑定:
如果不想使用形参名称作为参数名称,可以使用@RequestParam进行参数名称绑定:
/**
* value: 参数名
* required: 是否request中必须包含此参数,默认是true。
* defaultValue: 默认参数值
*/
@RequestMapping(value = "/restful", method = RequestMethod.GET)
public String get(@RequestParam(value = "userId", required = false, defaultValue = "0") String id) {
System.out.println("id:" + id);
return "get";
}
2.3 @PathVariable路径参数:
通过@PathVariable将URL中的占位符{xxx}参数映射到操作方法的入参。演示代码如下:
@RequestMapping(value = "/restful/{id}", method = RequestMethod.GET)
public String search(@PathVariable("id") String id) {
System.out.println("id:" + id);
return "search";
}
2.4 @RequestHeader绑定请求头属性:
使用@RequestHeader注解,用法和@RequestParam类似:

@RequestMapping("/head")
public String head(@RequestHeader("Accept-Language") String acceptLanguage) {
return acceptLanguage;
}

2.5 @CookieValue绑定请求的Cookie值:
获取Request中Cookie的值:
@RequestMapping("/cookie")
public String cookie(@CookieValue("_ga") String _ga) {
return _ga;
}
2.6 绑定请求参数到POJO对象
public class User {
private String id;
private String name;
private Integer age;
//getter、setter方法
}
@RequestMapping("/body")
public String body(User user) {
return user.toString();
}
2.6.1 支持级联属性
public class Address {
private String id;
private String name;
//getter、setter方法
}
public class User {
private String id;
private String name;
private Integer age;
private Address address;
//getter、setter方法
}
传参时只要传入address.name、address.id即会自动填充:
2.6.2 @InitBinder解决接收多对象时属性名冲突
如果有两个POJO对象拥有相同的属性名,不就产生冲突了吗?比如刚刚的user和address,其中他们都有id和name这两个属性,如果同时接收,就会冲突:
//user和address都有id和name这两个属性
@RequestMapping(value = "/twoBody", method = RequestMethod.POST)
public String twoBody(User user, Address address) {
return user.toString() + "," + address.toString();
}
@InitBinder("user")
public void initBindUser(WebDataBinder webDataBinder) {
webDataBinder.setFieldDefaultPrefix("u.");
}
@InitBinder("address")
public void initBindAddress(WebDataBinder webDataBinder) {
webDataBinder.setFieldDefaultPrefix("addr.");
}


2.6.3 @Requestbody自动解析JSON字符串封装到对象
前端传入一个json字符串,自动转换成pojo对象,演示代码:
@RequestMapping(value = "/requestBody", method = RequestMethod.POST)
public String requestBody(@RequestBody User user) {
return user.toString();
}
注意的是,要使用POST请求,发送端的Content-Type设置为application/json,数据是json字符串:
3. @ResponseBody
如果采用前后端分离,页面跳转不需要后端控制了,后端只需要返回json即可,怎么返回呢?
使用@ResponseBody注解即可,这个注解会把对象自动转成json数据返回。
@ResponseBody注解可以放在类或者方法上,源码如下:
//用在类、方法上
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}
演示:
@RequestMapping("/userList")
@ResponseBody
public List<User> userList() throws Exception {
List<User> list = new ArrayList<>();
list.add(new User("1","姚大秋",18));
list.add(new User("2","李星星",18));
list.add(new User("3","冬敏",18));
return list;
}
测试/view/userList:

SpringMVC核心功能详解
本文深入探讨SpringMVC框架的核心功能,包括参数接收、映射路径定义、页面跳转及响应结果返回等基本流程。此外,还介绍了如何定义控制器、接收各种类型参数、使用ResponseBody返回JSON数据等高级特性。
5558

被折叠的 条评论
为什么被折叠?



