本文我们详细先容下@ModelAttribute不同场景的用法。
@ModelAttribute 紧张的浸染是将数据添加到工具模型中。在视图页面展示时利用。等价于
model.addAttribute("abc","abc");
小知识点
首先我们须要知道,在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/index1http://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,都先容完了,有点绕,多看几遍就好了。