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

1、确认一个key:

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

  (2)、若使用@ModelAttribute来修饰,则key为@ModelAttibute注解的value属性值。

 @RequestMapping("/updateUser")
public String update(User user){

  这里没有使用@ModelAttribute修饰,所有对应的key为POJO类名首字母小写,即为:user

 public String update(@ModelAttribute("abc") User user)

  这里使用了@ModelAttribute来修饰POJO,那么对应的可以为@ModelAttribute的value而值,即为:abc

  

2、在implicitModel中查找key对应的对象。若存在,则作为参数传入

  (1)、若在@ModelAttibute标记的方法中在Map中保存过POJO,且key和1中确认的key一致,则会获取。例如:

 package com.proc;

 import java.util.Map;

 import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; @Controller
public class UserController { @ModelAttribute
public void getUser(@RequestParam(required=false) Integer id,Map map){
if(id!=null){
User user=new User();
user.setId(1);
user.setUsername("caoyc");
user.setAge(18);
user.setPassword("123456");
map.put("user", user);
}
} @RequestMapping("/updateUser")
public String update(@ModelAttribute("abc") User user){
System.out.println("更新User对象为:"+user);
return "success";
}
}

  JSP页面

 <%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> </head> <body>
<form action="updateUser" method="post">
<input type="hidden" name="id" value="1">
<table>
<tr>
<td>用户名:</td><td><input type="text" name="username" value="caoyc"/></td>
</tr>
<tr>
<td>年龄:</td><td><input type="text" name="age" value="12"/></td>
</tr>
<tr>
<td></td><td><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>

  结果在控制台中输出:User [id=1, username=caoyc, password=123456, age=12]

   其中原因是:在方法/updateUser时对应的方法update( User user)时,先要执行@ModelAttribute标记的方法,而在@ModelAttribute中向implicitModel中保存了一个key为user的POJO对象。而此时update对象中参数的key为POJO类名首字母小写,也是user,也就是在implicitModel中存在该key和对应的POJO对象。那么就会以该对象作为原始值。而JSP页面中传入过来的POJO对象属性不为空且有变化的属性来修改原始值。

  原始对象:User [id=1, username=caoyc, password=123456, age=18]

  JSP中 :User[id=1, username=caoyc, password=null, age=12]

  这里需要修改的属性为age。在原始值得基础上修改了将age修改为12

  所以最总在implicitModel中key值为user的POJO对象为:User [id=1, username=caoyc, password=123456, age=12]

  

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

   Java代码

 @SessionAttributes(value={"user"})
@Controller
public class UserController { @RequestMapping("/updateUser")
public String update(User user){
//System.out.println("更新User对象为:"+user);
return "success";
}
}

  此时,如果session中没有key为user的值,那么只需/updateUser时会抛出异常。因为在只需目标方法时,发现类有@SessionAttributes注解,且目标方法需要一个key为user的POJO对象,该key还存在@SessionAttributes注解的value中,所以会抛出异常。如果此时session中存在key为user的值,则将该值传入目标方法参数。

  怎么解决异常?

  方法一:添加一个使用@ModelAttribute的注解的方法,该方法向implicitModel保存一个为key为user的POJO

  方法二:去掉@SessionAttributes注解

  方法三:修改目标参数的key值。例如 @ModelAttribute(value="user2") User user

  

 

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

5、SpringMVC会把key和POJO类型的对象保存到imlicitModel中,进而会保存到request中。

Spring MVC POJO入参过程分析的更多相关文章

  1. SpringMVC POJO入参过程分析

    SpringMVC确定目标方法POJO类型的入参过程 1.确认一个key: (1).若目标方法的POJO类型的参数没有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写 ...

  2. Spring MVC POJO传参方式

    有两POJO类 Address.java package com.proc; public class Address { private String province; private Strin ...

  3. Spring MVC浅入浅出——不吹牛逼不装逼

    Spring MVC浅入浅出——不吹牛逼不装逼 前言 上文书说了Spring相关的知识,对Spring来了个浅入浅出,大家应该了解到,Spring在三层架构中主做Service层,那还有Web层,也就 ...

  4. @ModelAttribute 注解及 POJO入参过程

    一.modelattribute注解 @ModelAttribute注解的方法有两种,一种无返回值,一种有返回值,方法的可以用@RequestParam注解来获取请求的参数,如果不获取参数,可以不用此 ...

  5. Spring MVC URL传参

    Spring MVC 学习 之 - URL参数传递   在学习 Spring Mvc 过程中,有必要来先了解几个关键参数:    @Controller: 在类上注解,则此类将编程一个控制器,在项目启 ...

  6. spring MVC 尝试传参json(应用部分)

    spring 3.1后增加新的注解:@Requestbody,@Responsebody, 暂不论Requestdody, 若想让后端代码直接返回json字符串,可使用@Responsebody, 用 ...

  7. spring mvc 重定向传参

    参考链接如下: http://bbs.csdn.net/topics/391034118?page=1 自己的示例程序: 详细页面提交一个修改动作,修改完成后跳转到检索页面,把检索条件重新赋值给检索页 ...

  8. 解决Spring MVC前台传参中文乱码问题

    在web.xml文件中配置字符编码过滤器: <filter> <filter-name>CharacterEncoding</filter-name> <fi ...

  9. HandlerMethodArgumentResolver(一):Controller方法入参自动封装器【享学Spring MVC】

    每篇一句 你的工作效率高,老板会认为你强度不够.你代码bug多,各种生产环境救火,老板会觉得你是团队的核心成员. 前言 在享受Spring MVC带给你便捷的时候,你是否曾经这样疑问过:Control ...

随机推荐

  1. 003 -- Dubbo简单介绍

    1:Dubbo的基本概念 dubbo是阿里巴巴SOA服务治理 方案的核心框架,每天为20000+个服务次的数据量访问支持.dubbo是一个分布式的服务框架,致力于提供高性能和透明化的RPC远程服务调用 ...

  2. 【python 3.6】python读取json数据存入MySQL(二)

    在网上找到一个包含全国各省市经纬度的json文件,也可以通过上次的办法,解析json关键字,构造SQL语句,插入数据库. JSON文件格式如下: [ { "name": " ...

  3. Action Required: Please provide your Tax Identity Information - Amazon Seller Tax Identity Collection

    Hello ***,   Your selling privileges have been suspended because we have not received required tax i ...

  4. 浅谈TSM概念、系统架构及技术发展

    NFC作为一种近距离的无线通信技术,提供了一种更直接.更安全的现场交互解决方案.它能够允许电子设备之间进行非接触式点对点数据传输,实现数据交换.访问内容与服务.有了它,手机不再只是打电话.发短信以及上 ...

  5. 欢迎来怼—第三次Scrum会议

    一.会议成员 队名:欢迎来怼队长:田继平队员:李圆圆,葛美义,王伟东,姜珊,邵朔,冉华小组照片: 二.会议时间 2017年10月15日    17:15-17:41   总用时26min 三.会议地点 ...

  6. CS小分队第二阶段冲刺站立会议(5月29日)

    昨日成果:昨天在为主界面设计自主添加应用快捷方式功能,连续遇到困难. 遇到的困难:1.string字符串数组无法在单击事件中使用,提示string无法在eventargs中检索,尝试了各种方式都不行 ...

  7. 对其中的一个特点将NABC的分析结果

    一.题目要求 每一个组员针对其中的一个特点将NABC的分析结果发表博客上(截止日期4月8日晚24:00前). 二.分析结果 特点之一:通讯方便 <渴了么>这个安卓APP特点之一就是通讯方便 ...

  8. 福大软工1816 - 404 Note Found选题报告

    目录 NABCD分析引用 N(Need,需求): A(Approach,做法): B(Benefit,好处): C(Competitors,竞争): D(Delivery,交付): 初期 中期 个人贡 ...

  9. Java微笔记(8)

    Java 中的包装类 Java 为每个基本数据类型都提供了一个包装类,这样就可以像操作对象那样来操作基本数据类型 基本类型和包装类之间的对应关系: 包装类主要提供了两大类方法: 将本类型和其他基本类型 ...

  10. IIS 7.0 的 ASP.NET 应用程序生命周期概述

    文章:IIS 7.0 的 ASP.NET 应用程序生命周期概述 地址:https://msdn.microsoft.com/zh-cn/library/bb470252(v=vs.100).aspx ...