[@Controller]4 详解@ModelAttribute

[@Controller]4 详解@ModelAttribute – howareyouo的专栏 – 博客频道 – CSDN.NET.

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类一定要有没有参数的构造函数。

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

[@Controller]3 详解@CookieValue,@PathVariable,@RequestBody,@RequestHeader,@RequestParam – howareyouo的专栏 – 博客频道 – CSDN.NET.

下列参数一般都和@RequestMapping配合使用。

 

A@CookieValue

org.springframework.web.bind.annotation.CookieValue

public @interface CookieValue

Annotation which indicates that a method parameter should be bound to an HTTP cookie. Supported for annotated handler methods in Servlet and Portlet environments.

这个注释表示一个方法参数绑定到一个HTTP cookie。支持ServletPortlet环境。

The method parameter may be declared as type Cookie or as cookie value type (String, int, etc).

这个方法的参数可声明为Cookie类型或String, int等。

A.1@CookieValue的属性

String value

The name of the cookie to bind to.

绑定的cookie名称。

boolean required

Whether the header is required.

Default is true, leading to an exception being thrown in case the header is missing in the request. Switch this to false if you prefer a null in case of the missing header.

Head是否需要。默认是true,请求中头丢失将抛出一个异常。False,请求中头丢失将返回null

Alternatively, provide a defaultValue, which implicitly sets this flag to false.

因此,提供一个defaultValue

String defaultValue

The default value to use as a fallback. Supplying a default value implicitly sets required() to false.

requiredfalse,请求中头丢失将返回这个值。

 

B@PathVariable

Annotation which indicates that a method parameter should be bound to a URI template variable. Supported for RequestMapping annotated handler methods in Servlet environments.

    这个参数指出方法的一个参数绑定到一个URI template变量。在Servlet环境中的被@RequestMapping注释的处理器方法。

B.1@PathVariable的属性

value

The URI template variable to bind to.

绑定URI template变量。

举例说明

@Controller

public class HelloWorldController {    @RequestMapping(“/helloWorld/{userId}”)

public String helloWorld(ModelMap model,@PathVariable(“userId”) String userId) {

       model.addAttribute(“attributeName”, userId);

       return “helloWorld”;

    }

}

URI template变量和方法的参数名称一样时,可以省略value的定义,@PathVariable达到同样的效果。

 

C@RequestBody

Annotation which indicates that a method parameter should be bound to the web request body. Supported for annotated handler methods in Servlet environments.

这个注释它指示一个方法的参数绑定到一个web请求的body。它支持Servlet环境中的注释处理器方法。

举例说明

@Controller

public class HelloWorldController {

    @RequestMapping(“/hello.do”)   

    public String helloWorld(Model model,@RequestBody String reqBody) {

       model.addAttribute(“message”, reqBody);

       return “helloWorld”;

    }

}

这时这个参数reqBody的值是请求页面的form表单的所有值。

 

D@ RequestHeader

Annotation which indicates that a method parameter should be bound to a web request header. Supported for annotated handler methods in Servlet and Portlet environments.

这个注释它指示一个方法的参数绑定到一个web请求的头信息。它支持ServletPortlet环境中的注释处理器方法。

D.1@ RequestHeader的属性

String defaultValue

The default value to use as a fallback.

默认返回值。

Boolean required

Whether the header is required.

是否需要header

String value

The name of the request header to bind to.

绑定的请求头名称。

举例说明

@Controller

public class HelloWorldController {

    @RequestMapping(“/hello.do”)   

    public String helloWorld(Model model,@RequestHeader(“Accept”) String info) {

       model.addAttribute(“message”info);

       return “helloWorld”;

    }

}

这时这个参数info将获得请求的Accept头信息。

 

E@RequestParam

org.springframework.web.bind.annotation.RequestParam

Annotation which indicates that a method parameter should be bound to a web request parameter. Supported for annotated handler methods in Servlet and Portlet environments.

这个参数指出一个方法的参数应绑定到一个web请求的参数。支持ServletPortlet环境下注释处理器的方法。

E.1@RequestParam的属性

E.1.1value

The name of the request parameter to bind to.

绑定的请求参数的名称。

@RequestParam(value=“abc”)等同于@RequestParam(“abc”)

E.1.2required

Whether the parameter is required.

是否需要参数。

Default is true, leading to an exception thrown in case of the parameter missing in the request. Switch this to false if you prefer a null in case of the parameter missing.

默认为true,若请求中没有参数会导致抛出一个异常。若设置为false,若请求中没有参数就会返回null

Alternatively, provide a defaultValue, which implicitly sets this flag to false.

required=false时,最好设置一个defaultValue默认值。

@RequestParam(value = “abc”,required=false)

E.1.3defaultValue

The default value to use as a fallback. Supplying a default value implicitly sets required() to false.

required=false时,设定默认值。

举例说明

@Controller

@RequestMapping(“/a”)

public class HelloWorldController {

    @RequestMapping(“/b”)

    public String helloWorld(Model model,@RequestParam(“a”) String abc) {

       model.addAttribute(“message”, abc);

       return “helloWorld”;

    }

}

 

F@ResponseBody

Annotation which indicates that a method return value should be bound to the web response body. Supported for annotated handler methods in Servlet environments.

这个注释它指示一个方法的返回值应该绑定到一个web响应的body中。它支持Servlet环境中的注释处理器方法。

应用@ResponseBody将会跳过视图处理,而是调用合适HttpMessageConverter,将返回值写入输出流。

举例说明

@Controller

@RequestMapping(“/a”)

public class HelloWorldController {

    @RequestMapping(“/b”)

    @ResponseBody

    public String helloWorld() {

       return “helloWorld”;

    }

}

或者这样定义

@Controller

public class HelloWorldController {

    @RequestMapping(“/a/b”)

    public @ResponseBody String helloWorld() {

       return “helloWorld”;

    }

}

 

这时访问/a/b时,不是返回一个view名为helloWorld的视图,而是作出一个响应,其内容为helloWorld