当前位置: 首页 > news >正文

[@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 handler classes.

在被@RequestMapping注释的处理器类中,这个注释可以绑定一个方法参数或绑定一个方法的返回值到一个命名的模型属性,提供给一个视图。

Can be used to expose command objects to a web view, using specific attribute names, through annotating corresponding parameters of a RequestMapping annotated handler method).

可以用于把一个command对象提供给web视图,使用指定的属性名称,在被@RequestMapping注释的处理器方法中注释相关参数。

Can also be used to expose reference data to a web view through annotating accessor methods ina controller class which is based on RequestMapping annotated handler methods, with such accessor methods allowed to have any arguments that RequestMapping supports for handler methods, returning the model attribute value to expose.

可以用于提供数据给一个web视图,通过注释处理器方法,这个方法允许有任何参数,返回的模型属性值被提供。

A.1@ ModelAttribute的属性

value

The name of the model attribute to bind to.

绑定的模型属性的名称。

The default model attribute name is inferred from the declared attribute type (i.e. the method parameter type or method return type), based on the non-qualified class name: e.g. "orderAddress" for class "mypackage.OrderAddress", or "orderAddressList" for "List<mypackage.OrderAddress>".

默认的模型属性名称自动判断声明的属性类型(如,方法参数类型或方法返回类型)。如这个值是orderAddress,就对于当前包. OrderAddress

 

B@ModelAttribute注释一个方法

An @ModelAttribute on a method indicates the purpose of that method is to add one or more model attributes. Such methods support the same argument types as @RequestMapping methods but cannot be mapped directly to requests. Instead @ModelAttribute methods in a controller are invoked before @RequestMapping methods, within the same controller.

@ModelAttribute注释的方法表示这个方法的目的是增加一个或多个模型(model)属性。这个方法和被@RequestMapping注释的方法一样也支持@RequestParam参数,但是它不能直接被请求映射。实际上,控制器中的@ModelAttribute方法是在同一控制器中的@RequestMapping方法被调用之前调用的。

@ModelAttribute methods are used to populate the model with commonly needed attributes for example to fill a drop-down with states or with pet types, or to retrieve a command object like Account in order to use it to represent the data on an HTML form.

@ModelAttribute注释的方法用于填充model属性,例如,为下拉菜单填充内容,或检索一个command对象(如,Account),用它来表示一个HTML表单中的数据。

A controller can have any number of @ModelAttribute methods. All such methods are invoked before @RequestMapping methods of the same controller.

一个控制器可以有任意数量的@ModelAttribute方法。所有这些方法都在@RequestMapping方法被调用之前调用。

Note the two styles of @ModelAttribute methods. In the first, the method adds an attribute implicitly by returning it. In the second, the method accepts a Model and adds any number of model attributes to it.

有两种类型的@ModelAttribute方法。一种是:加入只一个属性,用方法的返回类型隐含表示。另一种是:方法接受一个Model类型的参数,这个model可以加入任意多个model属性。

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

举例说明

@Controller

public class HelloWorldController {

    @ModelAttribute

    public void populateModel(@RequestParam String abc, Model model) {

       model.addAttribute("attributeName", abc);

    }

    @RequestMapping(value = "/helloWorld")

    public String helloWorld() {

       return "helloWorld";

    }

}

这个例子,在获得请求/helloWorld 后,populateModel方法在helloWorld方法之前先被调用,它把请求参数(/helloWorld?abc=text)加入到一个名为attributeNamemodel属性中,在它执行后helloWorld被调用,返回视图名helloWorldmodel已由@ModelAttribute方法生产好了。

这个例子中model属性名称和model属性对象有model.addAttribute()实现,不过前提是要在方法中加入一个Model类型的参数。

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

举例说明

@ModelAttribute

    public Account addAccount(@RequestParam String number) {

       return accountManager.findAccount(number);

    }

这种情况,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回Account类型,那么这个model属性的名称是account

这个例子中model属性名称有返回对象类型隐含表示,model属性对象就是方法的返回值。它无须要特定的参数。

B.3@ModelAttribute(value="")注释返回具体类的方法

举例说明

@Controller

public class HelloWorldController {

    @ModelAttribute("attributeName")

    public String addAccount(@RequestParam String abc) {

       return abc;

    }

    @RequestMapping(value = "/helloWorld")

    public String helloWorld() {

       return "helloWorld";

    }

}

这个例子中使用@ModelAttribute注释的value属性,来指定model属性的名称。model属性对象就是方法的返回值。它无须要特定的参数。

B.4@ModelAttribute@RequestMapping同时注释一个方法

举例说明

@Controller

public class HelloWorldController {

    @RequestMapping(value = "/helloWorld.do")

    @ModelAttribute("attributeName")

    public String helloWorld() {

       return "hi";

    }

}

这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/helloWorld.do"转换为helloWorldModel属性名称有@ModelAttribute(value=””)指定。

 

C@ModelAttribute注释一个方法的参数

An @ModelAttribute on a method argument indicates the argument should be retrieved from the model. If not present in the model, the argument should be instantiated first and then added to the model.Once present in the model, the argument's fields should be populated from all request parameters that have matching names. This is known as data binding in Spring MVC, a very useful mechanism that saves you from having to parse each form field individually.

@ModelAttribute注释方法的一个参数表示应从模型model中取得。若在model中未找到,那么这个参数将先被实例化后加入到model中。若在model中找到,则请求参数名称和model属性字段若相匹配就会自动填充。这个机制对于表单提交数据绑定到对象属性上很有效。

B.1、从model中获取

It may already be in the model due to an @ModelAttribute method in the same controller

参数的值从当前控制器的@ModelAttribute方法提供的model属性中获取。

举例说明

@Controller

public class HelloWorldController {

    @ModelAttribute("user")

    public User addAccount() {

       return new User("jz","123");

    }

    @RequestMapping(value = "/helloWorld")

public String helloWorld(@ModelAttribute("user") User user) {

       user.setUserName("jizhou");

       return "helloWorld";

    }

}

在这个例子里,@ModelAttribute("user") User user注释方法参数,参数user的值来源于addAccount()方法中的model属性。

B.2、从URI template变量中获取

 

B.3、从Form表单或URL参数中获取

举例说明

@Controller

public class HelloWorldController {

    @RequestMapping(value = "/helloWorld")

    public String helloWorld(@ModelAttribute User user) {

       return "helloWorld";

    }

}

注意这时候这个User类一定要有没有参数的构造函数。

From:http://blog.sina.com.cn/s/blog_6d3c1ec601017q4p.html

转载于:https://www.cnblogs.com/JavaTechLover/archive/2012/09/03/spring-controller4.html

相关文章:

  • memcached
  • 让ComboBox显示图片--PictureComboBox
  • 多线程丢失更新、加锁
  • ds存储上增加lun的容量,aix下的相应卷组大小怎么自动增加
  • 如何利用ccform自定义表单来增加自己的控件,关于Sys_FrmEle表结构与数据存储设计?...
  • id和class的区别
  • 字符串模板匹配
  • linux Perforce 使用
  • Android Activity生命周期
  • 敏捷结果30天之第十一天:高效能、慢生活
  • C++:复制构造函数在什么时候被调用?
  • js模拟hashtable
  • 取消锚(a/)点击后页面跳转的几种方法
  • 程序员面试题100题第26题——和为n连续正数序列
  • 软考 (一) 感触
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • angular组件开发
  • CentOS7 安装JDK
  • Cumulo 的 ClojureScript 模块已经成型
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java 最常见的 200+ 面试题:面试必备
  • ubuntu 下nginx安装 并支持https协议
  • vue总结
  • 爱情 北京女病人
  • 分享几个不错的工具
  • 判断客户端类型,Android,iOS,PC
  • 前端之Sass/Scss实战笔记
  • 首页查询功能的一次实现过程
  • 说说动画卡顿的解决方案
  • 提醒我喝水chrome插件开发指南
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • MPAndroidChart 教程:Y轴 YAxis
  • 数据可视化之下发图实践
  • 通过调用文摘列表API获取文摘
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #QT(TCP网络编程-服务端)
  • (11)MATLAB PCA+SVM 人脸识别
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (转)程序员技术练级攻略
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET gRPC 和RESTful简单对比
  • .Net mvc总结
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .Net6使用WebSocket与前端进行通信
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @ConfigurationProperties注解对数据的自动封装