Class StrutsBodyTagSupport

java.lang.Object
jakarta.servlet.jsp.tagext.TagSupport
jakarta.servlet.jsp.tagext.BodyTagSupport
org.apache.struts2.views.jsp.StrutsBodyTagSupport
All Implemented Interfaces:
jakarta.servlet.jsp.tagext.BodyTag, jakarta.servlet.jsp.tagext.IterationTag, jakarta.servlet.jsp.tagext.JspTag, jakarta.servlet.jsp.tagext.Tag, Serializable
Direct Known Subclasses:
ComponentTagSupport, IteratorGeneratorTag, SortIteratorTag, SubsetIteratorTag

public class StrutsBodyTagSupport extends jakarta.servlet.jsp.tagext.BodyTagSupport
Contains common functionalities for Struts JSP Tags.
See Also:
  • Field Summary

    Fields inherited from class jakarta.servlet.jsp.tagext.BodyTagSupport

    bodyContent

    Fields inherited from class jakarta.servlet.jsp.tagext.TagSupport

    id, pageContext

    Fields inherited from interface jakarta.servlet.jsp.tagext.BodyTag

    EVAL_BODY_BUFFERED, EVAL_BODY_TAG

    Fields inherited from interface jakarta.servlet.jsp.tagext.IterationTag

    EVAL_BODY_AGAIN

    Fields inherited from interface jakarta.servlet.jsp.tagext.Tag

    EVAL_BODY_INCLUDE, EVAL_PAGE, SKIP_BODY, SKIP_PAGE
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    protected void
    Provide a mechanism to clear tag state, to handle servlet container JSP tag pooling behaviour with some servers, such as Glassfish.
    int
     
    protected String
     
    protected Object
     
    protected Object
    findValue(String expr, Class<?> toType)
     
    protected String
     
    protected boolean
    Allow descendant tags to check if the tag state should be cleared during doEndTag() processing,
    protected ValueStack
     
    void
    Release state for a Struts JSP Tag handler.
    void
    setPerformClearTagStateForTagPoolingServers(boolean performClearTagStateForTagPoolingServers)
    Request that the tag state be cleared during doEndTag() processing, which may help with certain edge cases with tag logic running on servers that implement JSP Tag Pooling.
    protected String
     

    Methods inherited from class jakarta.servlet.jsp.tagext.BodyTagSupport

    doAfterBody, doInitBody, doStartTag, getBodyContent, getPreviousOut, setBodyContent

    Methods inherited from class jakarta.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 jakarta.servlet.jsp.tagext.Tag

    getParent, setPageContext, setParent
  • Constructor Details

    • StrutsBodyTagSupport

      public StrutsBodyTagSupport()
  • Method Details

    • getStack

      protected ValueStack getStack()
    • findString

      protected String findString(String expr)
    • findValue

      protected Object findValue(String expr)
    • findValue

      protected Object findValue(String expr, Class<?> toType)
    • toString

      protected String toString(Throwable t)
    • getBody

      protected String getBody()
    • doEndTag

      public int doEndTag() throws jakarta.servlet.jsp.JspException
      Specified by:
      doEndTag in interface jakarta.servlet.jsp.tagext.Tag
      Overrides:
      doEndTag in class jakarta.servlet.jsp.tagext.BodyTagSupport
      Throws:
      jakarta.servlet.jsp.JspException
    • release

      public void release()
      Release state for a Struts JSP Tag handler.

      According to the JSP API documentation, the page compiler guarantees that the release() method will be invoked on the Tag handler before releasing it to the GC (garbage collector). It does not specify when the release() call will be made, though, and timing likely depends on the implementation of the JSP/servlet engine being used.

      Specified by:
      release in interface jakarta.servlet.jsp.tagext.Tag
      Overrides:
      release in class jakarta.servlet.jsp.tagext.BodyTagSupport
    • setPerformClearTagStateForTagPoolingServers

      public void setPerformClearTagStateForTagPoolingServers(boolean performClearTagStateForTagPoolingServers)
      Request that the tag state be cleared during 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 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 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.

      Parameters:
      performClearTagStateForTagPoolingServers - true if tag state should be cleared, false otherwise.
    • getPerformClearTagStateForTagPoolingServers

      protected boolean getPerformClearTagStateForTagPoolingServers()
      Allow descendant tags to check if the tag state should be cleared during doEndTag() processing,
      Returns:
      true if tag state should be cleared, false (default) otherwise.
    • clearTagStateForTagPoolingServers

      protected void clearTagStateForTagPoolingServers()
      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 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.