Java 如何将列表对象设置为跨表单建模(<;表单:输入>;标记)
我有一些网络应用程序。 下面是代码片段 实体:菜单、菜肴 ==========================================================================Java 如何将列表对象设置为跨表单建模(<;表单:输入>;标记),java,spring,spring-mvc,jsp,jsp-tags,Java,Spring,Spring Mvc,Jsp,Jsp Tags,我有一些网络应用程序。 下面是代码片段 实体:菜单、菜肴 ========================================================================== @Entity @Table(name = "dishes") public class Dish { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") pr
@Entity
@Table(name = "dishes")
public class Dish {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "description")
private String description;
@Column(name = "price")
private double price;
@ManyToOne(cascade = {
CascadeType.DETACH, CascadeType.MERGE,
CascadeType.PERSIST, CascadeType.REFRESH
})
@JoinColumn(name = "menu_id")
private Menu menu;
public Dish() {
}
public Dish(String description, double price, Menu menu) {
this.description = description;
this.price = price;
this.menu = menu;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Menu getMenu() {
return menu;
}
public void setMenu(Menu menu) {
this.menu = menu;
}
@Override
public String toString() {
return "Dish{" +
"id=" + id +
", description='" + description + '\'' +
", price=" + price +
", menu=" + menu +
'}';
}
}
控制器
==========================================================================
JSP页面
添加菜单
添加菜单
姓名:
日期:
列出菜品:
Dish#${status.index}
总成本:
==========================================================================
@Entity
@Table(name = "dishes")
public class Dish {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "description")
private String description;
@Column(name = "price")
private double price;
@ManyToOne(cascade = {
CascadeType.DETACH, CascadeType.MERGE,
CascadeType.PERSIST, CascadeType.REFRESH
})
@JoinColumn(name = "menu_id")
private Menu menu;
public Dish() {
}
public Dish(String description, double price, Menu menu) {
this.description = description;
this.price = price;
this.menu = menu;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Menu getMenu() {
return menu;
}
public void setMenu(Menu menu) {
this.menu = menu;
}
@Override
public String toString() {
return "Dish{" +
"id=" + id +
", description='" + description + '\'' +
", price=" + price +
", menu=" + menu +
'}';
}
}
问题:我想在表单上更新或添加菜单以及菜肴列表。如何直接在表单中为实体菜单设置盘的集合?当我尝试提交表单时,字段总是空的。我无法理解菜单类的哪个setter以这种方式调用此字段。谢谢你的帮助 你能分享你所有的代码和完整的stacktrace吗?@Aris_Kortex,我分享了实体和jsp的代码。stacktrace呢:没有任何例外。@Aris_Kortex的可能副本也是同样的问题,但没有任何答案。请共享您的所有代码和完整的stacktrace?@Aris_Kortex,我共享了实体和jsp的代码。stacktrace呢:没有任何例外。@Aris_Kortex的可能重复是同一个问题,但没有任何答案
@Controller
@RequestMapping("/menu")
public class MenuController {
private MenuService menuService;
@Autowired
public void setMenuService(MenuService menuService) {
this.menuService = menuService;
}
@PostMapping("/save")
public String addMenu(@ModelAttribute("menu") Menu menu) {
//menu.getDishes(); always empty
menuService.saveMenu(menu);
return "redirect:/someUrl";
}
@GetMapping("/update")
public String updateMenu(@RequestParam("menuId") int menuId, Model model) {
Menu menu = menuService.getMenu(menuId);
model.addAttribute("menu", menu);
model.addAttribute("restaurantId", menu.getRestaurant().getId());
return "menu-form";
}
<!doctype html>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<html>
<head>
<title>
Add Menu
</title>
</head>
<body>
<h3>Add Menu</h3>
<hr>
<c:url var="save" value="/menu/save">
<c:param name="restId" value="${restaurantId}"/>
</c:url>
<form:form action="${save}" method="post" modelAttribute="menu">
<form:hidden path="id"/>
<table>
<tbody>
<tr>
<td>Name:</td>
<td><form:input path="name"/></td>
</tr>
<tr>
<td>Date:</td>
<td><form:input type="date" path="date"/></td>
</tr>
<tr>
<td><h4>List dishes:</h4></td>
</tr>
<c:forEach items="${menu.dishesAsList}" varStatus="status" var="dish">
<c:url var="deleteLink" value="/dish/delete">
<c:param name="menuId" value="${menu.id}"/>
<c:param name="dishId" value="${dish.id}"/>
</c:url>
<form:hidden path="dishes[${status.index}].id" value="${dish.id}"/>
<tr>
<td>Dish #${status.index}</td>
<td><form:input path="dishes[${status.index}].description" value="${dish.description}"/></td>
<td><a href="${deleteLink}">Delete</a></td>
</tr>
</c:forEach>
<c:url var="showFormLink" value="/dish/showFormForAdd">
<c:param name="menuId" value="${menu.id}"/>
</c:url>
<tr>
<td></td>
<td><a href="${showFormLink}">Add new dish</a></td>
</tr>
<tr>
<td><input type="submit" value="Save" class="save"/></td>
</tr>
</tbody>
</table>
</form:form>
<hr>
<p>Total cost: </p>
<p><a href="${pageContext.request.contextPath}/restaurant/${restaurantId}/menus">Back to restaurant list</a></p>
</body>
</html>