Главная » Java, Web » Создание JSP-ярлыков

0

Для того чтобы создать свой собственный новый JSP-ярлык, необходимо создать обработчик для этого ярлыка, то есть Java-ютассы, в которых будут описаны методы обработки содержимого, приводимого в ярлыке на JSP- странице. Полезно также создать подсказку для данного ярлыка. После того как классы обработки ярлыка созданы, нужно объявить ярлык, то есть сделать его "видимым" в библиотеке ярлыков.

Классы обработки ярлыка

Обработчик ярлыка — это объект, при помощи которого происходит обработка содержимого элемента, описанного при помощи JSP-ярлыка при анализе JSP- страницы сервером, которая осуществляется в соответствии со ссылками, заданными в библиотеке ярлыков. Обработчик ярлыка должен имплементиро- вать интерфейс Tag (пакет javax.servlet. jsp.tagext) либо BodyTag (из того же пакета). Эти пакеты позволяют использовать уже существующие объекты Java и делать их обработчиками JSP-ярлыков. Для создания новых (еще не существующих) обработчиков ярлыков следует использовать классы TagSupport И BodyTagSupport пакета javax.servlet.jsp.tagext.

Когда на JSP-странице встречается созданный нами ярлык, сервлет, обрабатывающий эту страницу, вызывает методы, инициализирующие соответсвую- щий ярлыку обработчик, а затем вызывает метод dostartTag обработчика ярлыка. Как только появляется закрывающий ярлык, сервлет вызывает метод doEndTag. В ходе выполнения программы могут быть вызваны другие методы, в зависимости от того, что содержится в элементе, описанном ярлыком, и как построен обработчик данного ярлыка. В процессе создания обработчика ярлыка необходимо имплементировать методы, которые приведены в табл. 3.1. Эти методы часто оказываются полезными при работе с ярлыками.

Обработчик ярлыка содержит возможности, которые позволяют ему осуществлять связь с JSP-страницей. Для этого существует класс PageContext пакета javax.servlet.jsp. Этот класс помогает получить все объекты, доступные из JSP-страницы. Объекты могут иметь атрибуты, которые обладают именами. Имена можно задать и получить при помощи методов setAttributes и getAttributes. Если элемент, описанный при помощи родительского ярлыка, содержит дочерний элемент, то обработчик дочернего ярлыка имеет доступ к обработчику родительского ярлыка.

Таблица 3.1. Методы обработчиков ярлыка


Тип обработчика ярлыка

Методы

Simple — простой

doStartTag, doEndTag, release

Attributes — атрибуты

doStartTag, doEndTag, set/get Attributel…N,

 

release

Таблица 3.1 (окончание)

 

Тип обработчика ярлыка

Методы

 

Body, evaluation and no interac

doStartTag, doEndTag, release

 

tion — тело ярлыка, не взаимо

 

 

действующий с телом

 

 

Body, iterative evaluation — тело

doStartTag, doAfterBody, doEndTag, release

 

ярлыка с итерацией

 

 

Body, interaction — тело, взаимо

doStartTag, doEndTag, release, doInitBody,

 

действующий с телом

doAfterBody, release

 

Далее в этой главе будут подробно рассмотрены приведенные в таблице типы обработчиков.

Описатель ярлыка

Описатель ярлыка (TLD — Tag Library Descriptor) представляет собой XML- документ, в котором приведено описание связанной с данным ярлыком библиотеки. Точнее, описатель содержит не описание ярлыка как такового, а описание всей библиотеки в целом, а также описания отдельных ярлыков, содержащихся в библиотеке. Описатель ярлыка в узком смысле — это описание данного конкретного ярлыка внутри XML-документа, внутри описателя библиотеки, к которой относится данный ярлык. Имена файлов описателей библиотек имеют расширение tld. В серверах фирмы Sun файлы tld хранятся в каталоге WEB-INF и в его подкаталогах, TLD-файл может быть упакован в архив WAR (Web ARchive). Файл TLD должен начинаться со стандартной строки описания версии XML и ссылки на файл DTD описания типа документа:

<?xml version="1.0" encoding="ISO-8859-l" ?>

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

"http://j ava.sun.com/dtd/web-j sptaglibrary_l_2.dtd">

Основным элементом, который содержится в файле TLD, является элемент taglib. Этот элемент содержит дочерние элементы, список которых приведен в табл. 3.2.

Таблица 3.2. Элементы, дочерние для элемента taglib


Элемент

Описание

 

tlib-version

номер версии библиотеки

 

j sp-version

номер версии спецификации JSP

 

 

Таблица 3.2 (окончание)

Элемент

Описание

Short-name

необязательное имя

Uri

адрес библиотеки URI

Display-name

необязательное имя (для отображения)

small-icon

необязательная иконка (маленькая)

Large-icon

необязательная иконка (большая)

Description

необязательное описание ярлыка

Listener

элемент listener

Tag

элемент tag

В качестве примера приведем фрагмент из файла описания библиотеки ярлыков сервера Blazix (листинг 3.19).

Листинг 3.19. Файл описания библиотеки ярлыков сервера Blazix

<?xml version="1.0" encoding="ISO-8859-l" ?>

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "web-j sptaglib_l_l.dtd">

<!— built-in tag library descriptor for the Blazix blx library —>

<!— Copyright (C) Desiderata Software, 2001 —>

<taglib>

<tlibversion>l.l</tlibversion> <j spversion>l.1</j spversion> <shortname>blx</shortname> <info>

Desiderata Softare Blazix Tag Library </info> <tag>

<name>setProperty</name>

<tagclass>desisoft.j sp.tagext.SetPropc/tagclass>

<bodycontent>empty</bodycontent>

<info>

Replacement for jsp:setProperty *, with better handling

of empty strings and exceptions. A function may be named via onError

to handle errors and continue processing. Empty values entered

by users reset the bean elements. (Checkboxes must be specifed in the checkbox property.) Set stringNull to true if empty values should reset string objects to null, false if empty values should reset string objects to the empty string. </info> <attribute> <name>name< / name> <required>true</required> </attribute> <attribute> <name>property</name> <required>true</required> </attribute> <attribute> <name>onError</name> <required>false</required> </attribute> <attribute>

<name>st ringNull</name>

<required>false</required>

</attribute>

<attribute>

<name>checkbox</name>

<required>false</required>

</attribute>

<attribute>

<name>emptylnt</name>

<required>false</required>

</attribute>

</tag>

<tag>

<name>getProperty</name>

<tagclass>desisoft.j sp.tagext.GetPropc/tagclass>

<bodycontent>JSP</bodycontent>

<info>

Inverse of jsp:setProperty *, retrieves data from bean and places in outgoing HTML. Modifies the INPUT, TEXTAREA and SELECT tags to insert values from the bean.

</info>

<attribute>

<name>name< / name>

<required>true</required>

</attribute>

<attribute>

<name>property</name>

<required>false</required>

</attribute>

<attribute>

<name>dateFormat</name> <required>false</required> </attribute> <attribute>

<name>t ime Fo rmat</name>

<required>false</required>

</attribute>

<attribute>

<name>emptylnt</name>

<required>false</required>

</attribute>

</tag>

</taglib>

Полностью файл описания библиотеки ярлыков сервера Blazix входит в комплект поставки, его можно получить с дистрибутивом сервера.

Элемент listener

Описание библиотеки может содержать ссылки на классы, которые рассматриваются в качестве обработчиков событий. Эти классы ожидают наступления тех или иных событий. В TLD-файле такие классы быть описаны внутри элемента listener. Единственный элемент, который содержится внутри элемента listener, является элемент listener-class. Элемент listener-class содержит имя класса обработчика события.

Элемент tag

Каждый ярлык (или тег, tag) в библиотеке ярлыков, описывается путем задания самого ярлыка (имени ярлыка) и указания класса обработчика этого

ярлыка. Кроме этого библиотека содержит информацию об атрибутах ярлыка и переменные сценариев, которые описываются либо внутри TLD, либо в дополнительном классе описания ярлыка. Каждый атрибут содержит информацию о том, является ли данный атрибут обязательным, информацию о типе атрибута, может ли атрибут задаваться в процессе обработки запроса. В табл. 3.3 приведен список элементов, которые могут быть вложены в элемент tag.

Таблица 3.3. Список элементов, вкладываемых в элемент tag

Элемент

Описание

Name

Уникальное имя ярлыка

tag-class

Полное имя класса обработчика ярлыка

tei-class

Необязателен, подкласс от

 

javax.servlet.jsp.tagext.TagExtralnfo

body-content

Тип содержимого ярлыка

Display-name

Необязателен. Отображаемое имя

small-icon

Необязателен. Маленькая иконка для отображения

large-icon

Необязателен. Большая иконка для отображения

Description

Необязателен. Описание ярлыка

Variable

Необязателен. Информация о переменных сценариев

Attribute

Информация об атрибутах ярлыка

Сейчас мы перейдем к рассмотрению элементов, используемых в ярлыках различных типов.

Простые ярлыки — Simple Tags Обработчики ярлыков

Обработчик простых ярлыков должен имплементировать методы doStartTag и doEndTag интерфейса Tag. Метод doStartTag вызывается тогда, когда на JSP-странице встречается соответствующий ярлык. Данный метод возвращает значение skip_body, так как простой ярлык не содержит внутри элемента, описываемого при помощи этого ярлыка, а значит, тело элемента может быть проигнорировано. Метод doEndTag вызывается тогда, когда появляется закрывающий элемент ярлык. Этот метод должен возвращать значение eval_page, при этом оставшаяся JSP-страница будет обработана в обычном порядке. Если то, что осталось на странице после текущего элемента, не требуется обрабатывать, то метод должен возвратить значение skip_page. Например, ярлык

<yarlyk:simple /> может быть связан со следующим обработчиком ярлыка:

public SimpleTag extends TagSupport {

public int doStartTag() throws JspException { try {

pageContext.getOut().print("Privet vsem ot hozyaina."); } catch (Exception ex) {

throw new JspTagException("SimpleTag: " + ex.getMessage());

}

return SKIP_BODY;

}

public int doEndTag() { return EVAL_PAGE;

}

}

Здесь класс SimpleTag содержит два необходимых метода.

Элемент body-content

Элементы, которые не содержат тела элемента, должны быть описаны при помощи ярлыка body-content следующим образом:

<body-content>empty</body-content>

Ярлыки с атрибутами

Описание атрибутов в обработчиках элементов

В соответствии с архитектурой JavaBeans, каждому атрибуту ярлыка должны быть сопоставлены соответствующие методы get и set в обработчике ярлыка, например

<yarlyk:svojstvo parameter="Clear"> может быть сопоставлен следующему обработчику ярлыка:

protected String parameter = null; public String getParameter() { return (this.parameter);

}

public void setParameter(String parameter) {

this.parameter = parameter;

}

Если же атрибут имеет имя id, а обработчик ярлыка основан на классе TagSupport, то нет необходимости описывать свойства и задавать методы, поскольку они уже описаны в TagSupport.

Элемент attribute

Для каждого атрибута ярлыка необходимо указывать, является ли данный атрибут обязательным. Определяется, может ли значение атрибута быть задано в виде выражения, а также (необязательно) задается тип атрибута. Все эти описания вкладываются внутрь элемента attribute. Для статических элементов тип ярлыка всегда указывается в виде j ava.lang.st ring. Если внутри элемента rtexprvalue записано true или yes, то типом, возвращаемым данным элементом, может быть любой доступный тип. Общая структура элемента attribute имеет следующий вид: <attribute>

<name>a t tri</name>

<required>true|false|yes|no</required> <rtexprvalue>true|false|yes|no</rtexprvalue> <type>ncviHoe название типа</Ьуре> </attribute>

Если тот или иной атрибут не является обязательным, то обработчик ярлыка должен предоставлять значение этого атрибута, задаваемое по умолчанию. Например, если для ярлыка yariyk:nechto описано, что атрибут parameter не является обязательным, то можно использовать следующий код:

<tag>

<name>present</name>

<tag-class>classname</tag-class>

<body-content>JSP</body-content>

<attribute> <name>pa ramete r</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute>

</tag>

При описании библиотеки для каждого атрибута ярлыка должны быть указаны разрешенные типы. При обработке страницы JSP будут наложены соответствующие ограничения согласно указанным в описании библиотеки. Атрибуты, передаваемые ярлыку, должны быть также проверены с использованием метода isValid в классе, производном от TagExtralnfo.

Например, пусть ярлык <yarlyk:whatever attrl="valuel"/> содержит в себе атрибут со следующим описанием:

<attribute>

<name>att гl</name> <required>true</required> <rtexprvalue>true</a> </attribute>

Это описание сообщает, что значение атрибута attri может быть задано во время выполнения программы. Метод isValid проверяет, является ли значение атрибута attrl логическим. В приведенном ниже коде производится также проверка того, указал ли пользователь, что будет использовано значение, получаемое в ходе выполнения программы.

public class CLASSNAME extends TagExtralnfo { public boolean isValid(Tagdata data) { Object о = data.getAttribute("attrl"); if (o != null && о != TagData.REQUEST_TIME_VALUE) { if (o.toLowerCase().equals("true") || o.toLowerCaseO.equals("false")) return true; else return false;

}

else return true;

}

}

Источник: Будилов В. А. Интернет-программирование на Java. — СПб.: БХВ-Петербург, 2003. — 704 е.: ил.

По теме:

  • Комментарии