I'm working with indexed properties (using struts and java/jsp). We have a dynamic table that can add/delete rows/items in the table. The adding of rows works as intended - I see the new rows in the form in the action class. The deleted rows do not get set (obviously), but they are also not removed from the list. I have implemented a void setItem(List), void setItem(index), Item getItem(index) and List getItem() methods. I can't find much information regarding the behavior of indexed properties. Is there a reset method that I need to implement, or are indexed properties supposed to take care of setting a new list? From what I can tell, only the items still in the list are set, and they're set using the void setItem(Item) method.
+1
A:
- Make sure your form is request scoped, not session scoped
- Use a LazyList.
For example:
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();
}
};
Then you can display/edit the list in your JSP like so:
<c:forEach items="${profileForm.contactsList}" var="contact" varStatus="contactSta">
<html:hidden styleClass="contact-id" property="contactsList[${contactSta.index}].id"/>
</c:forEach>
If you want to add elements to the list, make sure you set an index superior than the maximum one. For example if my list contains 3 elements, the new one (the fourth) will look like this: (remember that list are zero-index based)
<input style="hidden" styleClass="contact-id" property="contactsList[3].id"/>
When the form is submitted, any list element deleted will set a null at the specific index. For example, let's say the user deletes the 2nd elements, I will see on the server:
contactsList.get(1) == null;//remember that list are zero-index based
Thierry-Dimitri Roy
2010-08-31 17:11:24