@ModelAttribute一个具有如下三个作用:

①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑

定流程,而且自动暴露为模型数据用于视图页面展示时使用;

②暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用

对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping 注解的方法)之前,自动添加

到模型对象中,用于视图页面展示时使用;

③暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为

模型数据,用于视图页面展示时使用。

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

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

1、注释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、注释返回具体类的方法

@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时,首先访问populateModel方法,返回User对象,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回User类型,那么这个model属性的名称是user。这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。它无须要特定的参数。

jsp 中如下访问:

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

 

3、也可以指定属性名称

@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>

4、对象合并

@Controller
public class Hello2ModelController {@ModelAttributepublic 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属性。

5、对象合并指定对象名称

@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>

6、通过此特性控制权限

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

public class BaseController {@ModelAttributepublic 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";  }
}

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

SpringMVC @ModelAttribute详解相关推荐

  1. Spring框架深入(四)--SpringMVC配置详解

    一.SpringMVC web模型 二.@RequestMapping参数说明 1.value:定义处理方法的请求的URL地址: 2.method:定义处理的方法的http method类型,如GET ...

  2. java springmvc注解详解_springMVC注解开发详解(转)

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

  3. 基于Servlet3.0的编程式SpringMVC实例详解

    传统的SpringMVC应用都是基于web.xml配置的,首先使用context listener启动Spring上下文,再配置一个DispatcherServlet启动一个WebApplicatio ...

  4. SpringMVC知识点详解

    目录 1.SpringMVC概述 1.1 SpringMVC概念 1.2 SpringMVC原理 1.3 SpringMVC优势 2.MVC模式回顾 3.入门程序 3.1 创建web的maven工程 ...

  5. springmvc原理详解(手写springmvc)

    最近在复习框架 在快看小说网搜了写资料 和原理 今天总结一下 希望能加深点映像  不足之处请大家指出 我就不画流程图了 直接通过代码来了解springmvc的运行机制和原理 回想用springmvc用 ...

  6. Spring MVC @ModelAttribute 详解

    1.@ModelAttribute注释void返回值的方法 [java] view plaincopy print? @Controller public class HelloModelContro ...

  7. Springmvc架构详解

    框架结构 框架结构如下图: 架构流程 1. 用户发送请求至前端控制器DispatcherServlet 2. DispatcherServlet收到请求调用HandlerMapping处理器映射器. ...

  8. 从Servlet到SpringMVC演变过程详解(ServletContext 和WebApplicationContext, ApplicationContext给你安排上了)

    无图言屌: 以前我们用servlet进行编程: 所有的配置都会在配置在web.xml里面,其实类似于现在的任务编排 我们会把我们的Filter和Servlet还有Listener,初始化的一些参数都写 ...

  9. SpringMvc菜鸟详解

    1.引言 今天写一点关于框架的东西,因为大多数企业现在都是用的SSH框架,所以我想把框架复习一下,我真的没有想到一个程序猿不经常敲代码会变成一个手残党,我真的很伤心,但是我觉得那些都不是事,只要努力, ...

最新文章

  1. Zygote启动分析
  2. 学习进度条——第八周
  3. js获取datagrid行,但是行改变了肿么办?
  4. docker安装nginx容器小记
  5. 通过Method运行时内存布局hook方法探索
  6. php及时获取zabbix告警,zabbix邮件告警python脚本代码
  7. docx文件怎样打开 - 转
  8. 人脸识别常用数据集大全
  9. Ubuntu 18.04 安装NVIDIA显卡驱动教程
  10. 团队协同作战渗透工具 CS神器Cobalt Strike
  11. Python检测和防御DOS攻击
  12. UVA - 10098 Generating Fast
  13. 网易云音乐编码_为什么有那么多编码员音乐家?
  14. ftp下载工具绿色版,ftp下载工具有绿色版的吗?教程详解
  15. __init__.py 文件用法
  16. 纸质合同为什么要升级为电子合同?区别在哪?
  17. ps如何给字体图换颜色
  18. burpsuit 靶场(Essential skills)
  19. srcnn fsrcnn espcn rdn超分网络的结构
  20. 修复计算机管理员账户密码多少,win10管理员账户密码忘记了图文解决教程

热门文章

  1. git 裁切_Vue + ccropper.js裁切图片(vue-cropper)
  2. Java多线程编程中Future模式的详解
  3. Effective Java之检查参数的有效性(三十八)
  4. 计算机组成原理 -- 概念点整理
  5. 数据结构(7)—— 排序总结
  6. Web前端开发笔记——第二章 HTML语言 第四节 超链接标签
  7. java字符串转语音文件_java - Java文字转语音(Spring Boot) - 堆栈内存溢出
  8. Windows使用msi安装MySQL安装教程
  9. java的基础语法是什么_java语法基础
  10. 字符串是单一字符的无序组合吗_计算机二级教程 Python语言程序设计 第6章组合数据类型...