When you implement BodyTag (by extending BodyTagSupport), you get two more lifecycle methods—setBodyContent() and doInitBody(). You also get one new return value for doStartTag(), EVAL_BODY_BUFFERED. That means there are now three possible return values for doStartTag(), instead of the two you get when you extend TagSupport.
Lifecycle for a tag that implements BodyTag (directly or by extending BodyTagSupport)
A change in the default return value for BodyTagSupport:
New return value, and it’s the default for BodyTagSupport. (Instead of SKIP_BODY, the default for TagSupport.)