是AutoPopulatingList
还是Set
?
我想要显示的数据是使用Set
的关联。
public class Employer implements java.io.Serializable {
private Set<Employee> employees = new HashSet();
}
我已尝试使用AutoPopulatingList
,但在这种情况下,我必须在hibernate中使用List
,这需要我使用list-index
指定Employee.employeeId
并且每当我检索{ {1}}到employees
之后,列表在元素(Employee
元素)之间会有空格,具体取决于null
。
我需要自动填充集合,因为我需要在创建Employee.employeeId
时动态生成employees
。
当我使用普通Employer
时,我得到以下内容:
Set
还有其他解决方案吗?
修改
我正在尝试实施动态表单
答案 0 :(得分:4)
您无法在MVC中使用Set
作为绑定目标,因为无法为其项创建属性路径。
构建动态表单时应使用Map<Integer, YourType>
。我们多次实施(所以我知道它有效)是:
1, 3, 4, ...
)maxIndex + 1
索引的表格(总是递增序列)Map
实现必须 LinkedHashMap
实例,以便保留迭代顺序(如果Map
字段需要,Spring默认创建此实现自动填充)Map
必须是某个父表单对象的一部分(即,您不能将Map
作为顶层表单对象),以便Spring能够从属性getter推断泛型类型有很多方法可以解决这个问题。例如,我们有一个特殊的模板子表单,当我们需要动态添加另一个子表单时使用它。这种方法可能要复杂一些:
<form:form action="${formUrl}" method="post" modelAttribute="organizationUsersForm">
<%-- ... other fields ... --%>
<div id="userSubforms">
<c:forEach items="${organizationUsersForm.users.entrySet()}" var="subformEntry">
<div data-subform-key="${subformEntry.key}">
<spring:nestedPath path="users['${subformEntry.key}']">
<%@ include file="user-subform.jspf" %>
</spring:nestedPath>
</div>
</c:forEach>
</div>
<button onclick="addSubform(jQuery('#userSubforms'), 'users', 'user', 'userTemplate');">ADD ANOTHER USER</button>
<%-- other form fields, submit, etc. --%>
</form:form>
<div class="hide" data-subform-template="user">
<spring:nestedPath path="userTemplate">
<%@ include file="user-subform.jspf" %>
</spring:nestedPath>
</div>
<script>
function addSubform(subformContainer, subformPath, templateName, templatePath) {
// Find the sequence number for the new subform
var existingSubforms = subformContainer.find("[data-subform-key]");
var subformIndex = (existingSubforms.length != 0) ?
parseInt(existingSubforms.last().attr("data-subform-key"), 10) + 1 : 0;
// Create new subform based on the template
var subform = jQuery('<div data-subform-key="' + subformIndex + '" />').
append(jQuery("[data-subform-template=" + templateName + "]").children().clone(true));
// Don't forget to update field names, identifiers and label targets
subform.find("[name]").each(function(node) {
this.name = subformPath + "["+ subformIndex +"]." + this.name;
});
subform.find("[for^=" + templatePath + "]").each(function(node) {
this.htmlFor = this.htmlFor.replace(templatePath + ".", subformPath + "["+ subformIndex +"].");
});
subform.find("[id^=" + templatePath + "]").each(function(node) {
this.id = this.id.replace(templatePath + ".", subformPath + "["+ subformIndex +"].");
});
// Add the new subform to the form
subformContainer.append(subform);
}
</script>
现在您可以询问“用户如何删除子表单”?如果子表单JSPF包含:
,这很容易<button onclick="jQuery(this).parents('[data-subform-key]').remove();">DELETE USER</button>
答案 1 :(得分:1)
Set is不是索引集合,您只能绑定索引集合或数组。您可以尝试使用LinkedHashSet(一个具有保证顺序,而HashSet不会)或使用List实现来绑定值。
答案 2 :(得分:0)
“无法获取索引为0的元素”..集合不是基于以...开头的索引。
为什么不使用员工的LazyList .. 正如@PavelHoral所正确指出的那样我们不需要使用LazyList,因为Spring处理它..一个简单的List初始化(如新的ArrayList) ())会做,虽然当用户提交非连续元素时可能有空格(null)。
private List<Employee> employees = new ArrayList<Employee>();