[@Controller]4 详解@ModelAttribute

[@Controller]4 详解@ModelAttribute

 (2012-06-14 15:44:55)
转载▼

标签: 

spring

 

modelattribute

 

it

分类: JavaSpring

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)加入到一个名为attributeName的model属性中,在它执行后helloWorld被调用,返回视图名helloWorld和model已由@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"转换为helloWorld。Model属性名称有@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类一定要有没有参数的构造函数。

时间: 2025-01-05 21:56:49

[@Controller]4 详解@ModelAttribute的相关文章

[@Controller]2 详解@RequestMapping

[@Controller]2 详解@RequestMapping  (2012-06-14 15:41:06)转载▼ 标签:  spring   requestmapping   it 分类: JavaSpring A.@RequestMapping org.springframework.web.bind.annotation.RequestMapping Annotation for mapping web requests onto specific handler classes and

[@Controller]3 详解@CookieValue,@PathVariable,@RequestBody,@RequestHeader,@RequestParam

[@Controller]3 详解@CookieValue,@PathVariable,@RequestBody,@RequestHeader,@RequestParam (2012-06-14 15:43:49)转载▼ 标签:  cookievalue   pathvariable   requestbody   requestheader 分类: JavaSpring 下列参数一般都和@RequestMapping配合使用.   A.@CookieValue org.springframew

Java Spring MVC 上传下载文件配置及controller方法详解_java

下载: 1.在spring-mvc中配置(用于100M以下的文件下载) <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!--配置下载返回类型--> <bean class="or

跟我学Kafka之Controller控制器详解

作者:小程 我们的kafka源码分享已经进行过很多期了,主要的内容也都分享的差不多了,那么在今后的分享中,主要集中在kafka性能优化和使用. Kafka集群中的其中一个Broker会被选举为Controller,主要负责Partition管理和副本状态管理,也会执行类似于重分配Partition之类的管理任务.如果当前的Controller失败,会从其他正常的Broker中重新选举Controller. 进入KafkaController.scala文件看到如下代码: class KafkaC

ASP.NET MVC Controller激活系统详解:IoC的应用[下篇]

[上篇]除了通过自定义ControllerFactory的方式引入IoC之外,在使用默认DefaultControllerFactory情况下也可以通过一些扩展使基于IoC的Controller激活成为可能.主要的方式就是自定义ControllerActivator和 DependencyResolver. 四.ControllerActivator V.S. DependencyResolver 如下面的代码片断所示,DefaultControllerFactory具有两个构造函数重载,其中一

ASP.NET MVC Controller激活系统详解:IoC的应用[上篇]

所谓控制反转(IoC: Inversion Of Control)简单地说就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责.这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的反转.比如在类型A中需要使用类型B的实例,而B实例的创建并不由A来负责,而是通过外部容器来创建.通过IoC的方式是实现针对目标Controller的激活具有重要的意义. 一.从Unity来认识IoC 有时我们又将IoC称为依赖注入(DI: Dependency Injection).所谓依赖注入,

ASP.NET MVC Controller激活系统详解:默认实现

Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前ControllerBuilder的SetControllerFactory方法),默认使用的是一个DefaultControllerFactory对象,我们现在就来讨论实现在DefaultControllerFactory类型中的默认Controller激活机制. 一.Controller类型的解析 激活

ASP.NET MVC Controller激活系统详解:总体设计

我们将整个ASP.NET MVC框架划分为若干个子系统,那么针对请求上下文激活目标Controller对象的子系统被我们成为Controller激活系统.在正式讨论Controller对象具体是如何被创建爱之前,我们先来看看Controller激活系统在ASP.NET MVC中的总体设计,了解一下组成该子系统的一些基本的组件,以及它们对应的接口或者抽象类是什么. 一.Controller 我们知道作为Controller的类型直接或者间接实现了IController接口.如下面的代码片断所示,I

Asp.Net MVC3 简单入门第一季(三)详解Controller之Filter

前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接受这是我一直努力的方向.后面会有稍微复杂点的项目!让我们一起期待吧! 此文我将跟大家介绍一下Asp.Net MVC3 Filter的一些用法.你会了解和学习到全局Fileter,Action Filter等常用用法. 第一节:Filter知识储备 项目大一点总会有相关的AOP面向切面的组件,而MVC