Проблема реализации пользовательских тегов - PullRequest
0 голосов
/ 31 марта 2010

У меня есть таможенные бирки следующим образом. В теге repeat и heading реализован метод doAfterBody. Оба расширяют класс BodyTagSupport

        <csajsp:repeat reps="5">
                <LI>
                    <csajsp:heading bgColor="BLACK">
                        White on Black Heading
                    </csajsp:heading>
                </LI>
            </csajsp:repeat>

Повтор тега Class

    public void setReps(String repeats) {
              System.out.println("TESTING"+repeats);
                       //sets the reps variable.
    }
    public int doAfterBody() {
              System.out.println("Inside repeate tag"+reps);
            if (reps-- >= 1) {
              BodyContent body = getBodyContent();
              try {
                JspWriter out = body.getEnclosingWriter();
                System.out.println("BODY"+body.getString());
                out.println(body.getString());
                body.clearBody(); // Clear for next evaluation
              } catch(IOException ioe) {
                System.out.println("Error in RepeatTag: " + ioe);
              }
              return(EVAL_BODY_TAG);
            } else {
              return(SKIP_BODY);
            }
          }

Класс заголовка

      public int doAfterBody()
          {
              System.out.println("inside heading tag");
              BodyContent body = getBodyContent();
              System.out.println(body.getString());
                try {
                  JspWriter out = body.getEnclosingWriter();
                  out.print("NEW TEXT");
                } catch(IOException ioe) {
                  System.out.println("Error in FilterTag: " + ioe);
                }
                // SKIP_BODY means I'm done. If I wanted to evaluate
                // and handle the body again, I'd return EVAL_BODY_TAG.
                return(SKIP_BODY);
          }
          public int doEndTag() {
                try {
                  JspWriter out = pageContext.getOut();
                  out.print("NEW TEXT 2");
                } catch(IOException ioe) {
                  System.out.println("Error in HeadingTag: " + ioe);
                }
                return(EVAL_PAGE); // Continue with rest of JSP page
              }

Файл пользовательского тега tld

<taglib>
  <tlibversion>1.0</tlibversion>
   <jspversion>1.1</jspversion>
  <shortname>csajsp</shortname>
  <uri></uri>
  <tag>
    <name>heading</name>
    <tagclass>com.test.tags.HeadingTag</tagclass>
    <bodycontent>JSP</bodycontent>
     <attribute>
      <name>bgColor</name>
      <required>true</required> <!-- bgColor is required -->
    </attribute>
  </tag>
   <tag>
    <name>repeat</name>
    <tagclass>com.test.tags.RepeatTag</tagclass>
    <info>Repeats body the specified number of times.</info>
    <bodycontent>JSP</bodycontent>
    <attribute>
      <name>reps</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

Порядок печати СОП:

  1. Метод установки csajsp: повтор вызывается.
  2. Печатается белым по черному. то есть doAfterBody из csajsp: вызывается тег заголовка.

Я не знаю, почему он не вызывает doAfterBody из csajsp:repeat тега.

Пожалуйста, помогите мне понять это.

1 Ответ

0 голосов
/ 12 июля 2010

Какой класс расширяют ваши теги?

Поведение по умолчанию TagSupport должно возвращать SKIP_BODY, что пропустит обработку тела тега.

Поведение по умолчанию BodyTagSupport - возвращать EVAL_BODY_BUFFERED, что будет обрабатывать тело тега.

Если вы внедряете BodyTag самостоятельно, вам необходимо убедиться, что вы корректно переопределяете doStartTag, чтобы указать, что тело JSP должно быть оценено.

...