zoukankan      html  css  js  c++  java
  • Spring MVC @ModelAttribute

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

    @Controller  
    public class HelloModelController {  
          
        @ModelAttribute   
        public void populateModel(@RequestParam String abc, Model model) {    
           model.addAttribute("attributeName", abc);    
        }    
      
        @RequestMapping(value = "/helloWorld")    
        public String helloWorld() {    
           return "helloWorld.jsp";    
        }    
      
    } 

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

      jsp页面页面如下:

    <%@ page language="java" contentType="text/html; charset=utf-8"  
        pageEncoding="utf-8"%>  
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
    <html>  
    <head>  
    </head>  
    <body>  
    <c:out value="${attributeName}"></c:out>  
    </body>  
    </html>  

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

    @Controller  
    public class Hello2ModelController {  
          
        @ModelAttribute   
        public User populateModel() {    
           User user=new User();  
           user.setAccount("ray");  
           return user;  
        }    
        @RequestMapping(value = "/helloWorld2")    
        public String helloWorld() {    
           return "helloWorld.jsp";    
        }    
    }  

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

      jsp 中如下访问:

    <c:out value="${user.account}"></c:out> 

      也可以指定属性名称

    @Controller  
    public class Hello2ModelController {  
          
        @ModelAttribute(value="myUser")  
        public User populateModel() {    
           User user=new User();  
           user.setAccount("ray");  
           return user;  
        }    
        @RequestMapping(value = "/helloWorld2")    
        public String helloWorld(Model map) {    
           return "helloWorld.jsp";    
        }    
    }  

      jsp中如下访问:

    <c:out value="${myUser.account}"></c:out>  

      对象合并:

    @Controller  
    public class Hello2ModelController {  
          
        @ModelAttribute  
        public User populateModel() {    
           User user=new User();  
           user.setAccount("ray");  
           return user;  
        }    
          
        @RequestMapping(value = "/helloWorld2")    
        public String helloWorld(User user) {  
            user.setName("老王");  
           return "helloWorld.jsp";    
        }    
    } 

      对象合并指定对象名称:

    @Controller  
    public class Hello2ModelController {  
          
        @ModelAttribute("myUser")  
        public User populateModel() {    
           User user=new User();  
           user.setAccount("ray");  
           return user;  
        }    
          
        @RequestMapping(value = "/helloWorld2")    
        public String helloWorld(@ModelAttribute("myUser") User user) {  
            user.setName("老王");  
           return "helloWorld.jsp";    
        }    
    }  

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

    <c:out value="${myUser.name}"></c:out>  
    <c:out value="${myUser.account}"></c:out>  

    3.通过此特性控制权限

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

    public class BaseController {  
          
        @ModelAttribute  
        public void populateModel() throws Exception {    
           SysUser user=ContextUtil.getCurrentUser();  
           if(user.getAccount().equals("admin")){  
               throw new Exception("没有权限");  
           }  
        }    
    }  

      需要控制权限的类继承BaseController

    @Controller  
    public class Hello2ModelController extends BaseController {  
          
        @RequestMapping(value = "/helloWorld2")    
        public String helloWorld(@ModelAttribute("myUser") User user) {  
            user.setName("老王");  
           return "helloWorld.jsp";    
        }    
    } 

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

    4.总结

      @ModelAttribute具有如下三个作用:

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

    public String test(@ModelAttribute("user") UserModel user)  

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

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

    public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user) 

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

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

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

  • 相关阅读:
    centos8 将SSSD配置为使用LDAP并要求TLS身份验证
    Centos8 搭建 kafka2.8 .net5 简单使用kafka
    .net core 3.1 ActionFilter 拦截器 偶然 OnActionExecuting 中HttpContext.Session.Id 为空字符串 的问题
    Springboot根据不同环境加载对应的配置
    VMware Workstation12 安装 Centos8.3
    .net core json配置文件小结
    springboot mybatisplus createtime和updatetime自动填充
    .net core autofac依赖注入简洁版
    .Net Core 使用 redis 存储 session
    .Net Core 接入 RocketMQ
  • 原文地址:https://www.cnblogs.com/ChinaHook/p/5439909.html
Copyright © 2011-2022 走看看