我使用@ModelAttribute注解没有达到效果,如下是代码,老师帮我看一下

来源:5-3 关于Map的数据绑定

坐着竹筏漂流

2018-01-11 12:50

JSP页面代码:
<form action="springmvc/ModelAttribute" method="POST">
    <input type="hidden" name="id" value="1"/>
    age:<input type="text" name="age" value="22"/><br><br>
    username:<input type="text" name="username" value="Tom"/><br><br>
    email:<input type="text" name="email" value="tom@163.com"/><br><br>
    <input type="submit" value="Test ModelAttribute">
</form>
 
控制器层代码:
@Controller
@RequestMapping("/springmvc")
//@SessionAttributes(value={"user"},types=String.class)
public class SpringMVCTest02 {
    private static final String SUCCESS ="success";
     
    /**
     * 18.测试@ModelAttribute注解
     * @param user
     * @return
     */
    @RequestMapping(value="/ModelAttribute",method=RequestMethod.POST)
    public String test18(UserBean user) {
        System.out.println("模拟需要进行修改的user对象:"+user);
        return SUCCESS;
    }
     
    @ModelAttribute
    public void getUser(@RequestParam(value="id",required=false) Long id,
                        Map<String, Object> map) {
        if (id != null) {
            UserBean user = new UserBean();
            user.setAge((short)21);
            user.setId(new Long(1));
            user.setUsername("Jerry");
            user.setPassword("123456");
            user.setEmail("jerry@163.com");
            System.out.println("模拟从数据库获取的User对象:"+user);
            map.put("user", user);
        }
    }
}
 
这是控制台输出:
 
模拟从数据库获取的User对象:UserBean [id=1, age=21, email=jerry@163.com, username=Jerry, password=123456, address=null]
模拟需要进行修改的user对象:UserBean [id=1, age=22, email=tom@163.com, username=Tom, password=null, address=null]
 
需求是把获取到password赋值给为null的password


写回答 关注

2回答

  • qq_某某某_9
    2018-01-14 11:46:01
    已采纳

     /**

         * 18.测试@ModelAttribute注解

         * @param user

         * @return

         */

        @RequestMapping(value="/ModelAttribute",method=RequestMethod.POST)

        public String test18(UserBean user,Map<String,Object> map) {

            String pwd=map.get("user1").getPassword();

            user.setPassword(pwd);

            System.out.println("模拟需要进行修改的user对象:"+user);

            return SUCCESS;

        }

          

        @ModelAttribute

        public void getUser(@RequestParam(value="id",required=false) Long id,

                            Map<String, Object> map) {

            if (id != null) {

                UserBean user = new UserBean();

                user.setAge((short)21);

                user.setId(new Long(1));

                user.setUsername("Jerry");

                user.setPassword("123456");

                user.setEmail("jerry@163.com");

                System.out.println("模拟从数据库获取的User对象:"+user);

                map.put("user1", user);

            }

        }

    这样不知道可以不可以....

    坐着竹筏漂流

    效果应该都差不多,其实这个问题已经解决了!

    2018-01-18 17:39:19

    共 1 条回复 >

  • 坐着竹筏漂流
    2018-01-18 17:44:32
    /**
      * 18.测试@ModelAttribute注解:
      * 1.运行流程:
      * ① ModelAttribute注解修饰的方法从数据库中获取到对象的相关数据,把数据放入到Map中,键为:userBean.
      * ② SpringMVC从Map中取出UserBean对象,并把表单参数赋给该UserBean对象对应的属性
      * ③ SpringMVC把上述对象传给目标方法的入参
      * 
      * 注意:@ModelAttribute修饰的方法中,放入到Map中的键和目标方法入参类型的第一个字母小写的字符串
      * 
      * 2.源码分析流程:
      * (1) 先调用被@ModelAttribute注解修饰的方法——把该方法中Map中的数据implicitModel中
      * (2) 解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性
      * 	   ① 创建WebDataBinder对象:
      * 	   	 > 确定objectName属性:如果传入的attrName的属性值为"",则objectName为类名的第一个字母小写;
      * 		        如果目标方法的POJO类参数使用@ModelAttribute来修饰,则attrName值为@ModelAttribute注解
      * 		        的value属性的属性值
      * 		 > 确定target属性——在implicitModel中查找attrName对应的属性值:如果存在就放行;如果不存在则验证
      * 		        当前控制器是否被@SessionAttributes修饰,如果是,则尝试从Session中获取attrName对应的属性值,
      * 		        如果Session中没有对应的属性就会抛出异常;如果当前控制器没有被@SessionAttributes修饰,或
      * 		        在@SessionAttributes中没有使用value值指定的key和attrName匹配,则通过反射创建一个POJO
      * 	   ② SpringMVC把表单请求的参数赋给了WebDataBinder的target对应的属性
      * 	   ③ SpringMVC会把attrName和target赋给implicitModel
      * 	   ④ 把WebDataBinder的target作为参数传给目标方法的入参
      * 
      * 3.SpringMVC确定目标方法POJO入参的过程
      * (1)确定一个key:在implicitModel中查找key对应的对象,
      * @param user
      * @return
      */
      @RequestMapping(value="/ModelAttribute",method=RequestMethod.POST)
      public String test18(@ModelAttribute("user") UserBean user) {
          System.out.println("模拟需要进行修改的user对象:"+user);
          return SUCCESS;
      }
    
      @ModelAttribute
      public void getUser(@RequestParam(value="id",required=false) Long id,
              Map<String, Object> map) {
          if (id != null) {
              UserBean user = new UserBean();
              user.setAge((short)21);
              user.setId(new Long(1));
              user.setUsername("Jerry");
              user.setPassword("123456");
              user.setEmail("jerry@163.com");
              
              System.out.println("模拟从数据库获取的User对象:"+user);
              map.put("user", user);
          }
     }


SpringMVC数据绑定入门

Geely带你认识SpringMVC各种数据绑定,学习相关注解的使用

70567 学习 · 64 问题

查看课程

相似问题