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>