Пользовательские теги — это определяемые пользователем элементы языка JSP. Когда страница JSP содержит пользовательский тег, который преобразуется в сервлет, этот тег преобразуется в операции над объектом, называемым обработчиком тега, который вызывает веб-контейнер при выполнении сервлета.
Расширение тега JSP позволяет создавать новые теги и вставлять их непосредственно на страницу JSP. Простые обработчики тегов были представлены в спецификации JSP 2.0 для написания этих пользовательских тегов.
Вы можете наследовать класс SimpleTagSupport и переопределить метод doTag() для разработки простейшего пользовательского тега.
Далее мы хотим создать собственный тег под названием <ex:Hello> следующего формата:
<ex:Привет />
Чтобы создать пользовательские теги JSP, необходимо сначала создать класс Java, который обрабатывает эти теги. Итак, давайте создадим класс HelloTag следующим образом:
пакет com.tutorialspoint;import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;публичный класс HelloTag расширяет SimpleTagSupport { public void doTag() выдает JspException, IOException { JspWriter out = getJspContext().getOut(); out.println("Привет, пользовательский тег!" }}
Следующий код переписывает метод doTag(), который использует метод getJspContext() для получения текущего объекта JspContext и передает «Hello Custom Tag!» объекту JspWriter.
Скомпилируйте приведенный выше класс и скопируйте его в каталог переменной среды CLASSPATH. Наконец, создайте следующую библиотеку тегов: <каталог установки Tomcat> webappsROOTWEB-INFcustom.tld.
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Пример TLD</short-name> <tag> <name>Привет</name > <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>пусто</body-content> </tag></taglib>
Далее мы можем использовать тег Hello в файле JSP:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Пример пользовательского тега</title> </head> <body> <ex:Hello /> </body></html>
Вывод вышеуказанной программы:
Привет, пользовательский тег!
Вы можете включать содержимое сообщения в теги, как и в стандартной библиотеке тегов. Если мы хотим включить контент в наш настроенный Hello, формат будет следующий:
<ex:Hello> Это тело сообщения</ex:Hello>
Мы можем изменить файл класса обработки меток, код следующий:
пакет com.tutorialspoint;import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;публичный класс HelloTag расширяет SimpleTagSupport { StringWriter sw = new StringWriter(); ) выдает JspException, IOException { getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString() }});
Далее нам нужно изменить файл TLD следующим образом:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Пример TLD с телом</short-name> <tag> <name>Hello< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>без скриптов</body-content> </tag></taglib>
Теперь мы можем использовать измененный тег в JSP, как показано ниже:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Пример пользовательского тега</title> </head> <body> <ex:Hello > Это тело сообщения </ex:Hello> </body></html>
Вывод вышеуказанной программы следующий:
Это тело сообщения
Вы можете устанавливать различные атрибуты в пользовательских стандартах. Чтобы получать атрибуты, класс пользовательского тега значения должен реализовывать метод установки. Метод установки в JavaBean выглядит следующим образом:
пакет com.tutorialspoint;import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.io.*;публичный класс HelloTag расширяет SimpleTagSupport {частное сообщение String; public void setMessage(String msg) { this.message = msg; } StringWriter sw = новый StringWriter () public void doTag(); JspException, IOException { if (message != null) { /* Использовать сообщение из атрибута */ JspWriter out = getJspContext().getOut(); out.println( message } else { /* Использовать сообщение из атрибута тело содержимого */ getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString() } }}
Имя свойства — «message», поэтому метод установки — setMessage(). Теперь давайте добавим этот атрибут в элемент <attribute>, используемый в файле TLD:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Пример TLD с телом</short-name> <tag> <name>Hello< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>без скриптов</body-content> <attribute> <name>message</name> </attribute> </tag></taglib>
Теперь мы можем использовать атрибут сообщения в файле JSP следующим образом:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Пример пользовательского тега</title> </head> <body> <ex:Hello message="Это пользовательский тег" /> </body></html>
Результат вывода данных приведенного выше примера:
Это пользовательский тег
Вы также можете включить следующие атрибуты:
свойство | описывать |
---|---|
имя | Определяет имя атрибута. Имя атрибута должно быть уникальным для каждого тега. |
необходимый | Указывает, является ли атрибут обязательным или необязательным. Если установлено значение false, он является необязательным. |
rtexprvalue | Объявляет, действителен ли атрибут метки при выполнении выражения. |
тип | Тип класса Java, определяющий это свойство. По умолчанию указано как строка |
описание | Описание информации |
фрагмент | Если этот атрибут объявлен, значение атрибута будет рассматриваться как JspFragment . |
Ниже приведен пример указания соответствующих свойств:
..... <атрибут> <имя>имя_атрибута</имя> <обязательный>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute>.. ...
Если вы используете оба атрибута, измените файл TLD следующим образом:
..... <атрибут> <имя>имя_атрибута1</имя> <обязательный>false</required> <type>java.util.Boolean</type> <fragment>false</fragment> </attribute> <attribute > <name>attribute_name2</name> <required>true</required> <type>java.util.Date</type> </attribute>.....