Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТАБЛИЦА ТЭГОВ HTML.doc
Скачиваний:
24
Добавлен:
12.05.2015
Размер:
401.41 Кб
Скачать

Тэги внутри Тэгов

Тэги также могут помещаться внутри других тэгов, что дает нам мощную структурную функциональность, а также возможность создавать вывод при условии, когда дочерние тэги вычисляются только при определенных условиях, устанавливаемых в их родительских тэгах. JSTL, Java Standard Tag Libraries, в полной мере использует это, но давайте взглянем на то, как мы можем создать подобный тэг самостоятельно.

Теперь, когда вы чувствуете себя немного более комфортно с исключениями в тэгах с помощью API JSP, нам необходимо только рассмотреть ключевые моменты следующего тэга. Предположим, что вы используете тэг генерации простых чисел, и вы хотите проверить каждое простое число, чтобы убедиться, что это простое число типа "Ферма" и показать его в браузере. Числа Ферма - это такие числа, которые могут быть представлены, как "2 в степени 2 в степени n плюс 1", где n - целое число. Если ваши глаза тускнеют от математических описаний, не беспокойтесь. Достаточно сказать, что некоторые простые числа являются простыми числами Ферма, а другие нет. Фактически, только числа 3, 5, 17, 257, 65537 являются известными простыми числами Ферма.

Так как тэг проверки простых чисел Ферма предназначен, чтобы выполнять проверку каждого числа, сгенерированного тэгом простых чисел, очевидно, что нет смысла, чтобы тэг fermatprimetag существовал вне тэга primenumtag. Это значит, что он должен быть определен, как дочерний тэг, что помешает пользователям библиотеки тэгов, содержащей этот тэг, совершить ошибку и означает, что вы можете сделать определенные допущения. Это можно проиллюстрировать в следующем коде. Вот класс тэга:

public class FermatPrimeTag extends BodyTagSupport {

   public int doStartTag() throws JspException {

      PrimeNumTag parentTag =(PrimeNumTag)findAncestorWithClass(this,

                              PrimeNumTag.class);

      if (parentTag == null) {

         throw new JspException("Tag should be nested in

         \"primenumtag\" Tag");

      }

      return EVAL_BODY_TAG;

   }

  

   public int doAfterBody() throws JspException {

 

      Integer prime =(Integer)pageContext.getAttribute("value");

      String s = bodyContent.getString();

      try

      {

         if (PrimeUtilities.isFermatPrime(prime.intValue())) {

            bodyContent.clearBody();

            bodyContent.println(s + " (is a Fermat Prime Number) ");

         }

         bodyContent.writeOut(bodyContent.getEnclosingWriter());

      } catch(IOException ioe) {

         throw new JspException(ioe.getMessage());

      }

      return SKIP_BODY;  

   }

}

Обратите внимание на метод findAncestorWithClass( ). Он рекурсивно проходит всю иерархию тэгов в поисках родителей до тех пор, пока не найдет того, кто соответствует классу, который вы ищите. Этот метод работает посредством рекурсивного вызова метода getParent( ). Это еще одна часть управления тэгом, которую мы наследуем от класса BodyTagSupport. Если вы не будете наследовать от этого класса, вам необходимо реализовать методы setParent( ) и getParent( ) самостоятельно. Формирователь вызывается контейнером и передает вам ссылку на родительский тэг. Вы должны были бы сохранять эту ссылку для обработки запроса метода getParent( ).

Возможны случаи, когда все это необходимо выполнять самостоятельно, к счастью они бывают редко. Теперь же вы можете быть уверены в мудрости при создании своих собственных тэгов посредством наследования от BodyTagSupport.

Если метод findAncestorWithClass( ) не найдет родительский тэг подходящего типа, будет выброшено исключение, которое появится в окне клиентского браузера. Это скажет пользователю JSP библиотеки, что он использует тэг неправильно.

Другая важная вещь, которую необходимо заметить, это то, что этот тэг вызывает метод getAttribute( ) для объекта pageContext, чтобы получить значение атрибута с именем value. Это тот атрибут, который добавляется в контекст страницы родительским тэгом primenumtag. Мы получаем доступ к нему по той причине, что наш дочерний тэг fermatprimetag и наш родительский тэг primenumtag находятся на одной странице и поэтому разделяют один и тот же объект pageContext. Помните, что вы все еще должны очищать содержимое тела и получать вложенный writer. Реально здесь вы заменяете существующее простое число на строку, отображающую простое число и сообщение, гласящее ".. is a Fermat Prime Number.".

Этот тэг намного проще, чем его родитель по той причине, что ему нет необходимости определять какой-либо механизм цикла. Этот тэг будет трактоваться, как совершенно новый тэг каждый раз, когда родительский тэг будет совершать итерацию, так что метод doAfterBody( ) и другие методы будут вызываться повторно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]