You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将@Embeddable实体映射到JSP视图?类似@Entity用@ModelAttribute的方式

如何在Spring MVC中映射@Embeddable实体到JSP视图并通过@ModelAttribute接收数据

没问题!其实Spring MVC对@Embeddable类型属性的处理和普通实体属性几乎一样,核心是遵循正确的表单字段命名规则,我来一步步给你讲清楚:

1. 补全实体类代码

先帮你补全User实体和对应的@Embeddable类(假设你代码里的St...是Address类):

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String name;
    
    // 用@Embedded标注嵌入属性
    @Embedded
    private Address address;

    // 必须添加无参构造器,以及所有属性的getter/setter方法
    public User() {}

    // 省略getter和setter方法
}

// 嵌入类定义,用@Embeddable标注
@Embeddable
public class Address {
    private String street;
    private String city;
    private String zipCode;

    // 同样需要无参构造器和getter/setter
    public Address() {}

    // 省略getter和setter方法
}

2. JSP视图中绑定嵌入属性的正确方式

在JSP的Spring表单里,你只需要使用属性链的格式来命名表单字段,也就是[ModelAttribute名称].[嵌入属性名].[嵌入类的字段名]。对应你的@ModelAttribute("register"),就是register.address.street这种格式:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form modelAttribute="register" action="${pageContext.request.contextPath}/save" method="POST">
    <!-- 普通User属性的绑定 -->
    <div>
        <label>姓名:</label>
        <form:input path="name" />
    </div>

    <!-- 嵌入Address属性的绑定,使用属性链path="address.xxx" -->
    <div>
        <label>街道:</label>
        <form:input path="address.street" />
    </div>
    <div>
        <label>城市:</label>
        <form:input path="address.city" />
    </div>
    <div>
        <label>邮编:</label>
        <form:input path="address.zipCode" />
    </div>

    <!-- 隐藏ID字段,用于区分新增/更新操作 -->
    <form:hidden path="id" />

    <button type="submit">提交用户信息</button>
</form:form>

3. 控制器的优化建议

你现有的控制器方法其实已经可以直接接收带嵌入属性的User对象了!Spring MVC会自动根据表单字段的属性链,帮你实例化Address对象并填充数据。不过有个小细节要注意:如果你的User对象的address属性初始为null,JSP渲染表单时可能会抛出NullPointerException。所以建议添加一个@ModelAttribute方法提前初始化对象:

@Controller
public class UserController {

    // 提前初始化User和它的Address属性,避免JSP渲染空指针
    @ModelAttribute("register")
    public User initUser() {
        User user = new User();
        user.setAddress(new Address());
        return user;
    }

    @RequestMapping(value="/save", method=RequestMethod.POST)
    public String addUser(@ModelAttribute("register") User user) {
        boolean result = false;
        if(user.getId() == 0){
            result = userService.addUser(user);
        }else{
            userService.updateUser(user);
        }
        System.out.println("result "+result);
        return "redirect:/signup";
    }
}

关键总结

  • 核心规则:在Spring表单标签中用path="嵌入属性名.字段名"的格式绑定@Embeddable属性
  • 提前初始化嵌入属性可以避免JSP页面渲染时的空指针异常
  • 控制器无需额外配置,Spring MVC会自动处理属性链的参数绑定,和普通实体属性完全一致

内容的提问来源于stack exchange,提问作者Krish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:33:31