`

springmvc的ModelAttribute注解

阅读更多

参考资料: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就会抛此异常

 

 

我个人很少这样用,用原始的写法就清晰很多了,但要看明白别人写的代码。

 

摘自:http://blog.csdn.net/xiejx618/article/details/43638537

分享到:
评论

相关推荐

    SpringMVC纯注解配置

    "SpringMVC纯注解配置"是SpringMVC框架的一种高级用法,旨在减少XML配置文件的使用,提高开发效率和代码可读性。在这个主题中,我们将深入探讨如何利用注解实现SpringMVC的配置以及jQuery如何处理后台返回的JSON对象...

    SpringMVC ModelAttribute详解.docx

    在Spring MVC框架中,`@ModelAttribute`注解扮演着至关重要的角色,它是数据绑定和模型对象创建的关键。本文将深入探讨`@ModelAttribute`的工作原理及其常见应用场景。 首先,`@ModelAttribute`注解可以用于两个...

    SpringMVC全注解配置

    4. **模型和视图**:`@ModelAttribute`注解用于将方法参数与HTTP请求中的数据绑定,而`@ResponseBody`注解则指示Spring将方法返回值直接写入HTTP响应体,通常用于返回JSON或XML数据。 5. **异常处理**:使用`@...

    06@ModelAttribute注解.md

    06@ModelAttribute注解.md

    SpringMVC例子注解

    在实际项目中,还会结合使用`@ExceptionHandler`处理异常、`@ModelAttribute`绑定表单数据等其他注解,进一步提升代码的灵活性和可读性。通过学习和熟练掌握这些注解,开发者能够更加高效地利用SpringMVC框架构建...

    SpringMVC 常用注解类视频详解

    12. `@RequestParam/@PathVariable/@ModelAttribute`的集合注解如`@RequestParams`, `@PathVariables`, `@ModelAttributes`,允许一次性处理多个参数。 13. `@RequestBody`:用于读取HTTP请求体中的JSON或XML数据,...

    springMVC注解大全

    6. `@ModelAttribute`:用于绑定请求参数到模型对象或者从模型中获取对象。在方法参数前加上此注解,Spring MVC会尝试从请求中获取数据填充模型对象。 7. `@ResponseBody`:这个注解告诉Spring MVC,方法的返回值应...

    SpringMVC 注解和非注解demo

    6. `@ModelAttribute`:用于从请求中绑定数据到模型对象,通常用于表单提交。 7. `@ResponseBody`:将方法返回的对象直接转换为HTTP响应体的内容,而不是作为一个视图进行渲染。 ### 二、非注解方式 在Spring MVC...

    springmvc框架注解和非注解实现

    4. **@ModelAttribute**:用于将请求参数绑定到方法参数,或者将模型数据传递给视图。 5. **@ResponseBody**:将方法返回值直接写入HTTP响应体,通常用于返回JSON或XML等格式的数据。 ### 三、注解的优势 1. **...

    springMVC注解和非注解demo

    7. `@ModelAttribute`:在视图模型中添加属性,常用于表单绑定。 接下来,我们来看看非注解方式,即基于XML配置的Spring MVC。在这种方式下,你需要在`&lt;beans&gt;`标签内定义`&lt;bean&gt;`,并通过`...

    SpringMvc注解详解

    【SpringMvc注解详解】 SpringMvc 是 Spring 框架的一部分,主要负责处理 Web 请求。在 SpringMVC 中,注解扮演着至关重要的角色,它们简化了代码并减少了配置。以下是一些常用的 SpringMVC 注解及其详细解释: 1....

    SpringMVC中注解的详细使用

    在SpringMVC中,注解的使用极大地简化了配置,提高了代码的可读性和可维护性。本篇将详细介绍SpringMVC中的一些核心注解及其应用场景。 1. `@Controller`:这个注解用于标记一个类作为Spring MVC的控制器。当一个...

    springmvc注解简单实例

    在这个"springmvc注解简单实例"中,我们将深入探讨Spring MVC中的一些关键注解,以及它们在DAO层、Service层和Controller层中的应用。让我们逐一解析这些层面的注解使用。 首先,我们来到**DAO层**。在Spring MVC中...

    SpringMVC九大常用注解

    ### SpringMVC九大常用注解详解 #### 一、@Controller **定义**: `@Controller` 注解是用来标记一个类作为控制器(Controller)组件,在Spring MVC框架中扮演着请求处理者的角色。 **作用**: 通过这个注解,可以将...

    SpringMVC @ModelAttribute应用

    在Spring MVC框架中,`@ModelAttribute`是一个非常重要的注解,它主要用于数据绑定,帮助开发者在控制器方法中接收和处理请求参数。这篇文章将深入探讨`@ModelAttribute`的应用及其背后的原理。 `@ModelAttribute`...

    springmvc全注解配置

    全注解配置是Spring MVC中一种简化配置的方式,通过在类或方法上使用特定的注解,可以避免大量的XML配置,提高开发效率。这篇博客可能是关于如何使用Spring MVC的注解来实现控制器、模型绑定、视图解析等关键功能的...

    基于注解实现springmvc的范例

    在Spring MVC框架中,注解的使用极大地简化了配置,提高了开发效率。本文将深入探讨如何基于注解实现Spring MVC的范例,旨在为初学者提供一个清晰的入门指南。 一、Spring MVC简介 Spring MVC是Spring框架的一部分...

    springmvc注解详解

    SpringMVC 注解详解 SpringMVC 是一个基于Java的Web应用程序框架,使用了Model-View-Controller(MVC)模式来分离应用程序的逻辑。SpringMVC提供了许多注解来简化配置和开发过程。下面将详细介绍SpringMVC的注解。 ...

    spring mvc中的@ModelAttribute注解示例介绍

    在Spring MVC框架中,`@ModelAttribute`注解扮演着至关重要的角色,主要用于数据绑定和模型对象的管理。本文将深入探讨`@ModelAttribute`的工作原理、使用场景以及如何通过示例来理解其功能。 首先,`@...

Global site tag (gtag.js) - Google Analytics