1

我正在使用索引属性(使用 struts 和 java/jsp)。我们有一个动态表,可以在表中添加/删除行/项目。行的添加按预期工作 - 我在操作类的表单中看到了新行。删除的行没有被设置(显然),但它们也没有从列表中删除。我已经实现了一个 void setItem(List)、void setItem(index)、Item getItem(index) 和 List getItem() 方法。我找不到太多关于索引属性行为的信息。是否有我需要实现的重置方法,或者索引属性应该负责设置新列表?据我所知,仅设置了仍在列表中的项目,并且使用 void setItem(Item) 方法设置了它们。

4

1 回答 1

1
  • 确保您的表单是请求范围的,而不是会话范围的
  • 使用LazyList

例如:

private List<PropertyContact> contactsList = LazyList.decorate(new ArrayList<PropertyContact>(), PropertyContact.PROPERTY_CONTACT_FACTORY);

public static final Factory PROPERTY_CONTACT_FACTORY = new Factory() {
        @Override
        public Object create() {
            return new PropertyContact();
        }
    };

然后您可以像这样在 JSP 中显示/编辑列表:

<c:forEach items="${profileForm.contactsList}" var="contact" varStatus="contactSta">
    <html:hidden styleClass="contact-id" property="contactsList[${contactSta.index}].id"/>
</c:forEach>

如果要向列表中添加元素,请确保设置的索引高于最大值。例如,如果我的列表包含 3 个元素,则新的(第四个)将如下所示:(请记住,列表是基于零索引的)

<input style="hidden" styleClass="contact-id" property="contactsList[3].id"/>

提交表单时,任何删除的列表元素都会在特定索引处设置空值。例如,假设用户删除了第二个元素,我将在服务器上看到:

contactsList.get(1) == null;//remember that list are zero-index based
于 2010-08-31T17:11:24.033 回答