本文我们详细先容下@ModelAttribute不同场景的用法。

@ModelAttribute 紧张的浸染是将数据添加到工具模型中。
在视图页面展示时利用。
等价于

model.addAttribute("abc","abc");

modelmapjsp手把手教程ModelAttribute 的6种应用场景 Bootstrap

小知识点

首先我们须要知道,在SpringMVC中,以下3种写法效果相同。

@RequestMapping(value = "/index1")

public String index(Dog dog) {

dog.setName("二哈1");

dog.setAge(1);

return "index";

}

@RequestMapping(value = "/index2")

public String index1( Model model) {

Dog dog = new Dog();

dog.setName("二哈2");

dog.setAge(2);

model.addAttribute("dog",dog);

return "index";

}

@RequestMapping(value = "/index3")

public String index2( Map map) {

Dog dog = new Dog();

dog.setName("二哈3");

dog.setAge(3);

map.put("dog",dog);

return "index";

}

index.jsp:

<body>

<h2>Test success!</h2>

dog:${requestScope.dog}

</body>

</html>

接下里我们分别访问:

http://localhost:8080/springmvc/index1

http://localhost:8080/springmvc/index2:

http://localhost:8080/springmvc/index3:

总结:Model、Map、或者是实体类,均会被SpringMVC放置在request域中。

接下来才是我们先容的重点 ↓↓↓↓

@ModelAttribute润色一个方法

以下示例1,2,3类似,被@ModelAttribute注释的方法会在此controller每个方法实行前被实行,因此对付一个Controller映射有多个URL的用法来说,要谨慎利用。

例1: @ModelAttribute标注在 返回值为void的方法上

@Controller

public class DemoController {

@ModelAttribute

public void testModelAttribute(Model model){

model.addAttribute("attribute","attribute");

}

@RequestMapping(value = "/index1")

public String index(Dog dog) {

dog.setName("二哈1");

dog.setAge(1);

return "index";

}

}

index.jsp:

<body>

<h2>Test success!</h2>

dog:${requestScope.dog}

<br>

attribute:${requestScope.attribute}

</body>

解释:testModelAttribute方法在 index 方法之前先被调用,它在model中添加了(“attribute”,”attribute”),在它实行后 index 被调用,返回视图index和model,此时的model中包含2个k-v键值对。

把稳:如果我们修正testModelAttribute和index方法如下:

@ModelAttribute

public void testModelAttribute(Model model){

Dog dog = new Dog("德牧",2);

model.addAttribute("dog",dog);

//model.addAttribute("attribute","attribute");

}

@RequestMapping(value = "/index1")

public String index(Dog dog) {

dog.setAge(1);

return "index";

}

效果:

解释:方法返回的model值相同(inde方法model为形参Dog首字母小写),均为dog。
那么,testModelAttribute方法产生的model中的dog中的属性值,会覆盖掉index方法产生的model中的dog中的为null的属性值。

例2: @ModelAttribute标注在 返回详细类的方法

@ModelAttribute

public Dog testModelAttribute(){

Dog dog = new Dog("德牧",3);

return dog;

}

@RequestMapping(value = "/index1")

public String index() {

return "index";

}

解释:这种情形,model属性的名称没有指定,它由返回类型隐含表示,如这个方法返回Dog类型,那么这个model属性的名称是dog(首字母小写)。

例3: @ModelAttribute(value=””)注释返回详细类的方法,但是指明了value值

@ModelAttribute(value = "attribute")

public Dog testModelAttribute(){

Dog dog = new Dog("德牧",2);

return dog;

}

@RequestMapping(value = "/index1")

public String index(Dog dog) {

dog.setName("二哈1");

dog.setAge(1);

return "index";

}

解释:这个例子中利用@ModelAttribute注释的value属性,来指定model属性的名称。
model属性工具便是方法的返回值。

例4:@ModelAttribute和@RequestMapping同时注释一个方法

@ModelAttribute

public Dog testModelAttribute(){

Dog dog = new Dog("德牧",2);

return dog;

}

@RequestMapping(value = "/index")

@ModelAttribute(value = "attribute")

public String index() {

return "attributeValue";

}

解释:index()这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据要求”/index”转换为逻辑视图index。

Model属性名称有@ModelAttribute(value=””)指定,相称于在request中封装了key=”attribute”,value=”attributeValue”。

@ModelAttribute表明润色一个方法的参数:

例5:

@ModelAttribute(value = "dog")

public Dog testModelAttribute(){

Dog dog = new Dog("德牧",2);

return dog;

}

@RequestMapping(value = "/index1")

public String index(@ModelAttribute(value = "dog") Dog dog) {

dog.setName("二哈");

return "index";

}

解释:在这个例子里,@ModelAttribute(value = “dog”) Dog dog 注释方法的参数,参数dog的值来源于testModelAttribute()方法中的model属性。

此时如果方法体没有标注@SessionAttributes(“dog”),那么scope为request,如果标注了,那么scope为session

@ModelAttribute表明润色一个方法的返回值

例6:

@RequestMapping(value = "/index")

public @ModelAttribute(value = "dog2") Dog testModelAttribute(){

Dog dog = new Dog("德牧",2);

return dog;

}

index.jsp

<body>

<h2>Test success!</h2>

dog2:${requestScope.dog2}

</body>

解释: @ModelAttribute(value = “dog2”),会添加返回值到model( 名字为user2 ) 中供视图展示利用。

OK,都先容完了,有点绕,多看几遍就好了。