I have the following problem with checkbox arrays. I would
really appreciate clues on what is the best workaround.

The situation is this:
- I have a data entry page flow with multiple pages
  entering data into a form bean stored on the session
  (all the actions share the same form bean).
- Several pages contain checkboxes so I have to reset
  their corresponding form properties in an overridden
  ActionForm.reset() method.
- Some of these checkboxes appear on the first page only
  and causes a problem as the form will reset their
  properties when navigating to the second page, but they
  will not be repopulated as they don't have a control on
  this page and therefore will remain cleared.

For simple checkboxes I just put a corresponding
<html:hidden> field on the pages that shouldn't render that
particular checkbox. The hidden field makes sure the
checkbox's value is posted through to the action and thus
repopulated into the form.

But, for array checkboxes created with <html:multibox> I
don't succeed with this solution. The solution with the
hidden field I used for simple checkboxes will only hold
one value, and thus will only keep one of potentially many
selections in the checkbox array.

How should this best be solved?
At the moment I have implemented a workaround that will only
reset the checkbox array when populating from a page that
actually contains the corresponding checkboxes. I do this by
adding a hidden "flag" field that signals that the page
contains the checkboxes and I can later use this as a
conditional in the reset method:

page1.jsp
        <input type="hidden" name="hasPersonCheckboxes">
        <c:forEach items="${personList}" var="person">
                <html:multibox property="personIds">
                        <c:out value="${person.id}"/>
                </html:multibox>
                <c:out value="${person.name}"/>
        </c:forEach>

MyActionForm.java:
        public void reset(
                ActionMapping mapping,
                HttpServletRequest request)
        {
                if ( request.getParameter("hasPersonCheckboxes") != null )
                        personIds = new Long[0];
        }

This way, if page2.jsp doesn't contain a hasPersonCheckboxes
field, the personIds attribute will not be cleared when
navigating to this page and will retain its value (given
that the form bean scope remains on the session).

But, there may be a better and cleaner solution?
(Sometimes I wish that Struts would include support for
handling all this checkbox reset stuff. F ex, each rendering
of Struts' checkbox or multibox tags could make additions to
some Struts managed hidden field that records what checkboxes
are placed in the form, and could use this for automagically
clearing the appropriate properties.)

Mike


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to