org.apache.struts2.views.jsp.iterator

## Class SubsetIteratorTag

- java.lang.Object
- - javax.servlet.jsp.tagext.TagSupport
  - - javax.servlet.jsp.tagext.BodyTagSupport
    - - org.apache.struts2.views.jsp.StrutsBodyTagSupport
      - - org.apache.struts2.views.jsp.iterator.SubsetIteratorTag

- All Implemented Interfaces:
    Serializable, javax.servlet.jsp.tagext.BodyTag, javax.servlet.jsp.tagext.IterationTag, javax.servlet.jsp.tagext.JspTag, javax.servlet.jsp.tagext.Tag

      public class SubsetIteratorTag
      extends StrutsBodyTagSupport

  NOTE: JSP-TAG

  A tag that takes an iterator and outputs a subset of it. It delegates to `SubsetIteratorFilter` internally to perform the subset functionality.

  - count (Object) - Indicate the number of entries to be in the resulting subset iterator
  - source* (Object) - Indicate the source of which the resulting subset iterator is to be derived base on
  - start (Object) - Indicate the starting index (eg. first entry is 0) of entries in the source to be available as the first entry in the resulting subset iterator
  - decider (Object) - Extension to plug-in a decider to determine if that particular entry is to be included in the resulting subset iterator
  - var (String) - Indicate the pageContext attribute name to store the resultant subset iterator in

       public class MySubsetTagAction extends ActionSupport {
            public String execute() throws Exception {
               l = new ArrayList();
               l.add(new Integer(1));
               l.add(new Integer(2));
               l.add(new Integer(3));
               l.add(new Integer(4));
               l.add(new Integer(5));
               return "done";
            }

            public Integer[] getMyArray() {
               return a;
            }

            public List getMyList() {
               return l;
             }

            public Decider getMyDecider() {
            return new Decider() {
                public boolean decide(Object element) throws Exception {
                    int i = ((Integer)element).intValue();
                    return (((i % 2) == 0)?true:false);
                }
            };
            }
        }

       <!-- s: List basic -->
          <s:subset source="myList">
             <s:iterator>
                <s:property />
             </s:iterator>
          </s:subset>

       <!-- B: List with count -->
          <s:subset source="myList" count="3">
             <s:iterator>
                 <s:property />
             </s:iterator>
           </s:subset>

       <!--  C: List with start -->
            <s:subset source="myList" count="13" start="3">
               <s:iterator>
                 <s:property />
               </s:iterator>
            </s:subset>

       <!--  D: List with var -->
            <s:subset var="mySubset" source="myList" count="13" start="3" />
            <%
                Iterator i = (Iterator) pageContext.getAttribute("mySubset");
                while(i.hasNext()) {
            %>
            <%=i.next() %>
            <%  } %>

        <!--  D: List with Decider -->
            <s:subset source="myList" decider="myDecider">
                   <s:iterator>
                        <s:property />
                   </s:iterator>
            </s:subset>

  @s.tag name="subset" tld-body-content="JSP" description="Takes an iterator and outputs a subset of it"
  See Also:
    Serialized Form

- - ### Field Summary

    - ### Fields inherited from class javax.servlet.jsp.tagext.BodyTagSupport

      `bodyContent`

    - ### Fields inherited from class javax.servlet.jsp.tagext.TagSupport

      `id, pageContext`

    - ### Fields inherited from interface javax.servlet.jsp.tagext.BodyTag

      `EVAL_BODY_BUFFERED, EVAL_BODY_TAG`

    - ### Fields inherited from interface javax.servlet.jsp.tagext.IterationTag

      `EVAL_BODY_AGAIN`

    - ### Fields inherited from interface javax.servlet.jsp.tagext.Tag

      `EVAL_BODY_INCLUDE, EVAL_PAGE, SKIP_BODY, SKIP_PAGE`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `SubsetIteratorTag()`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected void` | `clearTagStateForTagPoolingServers()` Provide a mechanism to clear tag state, to handle servlet container JSP tag pooling behaviour with some servers, such as Glassfish.
    `int` | `doEndTag()`
    `int` | `doStartTag()`
    `void` | `setCount(String count)`
    `void` | `setDecider(String decider)`
    `void` | `setPerformClearTagStateForTagPoolingServers(boolean performClearTagStateForTagPoolingServers)` Request that the tag state be cleared during `StrutsBodyTagSupport.doEndTag()` processing, which may help with certain edge cases with tag logic running on servers that implement JSP Tag Pooling.
    `void` | `setSource(String source)`
    `void` | `setStart(String start)` @s.tagattribute required="false" type="Integer" description="Indicate the starting index (eg.
    `void` | `setVar(String var)`

    - ### Methods inherited from class org.apache.struts2.views.jsp.StrutsBodyTagSupport

      `findString, findValue, findValue, getBody, getPerformClearTagStateForTagPoolingServers, getStack, release, toString`

    - ### Methods inherited from class javax.servlet.jsp.tagext.BodyTagSupport

      `doAfterBody, doInitBody, getBodyContent, getPreviousOut, setBodyContent`

    - ### Methods inherited from class javax.servlet.jsp.tagext.TagSupport

      `findAncestorWithClass, getId, getParent, getValue, getValues, removeValue, setId, setPageContext, setParent, setValue`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface javax.servlet.jsp.tagext.Tag

      `getParent, setPageContext, setParent`

- - ### Constructor Detail

    - #### SubsetIteratorTag

          public SubsetIteratorTag()

  - ### Method Detail

    - #### setCount

          public void setCount(String count)

    - #### setSource

          public void setSource(String source)

    - #### setStart

          public void setStart(String start)

      @s.tagattribute required="false" type="Integer" description="Indicate the starting index (eg. first entry is 0) of entries in the source to be available as the first entry in the resulting subset iterator"
      Parameters:
        `start` - start

    - #### setDecider

          public void setDecider(String decider)

    - #### setVar

          public void setVar(String var)

    - #### setPerformClearTagStateForTagPoolingServers

          public void setPerformClearTagStateForTagPoolingServers(boolean performClearTagStateForTagPoolingServers)

      Description copied from class: `StrutsBodyTagSupport`
      Request that the tag state be cleared during `StrutsBodyTagSupport.doEndTag()` processing, which may help with certain edge cases with tag logic running on servers that implement JSP Tag Pooling. Note: Even though the Tag classes extend this class `StrutsBodyTagSupport`, and this method `StrutsBodyTagSupport.setPerformClearTagStateForTagPoolingServers(boolean)` exists in the method hierarchy, the JSP processing requires us to explicitly override it in every Tag class in order for the Tag handler method to be visible to the JSP processing. Defining a setter in the superclass alone is insufficient (results in "Cannot find a setter method for the attribute").

      See `StrutsBodyTagSupport.clearTagStateForTagPoolingServers()` for additional details. Warning: Setting this value to true may allow for the desired behaviour, but doing so may violate the JSP specification. Set to true at your own risk.

      Overrides:
        `setPerformClearTagStateForTagPoolingServers` in class `StrutsBodyTagSupport`
      Parameters:
        `performClearTagStateForTagPoolingServers` - true if tag state should be cleared, false otherwise.

    - #### doStartTag

          public int doStartTag()
                         throws javax.servlet.jsp.JspException

      Specified by:
        `doStartTag` in interface `javax.servlet.jsp.tagext.Tag`
      Overrides:
        `doStartTag` in class `javax.servlet.jsp.tagext.BodyTagSupport`
      Throws:
        `javax.servlet.jsp.JspException`

    - #### doEndTag

          public int doEndTag()
                       throws javax.servlet.jsp.JspException

      Specified by:
        `doEndTag` in interface `javax.servlet.jsp.tagext.Tag`
      Overrides:
        `doEndTag` in class `StrutsBodyTagSupport`
      Throws:
        `javax.servlet.jsp.JspException`

    - #### clearTagStateForTagPoolingServers

          protected void clearTagStateForTagPoolingServers()

      Description copied from class: `StrutsBodyTagSupport`
      Provide a mechanism to clear tag state, to handle servlet container JSP tag pooling behaviour with some servers, such as Glassfish.

      Usage: Override this method in descendant classes to clear any state that might cause issues should the servlet container re-use a cached instance of the tag object. If the descendant class does not declare any new field members then it should not be strictly necessary to call this method there. Typically that means calling the ancestor's `ComponentTagSupport.clearTagStateForTagPoolingServers()` method first, then resetting instance variables at the current level to their default state.

      Note: If the descendant overrides `StrutsBodyTagSupport.doEndTag()`, and does not call super.doEndTag(), then the descendant should call this method in the descendant doEndTag() method to ensure consistent clearing of tag state.

      Overrides:
        `clearTagStateForTagPoolingServers` in class `StrutsBodyTagSupport`

Copyright © 2000–2026 Apache Software Foundation. All rights reserved.