首先
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值为类名(首字母小写)”的规则,具体原理没有研究过,有不对的地方希望大家指正。