为了账号安全,请及时绑定邮箱和手机立即绑定

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

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 回答

 /**

     * 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);

        }

    }

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

0 回复 有任何疑惑可以回复我~
#1

坐着竹筏漂流 提问者

效果应该都差不多,其实这个问题已经解决了!
2018-01-18 回复 有任何疑惑可以回复我~
/**
  * 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);
      }
 }


1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信