Search code examples
javajsficefacesjspx

"for" cycle in JSF


I simply need to perform a very basic for cycle in JSF/ICEFaces, basically rendering column numbers

Something like the following pseudo-code

for(int i=0; i<max; i++)
{
   <td>#{i}</td>
}

the <c:forEach> tag iterates over collections, but I don't want to make my backing bean more complex returning a stupid collection of integers.

Do you know a shorter and smarter way?

Thank you


Solution

  • The <ui:repeat> tag is what you should really use. The JSTL tags operate outside of the JSF Lifecycle. Cay Horstman has a JSF coursewhich discusses this fact: ui:repeat and Handling Variable-Length Data.

    There are a couple of solutions below which demonstrate some flexibility. You could do something like this:

    <ui:param name="max" value="5"/>
    <ui:repeat var="i" value="#{indexBean.values}" size="#{max}" >
     <tr><td>#{i}</td></tr>
    </ui:repeat>
    

    The maximum number of rows is determined by a a <ui:parameter> named max. This is not required, but does demonstrate flexibility. Alternatively you could use something like:

    <ui:param name="max" value="5"/>
    <ui:repeat var="i" value="#{indexBean.rowNumbers(max)}">
     <tr><td>#{i}</td></tr>
    </ui:repeat>
    

    The backing bean code is the following:

    @ManagedBean
    public class IndexBean {
    
    public List<Integer> getValues() {
        List<Integer> values = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
            values.add(i);
        }
        return values;
    }
    
    public List<Integer> rowNumbers(final int max) {
        List<Integer> values = new ArrayList<Integer>();
        for (int i = 0; i < max; i++) {
            values.add(i);
        }
        return values;
    }
    }