Spring MVC POJO入参过程分析

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

1、确认一个key:

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

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

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

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

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

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

  

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

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

 1 package com.proc;
 2
 3 import java.util.Map;
 4
 5 import org.springframework.stereotype.Controller;
 6 import org.springframework.web.bind.annotation.ModelAttribute;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.RequestParam;
 9
10 @Controller
11 public class UserController {
12
13
14     @ModelAttribute
15     public void getUser(@RequestParam(required=false) Integer id,Map map){
16         if(id!=null){
17             User user=new User();
18             user.setId(1);
19             user.setUsername("caoyc");
20             user.setAge(18);
21             user.setPassword("123456");
22             map.put("user", user);
23         }
24     }
25
26     @RequestMapping("/updateUser")
27     public String update(@ModelAttribute("abc") User user){
28         System.out.println("更新User对象为:"+user);
29         return "success";
30     }
31 }

  JSP页面

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
 2
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6
 7   </head>
 8
 9   <body>
10     <form action="updateUser" method="post">
11         <input type="hidden" name="id" value="1">
12         <table>
13             <tr>
14                 <td>用户名:</td><td><input type="text" name="username" value="caoyc"/></td>
15             </tr>
16             <tr>
17                 <td>年龄:</td><td><input type="text" name="age" value="12"/></td>
18             </tr>
19             <tr>
20                 <td></td><td><input type="submit" value="提交"></td>
21             </tr>
22            </table>
23     </form>
24   </body>
25 </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值,若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。

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

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

时间: 2024-08-06 16:41:37

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

Spring MVC POJO传参方式

有两POJO类 Address.java 1 package com.proc; 2 3 public class Address { 4 5 private String province; 6 private String city; 7 public String getProvince() { 8 return province; 9 } 10 public void setProvince(String province) { 11 this.province = province;

spring mvc 重定向传参

参考链接如下: http://bbs.csdn.net/topics/391034118?page=1 自己的示例程序: 详细页面提交一个修改动作,修改完成后跳转到检索页面. 本地controller 1 private static final String SEARCH_PAGE = "redirect:/list/search.do"; 2 3 @RequestMapping(value = "/update", method=RequestMethod.PO

java - spring mvc 之传参@RequestParam @RequestBody @Pathvariable @RequestHeader注解

1. @PathVariable 当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上. 示例代码: @Controller @RequestMapping("/owners/{ownerId}") public class RelativePathUriTemplateController { @RequestMapping(&q

Spring MVC【入门】

MVC 设计概述 在早期 Java Web 的开发中,统一把显示层.控制层.数据层的操作全部交给 JSP 或者 JavaBean 来进行处理,我们称之为 Model1: 出现的弊端: JSP 和 Java Bean 之间严重耦合,Java 代码和 HTML 代码也耦合在了一起 要求开发者不仅要掌握 Java ,还要有高超的前端水平 前端和后端相互依赖,前端需要等待后端完成,后端也依赖前端完成,才能进行有效的测试 代码难以复用 正因为上面的种种弊端,所以很快这种方式就被 Servlet + JSP

spring mvc绑定对象String转Date解决入参不能是Date的问题

使用spring的mvc,直接将页面参数绑定到对象中,对象中有属性为Date时会报错,此时需要处理下. 同样的,其他的需要处理的类型也可以用这种方法. 在controller中加入代码 @InitBinder protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { //对于需要转换为Date类型的属性,使用DateEditor进行处理 bin

Spring MVC入门第3天--注解开发

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.07.01 lutianfei none 商品修改功能开发 一.需求 操作流程: 1.进入商品查询列表页面 2.点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询) 要修改的商品从数据库查询,根据商品id(主键)查询商品信息 3.在商品修改页面,修改商品信息,修改后,点击提交 二.开发mapper mapper: 根据id查询商品信息 根据id更新Items表的数据 不用开发了,使用逆向工程生成的代码.

spring mvc 重定向加传参

常用: ModelAndViewi: return new ModelAndView("redirect:/toList");  或者 ii:return "redirect:/toList"; 或者 iii:response.sendRedirect("index.html"); 1. 需求背景    需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页

五、Spring MVC实用POJO进行参数传值

前面已经说了,spring mvc可以通过@PathVariable可以把url中的值映射到目标方法的参数上,也可以使用@RequestParam进行单个参数的传递,如果一次需要传递多个参数的话,就需要写多个相应的注解,那有没有什么更简单方便的方法呢?答案是有的,spring mvc有自动装箱的功能,可以通过参数的name属性,给后台绑定的对象的对应的属性完成赋值操作,而且还支持级联操作,即支持嵌套. 1.使用POJO(Plain Old Java Object)进行参数传值 下面来看一下具体例

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

SpringMVC确定目标方法POJO类型入参的过程 访问方法 @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } 1,首先确定一个key值 ①如果目标方法的POJO类型的参数没有使用@ModelAttribute作为入参修饰,则key为POJO类名的第一个字母小写 例test(User user){}这样的方法key就是user ②如果使用了@M