如何将@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
相关产品推荐
相关产品推荐

