English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Пользовательские теги являются элементами языка JSP, определяемыми пользователем. При включении пользовательского тега в страницу JSP он преобразуется в сервлет, а тег преобразуется в набор операций над Операции объекта, называемого tag handler, то есть те операции, которые вызываются Web контейнером при выполнении сервлета.
JSP тег расширения позволяет создавать новые теги и напрямую вставлять их в страницу JSP. В спецификации JSP 2.0 были введены Simple Tag Handlers для написания этих пользовательских тегов.
Вы можете наследовать класс SimpleTagSupport и переписать метод doTag(), чтобы разработать самый простой пользовательский тег.
Далее мы хотим создать пользовательский тег под названием <ex:Hello>, формат тега таков:
<ex:Hello />
Чтобы создать пользовательский тег JSP, вы сначала должны создать Java-класс для обработки тега. Поэтому давайте создадим класс HelloTag, как показано ниже:
package com.w3codebox; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class HelloTag extends SimpleTagSupport {}} public void doTag() throws JspException, IOException { JspWriter out = getJspContext().getOut(); out.println("Hello Custom Tag!"); } }
Следующий код перезаписывает метод doTag(), в котором используется метод getJspContext() для получения текущего объекта JspContext и передача строки "Hello Custom Tag!" объекту JspWriter.
Компилируйте классы выше, и скопируйте их в каталог CLASSPATH переменной окружения. В конце создайте следующую библиотеку тегов: <Каталог_установки_Tomcat>webapps\ROOT\WEB-INF\custom.tld.
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD</short-name> <tag> <name>Hello</name> <tag-class>com.w3codebox.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
Теперь мы можем использовать тег Hello в файле JSP:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld" %> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello/> </body> </html>
Результат выполнения программы приведен ниже:
Hello Custom Tag!
Вы можете включать содержимое в тег, как в стандартной библиотеке тегов. Например, чтобы включить содержимое в наш пользовательский Hello, формат таков:
<ex:Hello> This is message body </ex:Hello>
Мы можем изменить файл класса обработчика тега, код таков:
package com.w3codebox; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class HelloTag extends SimpleTagSupport {}} StringWriter sw = new StringWriter(); public void doTag() throws 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>Example TLD with Body</short-name> <tag> <name>Hello</name> <tag-class>com.w3codebox.HelloTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
Теперь мы можем использовать измененный тег в JSP, как показано ниже:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld" %> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello> This is message body </ex:Hello> </body> </html>
Результат выполнения программы приведен ниже:
This is message body
Вы можете настроить различные свойства в пользовательских стандартах. Чтобы принимать свойства, класс пользовательской тега должен реализовать метод setter. Пример метода setter в JavaBean таков:
package com.w3codebox; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class HelloTag extends SimpleTagSupport {}} private String message; public void setMessage(String msg) { this.message = msg; } StringWriter sw = new StringWriter(); public void doTag() throws 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>Example TLD with Body</short-name> <tag> <name>Hello</name> <tag-class>com.w3codebox.HelloTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>message</name> </attribute> </tag> </taglib>
Теперь мы можем использовать атрибут message в файлах JSP, например:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld" %> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello message="This is custom tag" /> </body> </html>
Результат вывода примера данных выше:
This is custom tag
Вы также можете включить следующие атрибуты:
Атрибут | Описание |
---|---|
name | Определите имя атрибута. Имя атрибута каждого тега должно быть уникальным. |
required | Укажите, является ли атрибут обязательным или необязательным. Если установлено в false, это необязательное. |
rtexprvalue | Укажите, является ли атрибут действительным при выполнении выражения. |
type | Определите тип Java класса для этого атрибута. По умолчанию указывается String |
description | информационное описание |
fragment | Если объявлен этот атрибут, значение атрибута будет рассмотрено как JspFragment。 |
Следующие примеры показывают, как определить соответствующие атрибуты:
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute> .....
Если вы использовали два атрибута, измените файл TLD, как показано ниже:
..... <attribute> <name>attribute_name1</name> <required>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> .....