首页 > 代码库 > @ModelAttribute--SpringMVC 注解系列文章(二)
@ModelAttribute--SpringMVC 注解系列文章(二)
- 概述
在日常的开发工作中,更新操作是经常会涉及到的一个功能,但是对于一条记录的更新,往往只会更新一部分的信息,而不会整条记录都更新,比如修改用户年龄的时候,用户密码是不需要修改的,针对这种情况,处理的方法有两种。方法一,对于不需要修改的字段,在回显的时候也顺带查询出来,并且赋值在页面的隐藏域中,保存的时候在传回后台进行更新;方法二,回显的时候只是返回可以编辑的字段,后台在更新记录前,先获取数据库里面对应的记录,然后把页面上传递过来的可以编辑的字段全部set到这条查询出来的记录中,然后再更新记录。方法一,很明显一方面处理麻烦,另一方面对于某些比较敏感的数据,例如用户密码,存在泄漏的风险;方法二,虽然避免了方法一有可能泄漏敏感数据的风险,但是效率依然低下。而本次要介绍的 SpringMVC 注解 @ModelAttribute 正好解决了这些问题。
- 代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Model Attribute Test</title></head><body> <form action="modelAttributeTest/updateUserInfo" method="post"> <input type="hidden" name="id" value="1"> userNm: <input type="text" value="RexFang" name="userNm"><br> age: <input type="text" value="18" name="age"><br> <input type="submit" value="submit"> </form></body></html>
package rex.springmvc.domain;public class User { private Integer id; private String userNm; private String pwd; private Integer age; private Address address; public String getUserNm() { return userNm; } public void setUserNm(String userNm) { this.userNm = userNm; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public User(){ } public User(Integer id, String userNm, String pwd, Integer age) { super(); this.id = id; this.userNm = userNm; this.pwd = pwd; this.age = age; }}
package rex.springmvc.handlers;import org.apache.log4j.Logger;import org.springframework.stereotype.Controller;import org.springframework.ui.ModelMap;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import net.sf.json.JSONObject;import rex.springmvc.domain.User;@RequestMapping("/modelAttributeTest")@Controllerpublic class ModelAttributeTestHandler { private static final Logger logger = Logger.getLogger(ModelAttributeTestHandler.class); private static final String SUCCESS = "success"; @ModelAttribute public void getUser(@RequestParam(value="http://www.mamicode.com/id") Integer id, ModelMap model){ if(id!=null){ User user = new User(1, "RexFang", "test", 18); model.put("user", user); } } @RequestMapping(value="/updateUserInfo", method=RequestMethod.POST) public String updateUserInfo(ModelMap model, User user){ logger.debug(JSONObject.fromObject(user).toString()); return SUCCESS; }}
- 结果
- 结论
通过以上代码的简单测试,可以看到我们在页面上并没有把秘密传到后台,但是后台打印出来的 user 对象的代码不是 null,这是因为,当我们在请求目标 handler 的时候,SpringMVC 都会在调用目标 handler 之前,先调用方法头有 @ModelAttribute 注解的方法。demo 中,getUser 方法模拟了从数据库中,根据 id 查询用户信息的过程,得到用户信息后,再与表单提交过来的数据进行合并,最终得到真正需要持久化的对象。
欢迎转载,转载必须标明出处
@ModelAttribute--SpringMVC 注解系列文章(二)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。