SpringMVC - @ModelAttribute

本文深入探讨了Spring MVC框架中@ModelAttribute注解的使用方法,包括其在无返回值、有返回值及与@RequestMapping联用时的行为差异。通过具体代码示例,详细解析了@ModelAttribute如何在控制器中处理实体类,以及它如何影响模型数据的传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实体类如下:



public class User {

    private String username;
    private String password;

    public User() {}

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    // TODO 重写toString方法
}

@ModelAttribute无返回值

package com.mzs.article.controller;

import com.mzs.article.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @ModelAttribute(name = "db")
    public void init(@RequestParam(required = false) String id, Model model) {
        User user = new User();
        user.setId("1");
        user.setUsername("tom");
        user.setPassword("123");
        model.addAttribute("user", user);
    }

    @RequestMapping(value = "/test")
    public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "user") User user3) {
        System.out.println(user);
        System.out.println(user2);
        System.out.println(user3);
        User user4 = (User) model.asMap().get("user");
        System.out.println(user4);
        return "success";
    }
}

 结果输出如下:

User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}

可见,@ModelAttribute在参数中,表示从model里寻找并装配成对应的实体类。

而对于无返回值情况下,即使指定了@ModelAttribute的name,也只以model中添加的为准。


@ModelAttribute有返回值 

package com.mzs.article.controller;

import com.mzs.article.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @ModelAttribute
    public User init(@RequestParam(required = false) String id) {
        User user = new User();
        user.setId("1");
        user.setUsername("tom");
        user.setPassword("123");
        return user;
    }

    @RequestMapping(value = "/test")
    public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "user") User user3) {
        System.out.println(user);
        System.out.println(user2);
        System.out.println(user3);
        User user4 = (User) model.asMap().get("user");
        System.out.println(user4);
        return "success";
    }
}

 User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}


@ModelAttribute有返回值 且 指定了name

 

package com.mzs.article.controller;

import com.mzs.article.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @ModelAttribute(name = "db")
    public User init(@RequestParam(required = false) String id) {
        User user = new User();
        user.setId("1");
        user.setUsername("tom");
        user.setPassword("123");
        return user;
    }

    @RequestMapping(value = "/test")
    public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "user") User user3) {
        System.out.println(user);
        System.out.println(user2);
        System.out.println(user3);
        User user4 = (User) model.asMap().get("user");
        System.out.println(user4);
        return "success";
    }
}

User{id='null', username='null', password='null'}
User{id='null', username='null', password='null'}
User{id='null', username='null', password='null'}
User{id='null', username='null', password='null'}

如果有返回值的情况下,以@ModelAttribute指定的name为准。

重新修改下:

package com.mzs.article.controller;

import com.mzs.article.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @ModelAttribute(name = "db")
    public User init(@RequestParam(required = false) String id) {
        User user = new User();
        user.setId("1");
        user.setUsername("tom");
        user.setPassword("123");
        return user;
    }

    @RequestMapping(value = "/test")
    public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "db") User user3) {
        System.out.println(user);
        System.out.println(user2);
        System.out.println(user3);
        User user4 = (User) model.asMap().get("db");
        System.out.println(user4);
        return "success";
    }
}

User{id='null', username='null', password='null'}
User{id='null', username='null', password='null'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
 


@ModelAttribute与@RequestMapping联用

    @ModelAttribute
    @RequestMapping(value = "/test")
    public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "user") User user3) {
        System.out.println(user);
        System.out.println(user2);
        System.out.println(user3);
        User user4 = (User) model.asMap().get("user");
        System.out.println(user4);
        return "success";
    }

 结果是404:

<h1>HTTP Status 404 - /WEB-INF/jsp/user/test.jsp</h1> 

可见test被转换成了test.jsp,(是由RequestToViewNameFilter处理的)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值