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"; } }
这样就可以控制权限了,当然控制权限的方法有很多,比如通过过滤器等。这里只是提供一种思路。
总结:
@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 注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
相关推荐
当`@ModelAttribute`注解在控制器方法的参数上时,Spring MVC会尝试从请求中获取对应的数据,并将其转换为该参数类型的对象。这个过程包括以下步骤: - **查找数据源**:Spring MVC会检查请求参数、模型属性...
在Spring MVC框架中,`@ModelAttribute`注解扮演着至关重要的角色,主要用于数据绑定和模型对象的管理。本文将深入探讨`@ModelAttribute`的工作原理、使用场景以及如何通过示例来理解其功能。 首先,`@...
在Java的Spring MVC框架中,`@ModelAttribute`注解是一个非常关键的元素...理解并熟练运用`@ModelAttribute`注解是Spring MVC开发中的重要技能,它极大地简化了数据处理和对象绑定的过程,提高了代码的可读性和维护性。
当`@ModelAttribute`注解应用于方法参数时,Spring MVC会尝试从请求中找到匹配的参数值,并将其注入到对应的对象中。例如,如果你有一个`User`类,它包含了`name`和`email`属性,你可以创建一个方法: ```java @...
在Spring MVC框架中,`@ModelAttribute`是一个非常关键的注解,它主要用于数据绑定和模型属性的处理。本文将深入探讨在JSP中如何使用`@ModelAttribute`,以及它在实际开发中的应用。 首先,`@ModelAttribute`通常用...
在Spring MVC框架中,`@ModelAttribute`是一个非常重要的注解,它主要用于数据绑定和模型对象的处理。在本文中,我们将深入探讨`@ModelAttribute`的使用及其在控制器(Controller)中的作用。 首先,`@...
此外,Spring MVC会将带有 `@ModelAttribute` 注解的参数添加到Model中,以便在视图层可以访问。 3. **两者的主要差异** - `@RequestParam` 更注重单个参数的处理,而 `@ModelAttribute` 更适合于处理复杂对象,...
在Spring MVC框架中,`@ModelAttribute`是一个非常重要的注解,它主要用于数据绑定,帮助开发者在控制器方法中接收和处理请求参数。这篇文章将深入探讨`@ModelAttribute`的应用及其背后的原理。 `@ModelAttribute`...
5.Spring MVC @ModelAttribute 注解案例 6.Spring MVC 国际化案例 7.Spring MVC 请求转发与请求重定向案例 8.Spring MVC 下载 Excel 文档的需求案例 9.Spring MVC RESTful 风格的请求方式案例 10.Spring + Spring ...
### ModelAttribute注解详解 在Spring MVC框架中,`@ModelAttribute`注解是一个非常重要的工具,它主要用于将请求参数绑定到Model对象上。这不仅提高了数据处理的灵活性,还简化了控制器方法的设计。 #### 一、`@...
在Spring MVC框架中,注解的使用极大地简化了配置,提高了开发效率。Spring MVC通过注解可以实现控制器、方法映射、模型数据绑定、视图解析等关键功能。本实例将深入探讨Spring MVC中常见的注解及其应用。 1. `@...
在 SPRING MVC 中,可以使用 @ModelAttribute 注解获取 POST 请求的 FORM 表单数据。例如: ```java pojo public class Pojo{ private String a; private int b; } @RequestMapping(method = RequestMethod.POST)...
本示例提供了超简化的、完整的、注解驱动的 Spring MVC 应用程序,可以快速运行并观察其效果。以下是关于 Spring MVC 的关键知识点: 1. **注解驱动**:在 Spring MVC 中,注解被广泛用于简化配置。例如,`@...
表单提交的数据可以直接绑定到控制器方法的参数上,通过@ModelAttribute注解实现。Hibernate Validator或JSR-303/JSR-349规范的验证可以集成到模型属性的验证中,确保输入数据的有效性。 拦截器(Interceptor)是...
在深入探索Spring MVC框架的过程中,我们经常会遇到`@ModelAttribute`这个注解。它在处理HTTP请求时扮演着非常重要的角色。本文将详细介绍`@ModelAttribute`的功能、内部实现机制及其应用场景。 #### 功能概述 `@...
使用@ModelAttribute注解可以将方法的返回值自动添加到Model中,便于传递到视图。视图解析通常通过ViewResolver完成,例如,使用Thymeleaf模板引擎,视图名"users"会对应一个名为"users.html"的模板文件。 5. **...
2. **@ModelAttribute注解** `@ModelAttribute`是Spring MVC中的一个关键注解,用于绑定请求参数到一个模型对象。当我们希望从URL中获取对象参数时,可以将该注解添加到控制器方法的参数前。 ```java @GetMapping...
在Spring MVC中,我们可以使用@Controller和@RequestMapping等注解来声明控制器类和处理方法。@RequestMapping注解用于映射HTTP请求到特定的方法,这极大地提高了代码的可读性和维护性。此外,还可以通过@...
这是 Spring MVC 中最核心的注解之一,用于定义请求映射。它可以应用于类级别或方法级别,以指定 URL 路径和 HTTP 方法(GET, POST 等)。在 `BbtForumController` 示例中,`@RequestMapping("/forum.do")` 用于类...