code: @Override
      public int doStartTag() throws JspException {
  
          this.bodyContent = null;  // clean-up body (just in case container is pooling tag handlers)
  
          // output value if not null
          output = evalValue();
          if (output != null) {
              return SKIP_BODY;
          }
  
          // output default if supplied
          output = evalDefault();
          if (output != null) {
              return SKIP_BODY;
          }
  
          // output body as default
          output = ""; // need to reset as doAfterBody will not be called with an empty tag
          // TODO: to avoid buffering, can we wrap out in a filter that performs escaping and use EVAL_BODY_INCLUDE?
          return EVAL_BODY_BUFFERED;
      }
docs: Tag logic