【问题标题】:Spring MVC / JSP - How to pass nested list of object to controller from a select formSpring MVC / JSP - 如何从选择表单将嵌套的对象列表传递给控制器
【发布时间】:2016-07-22 04:24:10
【问题描述】:

我正在使用带有 JSP 的 Spring MVC。

我有一个包含组实体列表的用户实体。这种关系是多对多的(组实体包含用户实体的列表)。

在我的用户控制器中,我有一个方法可以返回带有空用户实体和可用组实体列表的添加用户页面。

@RequestMapping(value = "/add", method = RequestMethod.GET)
public ModelAndView loadUserAdd() {
    ModelAndView mv = new ModelAndView("user/userAdd");
    mv.addObject("user", new User());
    try {
        mv.addObject("groups", gr.listGroups());
    } catch (TestException e) {
        mv.addObject("error", e.getMessage());
        e.printStackTrace();
    }

    return mv;
}

在 userAdd 页面上,我想从可用组列表中选择用户将拥有的组。

<div class="row">
    <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
        <select id="availableGroups" class="form-control" multiple onclick="shuttle('availableGroups', 'selectedGroups')">
            <c:forEach items="${groups}" var="group">
                <option value="${group.id}">${group.id}: ${group.name}</option>
            </c:forEach>
        </select>
    </div>
    <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
        <select id="selectedGroups" class="form-control" multiple onclick="shuttle('selectedGroups', 'availableGroups')">
            <c:forEach var="group" items="${user.groups}" varStatus="status">
                <option value="${group.id}">${group.id}: ${group.name}</option>
            </c:forEach>
        </select>
    </div>
</div>

注意,'shuttle' 函数将组从一个选择元素移动到另一个选择元素。例如。从可用组到选定组,反之亦然。这行得通。

提交时,我希望在用户实体中设置选定的组,以便它到达 addUser 方法。

@RequestMapping(value = "/add", method = RequestMethod.POST)
public ModelAndView addUser(@ModelAttribute("user") User user) {

在提交时,用户实体包含一个空组列表。我确定我的 JSP 是错误的,所以如果有人能指出我正确的方向,那就太好了。任何有关改进的建议都会很好,因为我将其作为学习练习。谢谢。

【问题讨论】:

  • 嗯,还没有对我的问题的反馈 - 这是通常的方法吗?有人想提供替代方案吗?

标签: java spring jsp spring-mvc


【解决方案1】:

一所大学提出了解决这个问题的方法。所提供的解决方案使用单个选择字段,而不是两个选择字段,其中将值从可用值移动到选定值,反之亦然。

在 JSP 中,我只用一个替换了两个选择字段:

<div class="row">
    <div class="col-xs-3 col-sm-3 col-md-3 col-lg-3">
        Groups
    </div>
    <div class="col-xs-9 col-sm-9 col-md-9 col-lg-9">
        <form:select
                path="groups"
                items="${availableGroups}"
                multiple="true"
                itemValue="id"
                itemLabel="name"
                class="form-control" />
    </div>
</div>

这种形式:select 遍历可用组并为每个组创建一个选项元素。选择属性是:
path - 使用值 'groups' 映射到视图模型中用户实体上的 getGroups getter 方法 (modelAndView.addObject("users", users);)。 items - 是系统中所有可用组的列表。这是在控制器的模型中设置的。请参阅下面的说明。 itemValue - 将成为选择的选项值的值。 'id' 映射到当前组的 getId getter 方法。 itemLabel - 将成为选择选项的可见标签的值。 'name' 映射到当前组的 getName getter 方法。 如果用户设置了选项,则 form:select 还会将选项标记为选中。

这是一个示例输出,其中组为 1,2,3,4(在 id 和名称中)并且用户具有组 1,2。

  <div class="col-xs-9 col-sm-9 col-md-9 col-lg-9">
    <select id="groups" name="groups" class="form-control" multiple="multiple">
      <option value="1" selected="selected">1</option>
      <option value="2" selected="selected">2</option>
      <option value="3">3</option>
      <option value="5">4</option>
    </select>
    <input type="hidden" name="_groups" value="1"/>
  </div>

为了使“availableGroups”可用,我使用了:

@ModelAttribute("availableGroups")
public List<Group> initializeGroups() {
    return us.listGroups();
}

这使得可用组列表可用于控制器的每个视图。

在提交时,要使用所选组更新用户(添加或删除组,因为这也适用于编辑),我使用了转换器 (org.springframework.core.convert.converter.Converter)。

@Component
public class GroupConverter implements Converter<String, Group> {
    @Autowired
    GroupService groupService;
    public User convert(String element) {
        User user = null;
        if(element != null) {
            int id = Integer.parseInt(element);
            user = userService.fetchUser(id);
        }
        return user;
    }
}

转换器获取组的 id 并从数据源中获取它,然后在调用控制器之前将其神奇地设置在用户实体中。

转换器在 WebMvcConfigurationSupport 上设置...

@Autowired
GroupConverter groupConverter;

@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addConverter(groupConverter);
}

【讨论】:

    猜你喜欢
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2013-05-31
    • 2012-11-16
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多