码迷,mamicode.com
首页 > 编程语言 > 详细

Spring MVC @ModelAttribute注解

时间:2019-01-10 22:57:38      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:情况下   使用   cell   java   out   渲染   and   etag   com   

  在一个Controller内,被@ModelAttribute标注的方法会在此controller的每个handler方法执行前被执行。

  被@ModelAttribute标注的方法的参数绑定规则和普通handler方法相同。

  可以理解为:

  1. 请求到达Controller后,不论其他handler方法的RequestMapping值是多少,请求都会路由至被@ModelAttribute标注的方法;
  2. 由springMVC再对request执行一次forward,路由至真正的handler方法。

@ModelAttribute用于注解方法

方法返回类型为void

  这种情况,@ModelAttribute只是单纯的作为请求路由的第一站,使用者可在方法内部操作Model和Request等参数实现功能。

   对于如下请求:

http://localhost:8080/TestModelAttributeController/testHandler.action?reqParam=123

  对应的Controller:

@Controller
@RequestMapping("/TestModelAttributeController")
public class TestModelAttributeController {

    @ModelAttribute
    public void modelAttributeMethod(HttpServletRequest request, String reqParam, Model model){
        model.addAttribute("reqParam",reqParam);
        request.setAttribute("methodParam","Hello ModelAttribute");
    }


    @RequestMapping("/testHandler")
    public String testHandler(){
        return "testModelAttribute";
    }
}

   testModelAttribute.jsp如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>${reqParam}</h1>
<h1>${methodParam}</h1>
</body>
</html>

  最终可以在页面中看到:

  123

  Hello ModelAttribute

方法返回类型不为void

这种情况,@ModelAttribute会将返回值放到Model中,并将该类型名称的首字母小写作为model中的属性名

请求地址和参数不变。

对应的Controller:

    @ModelAttribute
    public User userModelAttributeMethod2(){
        User user = new User();
        user.setAge(31);
        user.setName("James");
        user.setEmail("123456@qq.com");
        return user;  //相当于model.addAttribute("user",user);
    }


    @RequestMapping("/testHandler")
    public String testHandler(Model model){
        System.out.println(model.containsAttribute("user"));  //true
        return "testModelAttribute";
}

 对应的jsp页面

<h1>${user.age}</h1>
<h1>${user.email}</h1>
<h1>${user.name}</h1>

   实际上,对于返回类型为void的方法,@ModelAttribute也会在model中添加一对键值对,“void”->"null"

方法返回类型不为void,且@ModelAttribute指定属性名称

  这种情况下,@ModelAttribute会将返回值放到Medel中,且对应的key值为@ModelAttribute置顶的属性名

   对应的Controller:

 @ModelAttribute("myUser")
    public User userModelAttributeMethod2(){
        User user = new User();
        user.setAge(31);
        user.setName("James");
        user.setEmail("123456@qq.com");
        return user;  //相当于model.addAttribute("user",user);
    }


    @RequestMapping("/testHandler")
    public String testHandler(Model model){
        System.out.println(model.containsAttribute("user"));  //true
        return "testModelAttribute";
}

  对应的jsp页面:

<h1>${myUser.age}</h1>
<h1>${myUser.email}</h1>
<h1>${myUser.name}</h1>

 

@ModelAttribute和@RequestMapping注解同一个方法

  这种情况下:

  1. 在controller处理其他请求时,不会再首先进入被@ModelAttribute和@RequestMapping同时注解的方法
  2. 该方法的返回值不再是视图的逻辑名称,而是按照@ModelAttribute的规则被加入到Model中;
  3. @RequestMapping注解的value值具有两个作用
    • 作为URI,实现请求的路由;
    • 作为此次请求的逻辑视图名(严格来说此时视图的逻辑视图名是:controller的RequestMapping值+method的RequestMapping值
@Controller
@RequestMapping("/TestModelAttributeController")
public class TestModelAttributeController {

    @RequestMapping("/testModelAttribute")
    @ModelAttribute("result")
    public String testModelAttribute(){
        return "excellent";
    }

 

<body>
<h1>${result}</h1>
</body>

 

如上Controller和jsp:

testModelAttribute方法的作用是:

  1. 处理路径为 /TestModelAttributeController/testModelAttribute*的请求
  2. 将键值对"result"->"excellent"放至model中,为视图渲染提供数据
  3. 返回逻辑视图名 /TestModelAttributeController/testModelAttribute

@ModelAttribute注解参数

Spring MVC @ModelAttribute注解

标签:情况下   使用   cell   java   out   渲染   and   etag   com   

原文地址:https://www.cnblogs.com/canger/p/10241576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!