• 概述

  在日常的开发工作中,更新操作是经常会涉及到的一个功能,但是对于一条记录的更新,往往只会更新一部分的信息,而不会整条记录都更新,比如修改用户年龄的时候,用户密码是不需要修改的,针对这种情况,处理的方法有两种。方法一,对于不需要修改的字段,在回显的时候也顺带查询出来,并且赋值在页面的隐藏域中,保存的时候在传回后台进行更新;方法二,回显的时候只是返回可以编辑的字段,后台在更新记录前,先获取数据库里面对应的记录,然后把页面上传递过来的可以编辑的字段全部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")
@Controller
public class ModelAttributeTestHandler {
private static final Logger logger = Logger.getLogger(ModelAttributeTestHandler.class);
private static final String SUCCESS = "success"; @ModelAttribute
public void getUser(@RequestParam(value="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 注解系列文章(二)的更多相关文章

  1. Redis变慢?深入浅出Redis性能诊断系列文章(二)

    (本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术) 本篇为Redis性能问题诊断系列的第二篇,本文主要从应用发起的典型命令使用上进 ...

  2. @RequestParam--SpringMVC 注解系列文章(一)

    概述 RequestParam 注解是使用 SpringMVC 开发过程中,比较常用的一个注解,用于映射请求参数. 代码 package rex.springmvc.handlers; import ...

  3. .NET性能系列文章二:Newtonsoft.Json vs. System.Text.Json

    微软终于追上了? 图片来自 Glenn Carstens-Peters Unsplash 欢迎来到.NET性能系列的另一章.这个系列的特点是对.NET世界中许多不同的主题进行研究.基准和比较.正如标题 ...

  4. NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)

    摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...

  5. NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)

    摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...

  6. NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)

    摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...

  7. NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)

    摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...

  8. NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)

    摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...

  9. NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)

    摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4. ...

随机推荐

  1. linux驱动的多种init函数及其调用顺序

    在驱动设计时可以选用多种驱动初始化函数达到控制驱动初始化顺序控制,其中level(__define_initcall的第一个参数即优先级)越小优先级越高, #define pure_initcall( ...

  2. MongoDB基础之七 用户管理

    MongoDB的用户管理 注意:A)在mongodb中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据.即 use admin , -->相当于进入超级用户管理 ...

  3. [转载] 几张非常有意义的JavaScript基础学习思维图

    原文:http://www.w3cfuns.com/forum.php?mod=viewthread&tid=5598364&extra=page%3D1%26filter%3Ddig ...

  4. 2017年2月16日 分析下为什么spring 整合mybatis后为啥用不上session缓存

    因为一直用spring整合了mybatis,所以很少用到mybatis的session缓存. 习惯是本地缓存自己用map写或者引入第三方的本地缓存框架ehcache,Guava 所以提出来纠结下 实验 ...

  5. c#算两个火星坐标的距离(高德or百度)

    /// <summary> /// 获取两个坐标之间的距离 /// </summary> /// <param name="lat1">第一个坐 ...

  6. iframe的优缺点?

    1.`<iframe>`优点: 解决加载缓慢的第三方内容如图标和广告等的加载问题 Security sandbox 并行加载脚本 2.`<iframe>`的缺点: *ifram ...

  7. Android学习20--OpenGL的"mapPoints"

    在OpenGL中有时会需要求一个3维空间中的点在平移(缩放,旋转)后坐标是多少.需求相当于二维的mapPoints.可以通过这个函数实现 void multiplyMV (float[] result ...

  8. 使用EntityFramework中DbSet.Set(Type entityType)方法碰到的问题

    使用的是EntityFramework, Version=6.0.0.0,项目原本直接使用将EntityFramework的Entity拿到UI使用,后面想使用dto对象将数据库的Entity与前台分 ...

  9. Log日志规范

    Overview 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神.程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的.本文想讨论的是 ...

  10. 【JSON学习之道】js操作JSON

    JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...