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