文档章节

@ModelAttribute运用详解

小湘西
 小湘西
发布于 2016/04/29 14:24
字数 766
阅读 107
收藏 6

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。

我们编写控制器代码时,会将保存方法独立成一个控制器也是如此。

 

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.ht时,首先访问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";  
    }  
}

这个在编写代码的时候很有用处,比如在更新的时候,我们可以现在populateModel方法中根据ID获取对象,然后使用spring mvc的自动组装功能,组装

User对象,这样在客户端提交了值的属性才会被组装到对象中。

比如:User对象,首先从数据库中获取此对象,客户端表单只有account属性,提交时就只会改变account属性。

 

对象合并指定对象名称:

@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";  
    }  
}

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

 

本文转载自:

小湘西
粉丝 18
博文 100
码字总数 27575
作品 0
东城
程序员
私信 提问
[@Controller]4 详解@ModelAttribute

A、@ModelAttribute Annotation that binds a method parameter or method return value to a named model attribute, exposed to a web view. Supported for RequestMapping annotated han......

Edens_Song
2012/11/14
157
0
Spring MVC之@ControllerAdvice详解

对于@ControllerAdvice,我们比较熟知的用法是结合@ExceptionHandler用于全局异常的处理,但其作用不仅限于此。ControllerAdvice拆分开来就是Controller Advice,关于Advice,前面我们讲解S...

爱宝贝丶
2018/10/02
4.2K
0
SpringMVC常用注解标签详解

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

Java工程师-Distance
2018/05/20
833
0
Spring Boot参数绑定注解详解及其使用场景

在使用Spring Boot作接口开发的过程中发现接受参数的注解,有时不能准确理解其含义,故抽空总结一下以备将来参阅。 首先将常用的handler method注解通过他们处理Request的不同内容部分,分类...

豫华商
12/06
45
0
spring mvc 统一异常处理

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

qiun
2016/06/24
730
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么面试必问线程状态?你的回答满分了吗

看很多同学的面经、网上的面试资料,都不约而同的提到了一个基础问题:“你知道线程有几种状态吗?状态之间的扭转是怎样的?”,有准备的同学都知道有五种:New(新建)、Runnable(可运行)...

Z_J_H
26分钟前
4
0
如何保障云上数据安全?一文详解云原生全链路加密

点击下载《不一样的 双11 技术:阿里巴巴经济体云原生实践》 本文节选自《不一样的 双11 技术:阿里巴巴经济体云原生实践》一书,点击上方图片即可下载! 作者 李鹏(壮怀)阿里云容器服务高...

阿里巴巴云原生
26分钟前
3
0
获取数组的第一个元素

我有一个数组: array( 4 => 'apple', 7 => 'orange', 13 => 'plum' ) 我想获得此数组的第一个元素。 apple 预期结果: apple 一个要求: 它不能通过引用传递来完成 ,所以array_shift不是一......

javail
28分钟前
4
0
哈希情史知多少

<p align="right">——日拱一卒,不期而至!</p> 简介 hash是我们工作中经常听到的词,比如哈希表、哈希函数、hashCode、HashTable、HashMap等等,那么它们之间到底有怎样的爱恨情仇呢?来一...

彤哥读源码
35分钟前
4
0
SpringCloud 学习(5) --- Zuul(一)基本概念、配置

[TOC] Spring Cloud eureka:注册中心 服务端:提供注册 客户端:进行注册 ribbon:负载均衡(集群) Hystrix:熔断器,执行备选方案 Feign:远程调用 Zuul:网关,统一入口。 1.1、一夫当关,...

庭前云落
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部