springMVC中 接受前端传来的参数 目标方法参数为pojo类型参数时会将此对象自动放入request作用域中?

java Spring 专栏收录该内容
4 篇文章 0 订阅

首先

SpringMVC如何确定目标方法POJO类型参数?

SpringMVC 确定目标方法 POJO 类型入参的过程

1. 确定一个 key:

1). 若目标方法的 POJO 类型的参数没有使用 @ModelAttribute 作为修饰, 则 key 为 POJO 类名第一个字母的小写

2). 若使用了 @ModelAttribute 来修饰, 则 key 为 @ModelAttribute 注解的 value 属性值.

2. 在 implicit Model 中查找 key 对应的对象, 若存在, 则作为入参传入若在 @ModelAttribute 标记的方法中在 Map 中保存过, 且 key 和 1 确定的 key 一致, 则会获取到.

3. 若 implicit Model 中不存在 key 对应的对象, 则检查当前的 Handler 是否使用 @SessionAttributes 注解修饰, 若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了 key, 则会从 HttpSession 中来获取 key 所对应的 value 值, 若存在则直接传入到目标方法的入参中. 若不存在则将抛出异常.

4. 若 Handler 没有标识 @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key, 则会通过反射来创建 POJO 类型的参数, 传入为目标方法的参数

5. SpringMVC 会把 key 和 POJO 类型的对象保存到 implicit Model 中, 进而会保存到 request 中

直接上一段代码,这个方法的入参是一个自定义的Person类型,

` @RequestMapping("/pojo1")
    public String getPojo(Person per){
        System.out.println(per);
        per.setName("王五");
        return "person";
    }

index. jsp代码

 </form>
<form action="/lyj/pojo1" method="get">
    <input type="text" name="id"/> id
    <input type="text" name="name"/> 学生姓名
    <input type="text" name="course.cname"/> 课程名
    <input type="text" name="course.score"/> 课程分数
    <input type="submit" value="提交"/>
</form>

person.jsp中代码

${requestScope.person}

在getPojo方法中,我并没有把从参数中取到的Person对象放入任何容器中,然后在person.jsp中却从request作用域中取出来了Person对象,这是为什么? 一开始就疑惑了好久,之后百度了好久,发现原来自定义的pojo类型作为方法参数时,相当于默认加上了@ModelAttribute注解,默认key值为类名(首字母小写)
上面的代码等同于下面的代码

@RequestMapping("/pojo1")
    public String getPojo(@ModelAttribute("peron") Person per){
        System.out.println(per);
        per.setName("王五");
        return "person";
    }

@ModelAttribute具有如下作用:
 绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用。
  其实 @ModelAttribute 此处对于供视图页面展示来说与 model.addAttribute(“person”, per); 功能类似,会把person放到request作用域中,所以在jsp中可以从作用域中直接取出来该对象。
  我也是无意中发现的,经过测试 只有自定义的类型作为方法入参时,才会遵循“默认加上@ModelAttribute注解,默认key值为类名(首字母小写)”的规则,具体原理没有研究过,有不对的地方希望大家指正。

  • 0
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值