学会SpringMVC的这些知识,轻松应对日常开发!

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

在这里插入图片描述

概述

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:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值