Gymterview
junior

Приведите пример использования собственных тегов

Практический пример: тег для форматирования числа по шаблону (функциональность, отсутствующая в стандартном JSTL).

Полный пример: TLD + Tag Handler + JSP

TLD-файл /WEB-INF/exampleTag.tld:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee">
    <tlib-version>1.0</tlib-version>
    <short-name>example</short-name>
    <uri>/WEB-INF/exampleTag</uri>
    <tag>
        <name>formatNumber</name>
        <tag-class>xyz.company.FormatNumberTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>number</name>
            <required>true</required>
        </attribute>
        <attribute>
            <name>format</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>

Tag Handler xyz.company.FormatNumberTag.java:

public class FormatNumberTag extends TagSupport {
    private String number;
    private String format;

    // setters для атрибутов
    public void setNumber(String number) { this.number = number; }
    public void setFormat(String format) { this.format = format; }

    @Override
    public int doStartTag() throws JspException {
        try {
            DecimalFormat df = new DecimalFormat(format);
            double val = Double.parseDouble(number);
            pageContext.getOut().print(df.format(val));
        } catch (IOException e) {
            throw new JspException(e);
        }
        return SKIP_BODY;
    }
}

JSP-страница:

<%@ taglib uri="/WEB-INF/exampleTag.tld" prefix="my" %>
<my:formatNumber number="123456.789" format="#,###.00"/>
<!-- Результат: 123,456.79 -->

Пользовательские теги с входными параметрами позволяют создавать переиспользуемые компоненты с декларативным интерфейсом. Атрибуты тега объявляются в TLD и маппятся на setter-методы Tag Handler.

На собеседовании: достаточно описать структуру (TLD + Handler + JSP) и привести простой пример с атрибутами. Не обязательно помнить точный XML-синтаксис TLD.