Spring MVC @ModelAttribute注解

  在一个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("[email protected]");
        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("[email protected]");
        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注解参数

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

时间: 2024-11-05 20:41:09

Spring MVC @ModelAttribute注解的相关文章

spring mvc 方法注解拦截器

应用场景,在方法级别对本次调用进行鉴权,如api接口中有个用户唯一标示accessToken,对于有accessToken的每次请求可以在方法加一个拦截器,获得本次请求的用户,存放到request或者session域. python中,之前在python flask中可以使用装饰器来对方法进行预处理,进行权限处理 先看一个实例,使用@access_required拦截: @api.route('/post_apply') @access_required def apply():     "&q

java spring mvc 全注解

本人苦逼学生一枚,马上就要毕业,面临找工作,实在是不想离开学校.在老师的教导下学习了spring mvc ,配置文件实在繁琐,因此网上百度学习了spring mvc 全注解方式完成spring的装配工作; 废话不多说了上干货,其实我也没怎么理解不过简单的运行了一个spring mvc 全注解项目,也不能说是全注解,因为保留了web.xml和spring-serlvet.xml文件,(可能有的童鞋会说,这样配置可能对以后的修改不方便,无法达到只修改配置文件就切换某些环境.其实不是,零配置文件只是修

基于spring mvc的注解DEMO完整例子

弃用了struts,用spring mvc框架做了几个项目,感觉都不错,而且使用了注解方式,可以省掉一大堆配置文件.本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,现在这一篇补上.下面开始贴代码. 文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下. web.xml配置: <?xml version="1.0" encoding="UTF-8"?> 

Spring MVC @ModelAttribute详解

被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用. 我们编写控制器代码时,会将保存方法独立成一个控制器也是如此. 1.注释void返回值的方法 1 @Controller 2 public class HelloModelController { 3 4 @ModelAttribute 5 public void populateModel(@RequestParam String ab

Spring MVC 常用注解@Controller,@RequestMapping,Model和ModelAndView

[email protected] 用于指示Spring类的实例是一个控制器.Controller接口的实现类只能处理一个单一请求动作,而@Controller注解的控制器可以支持同时处理多个请求动作,更加灵活.Spring使用扫描机制查找应用程序中所有基于注解的控制器类.分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解,而使用@RequestMapping注解的方法才是真正处理请求的处理器.为了保证能找到控制器,需要完成两件事情: 在Spring

[Spring MVC] - @ModelAttribute使用

在Spring MVC里,@ModelAttribute通常使用在Controller方法的参数注解中,用于解释model entity,但同时,也可以放在方法注解里. 如果把@ModelAttribute放在方法的注解上时,代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法. 比如我们有一个Controller:TestController @Controller @RequestMapping(value="test") public c

spring mvc常用注解的说明

最近一段时间学习了springboot,所以熟悉一下mvc中常用的注解,这样可以方便开发 简介: @RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她分成三类进行说明. 1. value, method: value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明): met

spring mvc常用注解总结

1.@RequestMapping@RequestMappingRequestMapping是一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中),可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径.RequestMapping请求路径映射,如果标注在某个controller的类级别上,则表明访问此类路径下的方法都要加上其配置的路径:最常用是标注在方法上,表明哪个具体的方法来接受处理某次请求. @Controller @RequestMapping(val

spring mvc @ResponseStatus 注解 注释返回中文乱码的问题

前言 前文中讲到,使用@ResponseStatus注解,可以修饰一个异常类,在发生异常的时候返回指定的错误码和消息,在返回的 reason中包含中文的时候,就会出现中文乱码的问题 现象 reason中包含中文的时候,前端返回为乱码 /** * 自定义异常类 * * @author Administrator * */ @ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "没有权限") public class TestExce