Spring MVC / JSP - 如何从选择表单

时间:2016-07-22 04:24:10

标签: java spring jsp spring-mvc

我在JSP中使用Spring MVC。

我有一个User实体,其中包含一个Group实体列表。关系是多对多(组实体包含用户实体列表)。

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

@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是错误的,所以如果有人能指出我正确的方向会很棒。任何有关改进的建议都会很好,因为我这样做是为了学习练习。感谢。

1 个答案:

答案 0 :(得分:0)

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

在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迭代可用组并为每个组创建一个option元素。选择属性是:
path - 使用值'groups'映射到视图模型中的用户实体的getGroups getter方法(modelAndView.addObject(“users”,users);)。 items - 是系统中所有可用组的列表。这是在控制器的模型中设置的。请参阅下面的说明。 itemValue - 将成为select的选项值的值。 'id'映射到当前组的getId getter方法。 itemLabel - 将成为select的选项的可见标签的值。 'name'映射到当前组的getName getter方法。 表单:如果用户设置了选项,则选择也会将选项标记为已选中。

这是一个示例输出,其中组是1,2,3,4(id和name),用户有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);
}