Search code examples
jsparrayliststruts2ognl

Using <s:iterator> to populate a dynamic arraylist over multiple columns


I am trying to populate an ArrayList over multiple table columns, this was originally done using Scriptlets on our old page but I know that the practice is frowned upon now. And I am having trouble translating it over using struts tags.

I want the table to end up like this,

 Checkbox 1 Name 1   Checkbox 2 Name 2
 Checkbox 3 Name 3   Checkbox 4 Name 4
 etc.... 

This is the original scriptlet code:

<% for (int j=0; j < getDocumentList().length; j++) {
     setPacket(j);
     setStringIndex(Integer.toString(j));
%>
<tr>
    <td><input type="checkbox" name="displayTag<%= getStringIndex() %>"/></td>
    <td class="labelText"><%= getFormName() %></td>
    <%
        j++;
        if (j < getDocumentList().length) {
            setPacket(j);
            setStringIndex(Integer.toString(j));
    %>
    <td><input type="checkbox" name="displayTag<%= getStringIndex() %>"/></td>
    <td class="labelText"><%= getFormName() %></td>
    <%  } %>
</tr>
<% } %>

Edit: Here is the code working in it's final form!

<table width="100%" cellspacing="0" cellpadding="0" border="0">
    <tr>
        <td class="maintain_test_info_table_subholder width5per"><fmt:message key="column.select"/></td>
        <td class="maintain_test_info_table_subholder width40per"><fmt:message key="column.docname"/></td>
        <td class="maintain_test_info_table_subholder width5per"><fmt:message key="column.select"/></td>
        <td class="maintain_test_info_table_subholder width40per"><fmt:message key="column.docname"/></td>
    </tr>
    <s:iterator value="documentsList" var="documentList" status="status">
        <s:if test="#status.index == 0">
            <s:set var="docIndex" value="%{#status.index}" />
        </s:if>
        <s:else>
            <s:set var="docIndex" value="%{#docIndex+1}" />
        </s:else>
        <c:set var="rowClass" value="row_even"/>
        <s:if test="#status.odd == true">
            <c:set var="rowClass" value="row_odd"/>
        </s:if>
        <s:if test="%{#documentListSize > #docIndex}">    
            <tr class="${rowClass}">
                <s:hidden name="%{'documentsList['+#docIndex+'].documentId'}" />            
                <s:hidden name="%{'documentsList['+#docIndex+'].documentName'}" />
                <s:hidden name="%{'documentsList['+#docIndex+'].documentSelected'}" />
                <td class="tablecell_middle width5per" >
                    <input type='checkbox' id='displayTag_${docIndex}' value="${documentsList[docIndex].documentSelected}"/>
                </td>
                <td class="tablecell_middle width40per" id='documentName_${docIndex}'>
                    <c:out value="${documentsList[docIndex].documentName}"/>
                </td>
                <s:set var="docIndex" value="%{#docIndex+1}" />
                <s:if test="%{#documentListSize > #docIndex}">
                    <s:hidden name="%{'documentsList['+#docIndex+'].documentId'}" />            
                    <s:hidden name="%{'documentsList['+#docIndex+'].documentName'}" />
                    <s:hidden name="%{'documentsList['+#docIndex+'].documentSelected'}" />
                    <td class="tablecell_middle width5per" >
                        <input type='checkbox' id='displayTag_${docIndex}' value="${documentsList[docIndex].documentSelected}"/>
                    </td>
                    <td class="tablecell_middle width40per" id='documentName_${docIndex}'>
                        <c:out value="${documentsList[docIndex].documentName}"/>
                    </td>
                </s:if>  
            </tr>
        </s:if>
    </s:iterator>
</table>

Solution

  • You need to set your own variable for the index like this

    <s:set var="stringIndex" value="%{#status.index++}"/>