文档章节

springmvc的ModelAttribute注解

刺猬一号
 刺猬一号
发布于 2017/03/21 18:07
字数 1070
阅读 9
收藏 1
参考资料:spring-framework-reference的Using @ModelAttribute on a method和Using @ModelAttribute on a method argument

先看一个没有使用@ModelAttribute的Controller方法.

@RequestMapping("/save")  
public String save(User user) {  
    user.setUsername("U love me");  
    userService.save(user);  
    return "result";  
}  
其中User包含id和username两个私有属性,含有公共setter和getter方法.
执行此方法时会将key为"user"(注意:这里即使参数名称是user1,key一样还是"user"),value为user的对象加入到model.在jsp页面可以通过${user.id}和${user.name}得到值的,即上面方法和下面方法是相当的.
@RequestMapping("/save")  
public String save(Model model,int id,String username) {  
    User user=new User();  
    //这里是通过反射从request里面拿值再set到user  
    user.setId(id);  
    user.setUsername(username);  
    model.addAttribute("user",user);  
      
    user.setUsername("U love me");  
    userService.save(user);  
    return "result";  
}  
一.下面再来看看@ModelAttribute的基本用法.
1.在方法上使用@ModelAttribute
@ModelAttribute("user1")  
public User addUser(User user) {  
    return new User(520,"I love U");  
}  
假设此方法是写在UserController内,那么执行UserController内带有@RequestMapping的方法之前,都会先执行此addUser方法.并且执行addUser过程中会添加两个对象到model,先将key为"user"的对象(由addUser方法的User user引起的),再添加key为"user1"的对象(由注解@ModelAttribute("user1")引起的).

2.在方法参数上使用@ModelAttribute.
@RequestMapping("/save")  
public String save(@ModelAttribute User user) {  
    user.setUsername("U love me");  
    userService.save(user);  
    return "result";  
}  
此方法会先从model去获取key为"user"的对象,如果获取不到会通过反射实例化一个User对象,再从request里面拿值set到这个对象,然后把这个User对象添加到model(其中key为"user").
使用了@ModelAttribute可修改这个key,不一定是"user",此情况下,用与不用@ModelAttribute没有区别.


3.再来看看在方法和方法参数上结合使用@ModelAttribute,即上面两步的两个方法都添加UserController,如下:
@ModelAttribute("user1")  
public User addUser(User user) {  
    return new User(520,"I love U");  
}  
@RequestMapping("/save")  
public String save(@ModelAttribute User user) {  
    user.setUsername("U love me");  
    userService.save(user);  
    return "result";  
}  
假设要执行保存用户操作,根据一分析可知,先执行完会产生两个User类型的对象(一个key是"user",另一个key是"user1")添加到model,再执行save方法,此时会先从model去找key为"user"的对象,能找到再从request取值set到这个User对象.最后返回到jsp页面,model里也只有两个User类型对象.
再来个小小假设,将上面@ModelAttribute("user1")的user1改为user,其它不变.虽然执行了addUser方法,那么执行到save方法内,user对象的字段值还是来源于请求,最后返回到jsp页面,model里也只有一个User类型对象.


4.另类:
@ModelAttribute  
@RequestMapping("/save")  
public String save(@ModelAttribute User user) {  
    user.setUsername("U love me");  
    userService.save(user);  
    return "result";  
}  
此种情况,会添加一个key为"user"的User对象到model,还会添加一个key为"string",value为"result"的对象到model,而视图名称则变为了"save"而不是"result".相信一般开发者都不会这样用.
二.下面再看看结合@SessionAttributes的用法.

1.先看看这段代码

@Controller  
@RequestMapping("user")  
@SessionAttributes("test")  
public class UserController {  
    @RequestMapping(value = "test1")  
    public String test1(Map<String, Object> model, SessionStatus sessionStatus) {  
        model.put("test","something");  
        //sessionStatus.setComplete();  
        return "user/list";  
    }  
  
    @RequestMapping(value = "test2")  
    public String test2(Map<String,?>  model) {  
        Object test = model.get("test");  
        System.out.println(test);  
        return "user/list";  
    }  
}  
在类级别上使用@SessionAttributes("test"),它的作用是在controller共享 model 属性,直到调用org.springframework.web.bind.support.SessionStatus#setComplete会清除此session值.否则长期保留(session过期,这个值也不再保留).因此先调用/user/test1,再调用/user/test2.在test2方法能得到test1方法put进去的值.当移除上面的注解,因为属性为test的session也被清除了,所以test2方法会得到是null.
2.再看结合@ModelAttribute的用法.

@Controller  
@RequestMapping("user")  
@SessionAttributes("test")  
public class UserController {  
    @RequestMapping(value = "test1")  
    public String test1(HttpServletRequest request) {  
        User user = new User("xiejx618");  
        request.getSession().setAttribute("test",user);  
        return "user/list";  
    }  
    @RequestMapping(value = "test2")  
    public String test2(@ModelAttribute("test") User user,SessionStatus sessionStatus) {  
        System.out.println(user.getUsername());  
        sessionStatus.setComplete();  
        return "user/list";  
    }  
}  
一样先调用/user/test1,再调用/user/test2.在test2方法能得到test1方法set进去的值.使用了@SessionAttributes,如果在controller的方法参数上有@ModelAttribute,那么此方法会确保属性test的session会存在,否则会抛org.springframework.web.HttpSessionRequiredException异常,即上面代码先不调/user/test1,直接调/user/test2就会抛此异常

 

© 著作权归作者所有

刺猬一号
粉丝 12
博文 373
码字总数 616361
作品 0
深圳
私信 提问
Spring MVC SessionAttribute学习

小博老师在上节给大家介绍了ModelAttribute的使用方法,相信你已掌握了 SpringMVC是 如何管理 model 数据的。这一节我们将继续关注 SpringMVC 是如何处理session 数据的。 SpringMVC可以使用...

博为峰教研组
2016/12/14
32
0
@ControllerAdvice 拦截异常并统一处理

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。 一、介绍 创建 MyControllerAdvice,并添...

狼王黄师傅
2018/10/16
448
0
SpringMVC常用注解标签详解

1、@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的Vie...

Java工程师-Distance
2018/05/20
820
0
spring mvc 统一异常处理

1、定义一个统一异常处理类 @ControllerAdvice,是spring3.2提供的新注解, 一般扫描context:component-scan扫描时也能扫描到,不需要在配置文件配置 但如果你的spring-mvc配置文件使用如下方...

qiun
2016/06/24
710
0
SpringMVC @ModelAttribute 的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catoop/article/details/51171108 在 SpringMVC 的 Controller 中使用 @ModelAttribute 时,应用位置包括下面...

单红宇
2016/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【jQuery基础学习】05 jQuery与Ajax以及序列化

本文转载于:专业的前端网站➭【jQuery基础学习】05 jQuery与Ajax以及序列化 好吧,这章不像上章那么水了,总是炒剩饭也不好。 关于AJAX 所谓Ajax,全名Asynchronous JavaScript and XML。(也...

前端老手
6分钟前
7
0
CVE-2019-14287(Linux sudo 漏洞)分析

作者:lu4nx@知道创宇404积极防御实验室 作者博客:《CVE-2019-14287(Linux sudo 漏洞)分析》 原文链接:https://paper.seebug.org/1057/ 近日 sudo 被爆光一个漏洞,非授权的特权用户可以...

极客君
6分钟前
3
0
关于分布式,你需要知道的真相

目录 一、分布式锁 数据库的唯一索引 Redis 的 SETNX 指令 Redis 的 RedLock 算法 Zookeeper 的有序节点 二、分布式事务 2PC 本地消息表 三、CAP 一致性 可用性 分区容忍性 权衡 四、BASE 基...

李红欧巴
6分钟前
4
0
读书笔记:深入理解ES6 (附录B)

附录B:了解ES7(2016)   ES6经历了4年的发展,之后TC-39决定将发布周期转换为每年一版,以确保新语言特性能够更快地发展。   ES6中添加了三个语法特性,下面一一来讲。 第1节 指数运算...

张森ZS
12分钟前
2
0
计算机公开课推荐 2019.8

欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 面试求职交流群 724187166 ApacheCN 学习资源 编程 哈佛 CS50:计算机科学导论 视频 MIT 6.00.1x:计算机科...

ApacheCN_飞龙
13分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部