在Spring表单/控制器中激怒空列表

时间:2016-02-13 17:47:51

标签: java spring spring-mvc thymeleaf

我尝试从表单输入创建对象列表。对象是相同的,但它们的值可能不同,它本质上是一个菜单。

我仍然在接触Spring / Thymeleaf,这为一项简单的任务增加了一定程度的复杂性。

我有一个菜单类,一个简单的POJO,然后有一个列表,这些列表定义为bean本身的数据成员:

    private ArrayList<GuestMenuOptions> guestMenus;

我读了很多帖子,尝试过很多东西,我正在轻轻地把头靠在桌子上。

我有几个错误,其中大部分都告诉我无法找到列表或列表是空的 - 它目前处于稳定状态,无论我尝试什么,列表将不会填充,即使我加载默认值...不幸的是我的调试器已经死了,这没有帮助。

感谢任何帮助。谢谢

EntryController:

    @RequestMapping(method=RequestMethod.GET, value="/")
public String indexPage(Model model) {
    model.addAttribute("childMenuOptions", generateChildMenus());

    //not sure if this is neccesary...
    ArrayList<GuestMenuOptions>guestMenus = new ArrayList<>();
    GuestMenuOptions ad1 = new GuestMenuOptions();
    GuestMenuOptions ad2 = new GuestMenuOptions();
    guestMenus.add(ad1);
    guestMenus.add(ad2);

    GuestContactBean ctb = new GuestContactBean();
    ctb.setGuestMenus(guestMenus);

    model.addAttribute("guestContactBean", ctb);
    model.addAttribute("formBackingBean", new FormBackingBean());
    return "index";
}

形式:

<form modelAttribute="guestBean" class="contact_form" name="rsvp" role="form" th:object="${formBackingBean}" th:action="@{/sendRsvp}" method="post">
                            <div class="row">

 <div class="form-group">
                                                            <select name="ad1Starter" id="starterMealAdult1">
                                                                <option value="!!!">-Starter-</option>
                                                                <option th:field="${guestContactBean.guestMenus[0].starter}" th:each="entry : ${adultMenuOptions.get('starter').entrySet()}" th:value="${entry.key}" th:text="${entry.value}">
                                                                </option>
                                                            </select>
                                                        </div>
<input type="submit"guest name="submit" class="btn default-btn btn-block" value="Send RSVP">

RequestController:

@RequestMapping(value = "/sendRsvp", method = RequestMethod.POST)
public String sendRsvp(@ModelAttribute("guestContactBean") GuestContactBean guestContactBean,
                               @ModelAttribute("guestMenus") ArrayList<GuestMenuOptions>menus,
                               BindingResult result) throws MessagingException {
        smtpMailSender.send(guestContactBean);
        return "thanksMessage";
    }

豆类: FormBacking是POJO,根本不参考菜单。 GuestMenuOptions与初学者,沙漠成员相同 guestContactbean没有太多进展,基本字段添加了GuestMenuOptions列表

 private String numberOfAdults;
private String eventAttending;

private ArrayList<GuestMenuOptions> guestMenus;

public ArrayList<GuestMenuOptions> getGuestMenus() {
    return guestMenus;
}

编辑: 填充工作正常的下拉字段,它被声明为private Map<String, Map<String, String>> adultMenuOptions; private Map<String, Map<String, String>> childMenuOptions; 然后将它们构建在控制器中,这样每个控制器都可以在“启动器”,“主要”和“启动”之下有多个选项。和沙漠&#39;例如:

 starter.put("salmon", "Smoked Salmon");
 starter.put("pate", "Chicken Liver Pate");

然后填充下拉列表的值和文本。

如果我可以保存这个Map的状态并将其传回控制器,那也没关系,但我无法解释为什么然后产生了包装列表的创建。

1 个答案:

答案 0 :(得分:1)

请重新访问http://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html#dropdownlist-selectors。它应该像

一样简单
class Animal {
  int id;
  String name;
}

然后在你的模板中:

<select th:field="*{animalId}">
  <option th:each="animal : ${animals}" 
          th:value="${animal.id}" 
          th:text="${animal.name}">Wireframe</option>
</select>

我认为您的代码遍布整个地方,并且您将菜单选项与菜单项类型混合在一起。