Spring MVC @ModelAttribute 详解

来源:互联网 发布:java set用法 编辑:程序博客网 时间:2024/06/05 14:42

1.@ModelAttribute注释void返回值的方法


[java] view plain copy
 print?
  1. @Controller  
  2. public class HelloModelController {  
  3.       
  4.     @ModelAttribute   
  5.     public void populateModel(@RequestParam String abc, Model model) {    
  6.        model.addAttribute("attributeName", abc);    
  7.     }    
  8.   
  9.     @RequestMapping(value = "/helloWorld")    
  10.     public String helloWorld() {    
  11.        return "helloWorld.jsp";    
  12.     }    
  13.   
  14. }  

在这个代码中,访问控制器方法helloWorld时,会首先调用populateModel方法,将页面参数abc(/helloWorld.ht?abc=text)放到model的attributeName属性中,在视图中可以直接访问。


jsp页面页面如下:

[html] view plain copy
 print?
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  4. <html>  
  5. <head>  
  6. </head>  
  7. <body>  
  8. <c:out value="${attributeName}"></c:out>  
  9. </body>  
  10. </html>  

2.@ModelAttribute注释返回具体类的方法


[java] view plain copy
 print?
  1. @Controller  
  2. public class Hello2ModelController {  
  3.       
  4.     @ModelAttribute   
  5.     public User populateModel() {    
  6.        User user=new User();  
  7.        user.setAccount("ray");  
  8.        return user;  
  9.     }    
  10.     @RequestMapping(value = "/helloWorld2")    
  11.     public String helloWorld() {    
  12.        return "helloWorld.jsp";    
  13.     }    
  14. }  

当用户请求 http://localhost:8080/test/helloWorld2.html时,首先访问populateModel方法,返回User对象,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称是user。 
这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。它无须要特定的参数。


jsp 中如下访问:

[html] view plain copy
 print?
  1. <c:out value="${user.account}"></c:out>  

也可以指定属性名称
[java] view plain copy
 print?
  1. @Controller  
  2. public class Hello2ModelController {  
  3.       
  4.     @ModelAttribute(value="myUser")  
  5.     public User populateModel() {    
  6.        User user=new User();  
  7.        user.setAccount("ray");  
  8.        return user;  
  9.     }    
  10.     @RequestMapping(value = "/helloWorld2")    
  11.     public String helloWorld(Model map) {    
  12.        return "helloWorld.jsp";    
  13.     }    
  14. }  

jsp中如下访问:
[html] view plain copy
 print?
  1. <c:out value="${myUser.account}"></c:out>  


对象合并:

[java] view plain copy
 print?
  1. @Controller  
  2. public class Hello2ModelController {  
  3.       
  4.     @ModelAttribute  
  5.     public User populateModel() {    
  6.        User user=new User();  
  7.        user.setAccount("ray");  
  8.        return user;  
  9.     }    
  10.       
  11.     @RequestMapping(value = "/helloWorld2")    
  12.     public String helloWorld(User user) {  
  13.         user.setName("老王");  
  14.        return "helloWorld.jsp";    
  15.     }    
  16. }  

 

对象合并指定对象名称:

[java] view plain copy
 print?
  1. @Controller  
  2. public class Hello2ModelController {  
  3.       
  4.     @ModelAttribute("myUser")  
  5.     public User populateModel() {    
  6.        User user=new User();  
  7.        user.setAccount("ray");  
  8.        return user;  
  9.     }    
  10.       
  11.     @RequestMapping(value = "/helloWorld2")    
  12.     public String helloWorld(@ModelAttribute("myUser") User user) {  
  13.         user.setName("老王");  
  14.        return "helloWorld.jsp";    
  15.     }    
  16. }  

这样在jsp中可以使用如下方式访问


[html] view plain copy
 print?
  1. <c:out value="${myUser.name}"></c:out>  
  2. <c:out value="${myUser.account}"></c:out>  

3.通过此特性控制权限.

我们可以在基类方法中控制写此注解,需要控制权限的控制器,继承控制器就可以了。


[java] view plain copy
 print?
  1. public class BaseController {  
  2.       
  3.     @ModelAttribute  
  4.     public void populateModel() throws Exception {    
  5.        SysUser user=ContextUtil.getCurrentUser();  
  6.        if(user.getAccount().equals("admin")){  
  7.            throw new Exception("没有权限");  
  8.        }  
  9.     }    
  10. }  

需要控制权限的类继承BaseController

[java] view plain copy
 print?
  1. @Controller  
  2. public class Hello2ModelController extends BaseController {  
  3.       
  4.     @RequestMapping(value = "/helloWorld2")    
  5.     public String helloWorld(@ModelAttribute("myUser") User user) {  
  6.         user.setName("老王");  
  7.        return "helloWorld.jsp";    
  8.     }    
  9. }  

这样就可以控制权限了,当然控制权限的方法有很多,比如通过过滤器等。这里只是提供一种思路。


总结:


@ModelAttribute具有如下三个作用:

①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用。其实@ModelAttribute此处对于供视图页面展示来说与model.addAttribute("attributeName", abc);功能类似。

[java] view plain copy
 print?
  1. public String test(@ModelAttribute("user") UserModel user)   

此处多了一个注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。


②暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

[java] view plain copy
 print?
  1. public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)  


大家可以看到返回值类型是命令对象类型,而且通过@ModelAttribute("user2")注解,此时会暴露返回值到模型数据( 名字为user2 ) 中供视图展示使用

@ModelAttribute 注解的返回值会覆盖@RequestMapping 注解方法中的@ModelAttribute 注解的同名命令对象


③暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping 注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;


博文转自:http://blog.csdn.net/hejingyuan6/article/details/49995987

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子挑衣服穿怎么办 馒头店生意不好怎么办 白连裤袜染色了怎么办 人比较胖校服怎么办 幼儿撕书老师怎么办 夏天面试要求穿正装怎么办 面试要求穿正装没有怎么办 面试没有正装怎么办 退烧药服用过量怎么办 小孩喝洗衣粉水怎么办 小孩误食沐浴露怎么办 三个月宝宝腿弯怎么办 宝宝背带裤老掉怎么办 羽绒服洗完结块怎么办 天猫保证金被骗怎么办 飞机杯发霉了怎么办 背带裤裆太大了怎么办 宝宝开裆裤裆太大怎么办 a字裙太大怎么办 棉衣服缩水了怎么办 百褶裙子大了怎么办 皮鞋有黑色划痕怎么办 天猫搜索不了怎么办 帆布鞋穿着脚臭怎么办 运动鞋磨脚踝骨怎么办 运动鞋挂烂了怎么办 网状运动鞋烂了怎么办 运动鞋臭怎么办快速去除 天猫预售退货怎么办 肯德基兑换券过期了怎么办 直通车上10之后怎么办 淘宝没有评论过怎么办 爱上街虚假发货怎么办 天猫差评被置顶了一天怎么办 天猫跨店满减其中订单退款怎么办 天猫618津贴不够怎么办 鼻子上长大包怎么办 净水器滤芯漏水怎么办 京东忘记用户名怎么办 详情页图片模糊怎么办 打印图片字体模糊怎么办