zoukankan      html  css  js  c++  java
  • @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")
    @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 查询用户信息的过程,得到用户信息后,再与表单提交过来的数据进行合并,最终得到真正需要持久化的对象。

     欢迎转载,转载必须标明出处

  • 相关阅读:
    deepcopy list,dict
    朴素贝叶斯
    COMP6714 week2a skipTo()
    batch normalization / layer normalization
    self-attention Transformer
    44. 通配符匹配
    FOJ 10月赛题 FOJ2198~2204
    CF #323 DIV2 D题
    HDU 5467
    CF #321 (Div. 2) E
  • 原文地址:https://www.cnblogs.com/rexfang/p/6608111.html
Copyright © 2011-2022 走看看