JSP – библиотека пользовательских тегов JSTL

ОГЛАВЛЕНИЕ

Пользовательские теги JSP

Пользовательские теги JSP предоставляют стандартный механизм для разделения представления и бизнес-логики на динамической веб-странице, позволяя разработчикам страниц сосредоточиться на представлении, тогда как разработчики приложения программируют серверную часть. Они являются классами Java, реализующими специальные интерфейсы. После того как пользовательский тег разработан и развернут, его действия можно вызывать из HTML с помощью синтаксиса XML. Есть начальный тег и конечный тег. Тег может иметь или не иметь тело.

Пользовательский тег выражается в виде:

<tagLibrary:tagName attribute="value">
       body
</tagLibrary:tagName>

Преимущества пользовательских тегов

Пользовательские теги JSP не предоставляют функций больше, чем скриплеты. Они просто обеспечивают лучшую упаковку, помогая улучшать разделение бизнес-логики и логики представления. Некоторые из преимуществ пользовательского тега таковы:
•    Он может уменьшить или устранить скриплеты в приложениях JSP. Любые необходимые параметры для тега могут быть переданы как атрибуты или как содержимое тела, и поэтому не надо никакого кода Java для инициализации или задания свойств компонента.
•    Он имеет более простой синтаксис. Скриплет пишется на Java, но пользовательский тег может использоваться в HTML-подобном синтаксисе.
•    Он может повысить производительность непрограммистов-разработчиков веб-страниц, позволяя им выполнять задачи, неосуществимые за счет HTML.
•    Он повторно используемый. Он экономит время разработки и тестирования. Скриплет не повторно используемый, если не копировать и не вставлять его.

Реализация пользовательских тегов JSP

Разработка пользовательского тега состоит из нескольких шагов:
1.    Написать класс обработчика тега.
2.    Создать? описатель библиотеки тегов (TLD).
3.    Открыть доступ к файлу TLD и классам обработчика.
4.    Сослаться на библиотеку тегов.
5.    Использовать тег на странице JSP.

Шаг 1. Написать класс обработчика тега

Сначала надо написать класс обработчика тега. Обработчик тега – объект, вызываемый средой выполнения JSP для нахождения значения пользовательского тега во время выполнения страницы JSP, ссылающейся на тег. Методы обработчика тега вызываются классом реализации в разные момента во время нахождения значения тега. Все теги должны реализовывать интерфейс Tag. В данном случае не надо добавлять содержимое тела в TodayTag, так как он лишь отображает текущую дату в заданном пользователем формате. Класс обработчика будет реализовывать интерфейс Tag (обычно путем расширения класса TagSupport). Если бы создавался тег, умеющий обрабатывать содержимое тела, надо бы было реализовать интерфейс BodyTag (обычно путем расширения класса BodyTagSupport).

package jstl;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

public class TodayTag extends TagSupport{
    private String mFormat;
   
    public void setFormat(String pFormat) {
        mFormat = pFormat;
    }
   
   
    public int doStartTag() throws JspException {
        try {
            JspWriter out = pageContext.getOut();
            Date today = new Date();
            SimpleDateFormat dateFormatter = new SimpleDateFormat(mFormat);
            out.print(dateFormatter.format(today));
           
        } catch(IOException ioe) {
            throw new JspException("Error: " + ioe.getMessage());
        }      
        return SKIP_BODY;
    }
   
   
    public int doEndTag() throws JspException {
        return SKIP_PAGE;
    }
}

Шаг 2. Создать описатель библиотеки тегов (TLD)

Следующий шаг – определить библиотеку, которая будет содержать соответствия между пользовательским тегом и классом Java (или классами), обрабатывающим его. Эта библиотека определяется в документе XML, именуемом описателем библиотеки тегов (TLD). TLD будет вызываться для примеров пользовательских тегов, customTag.tld.

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
  <tlib-version>1.0</tlib-version>
    <short-name>ct</short-name>
    <uri>/WEB-INF/customTag</uri>
    <tag>
        <name>today</name>
        <tag-class>jstl.TodayTag</tag-class>
        <body-content>empty</body-content>
        <info>Этот тег отображает текущую дату сервера в заданном пользователем формате</info>
        <attribute>
            <name>format</name>
            <required>true</required>
            <description>Provide a display format</description>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
    </tag>
</taglib>

Вся основная информация содержится в теге Tag, где сопоставлены имя тега и класс обработчика. В более сложных случаях можно использовать дополнительные теги XML, чтобы предоставить больше информации о библиотеке и о тегах. Также обычно несколько тегов определяются внутри одной библиотеки.

Шаг 3. Открыть доступ к файлу TLD и классам обработчика

Третий шаг – открыть веб-приложению доступ к классу или классам и TLD. Есть два способа сделать это. Можно упаковать классы и TLD вместе в файл JAR и затем хранить файл JAR в каталоге lib веб-приложения, или можно свободно поместить файлы класса в подкаталог classes и поместить файл TLD куда-то под каталог WEB-INF веб-приложения.

Шаг 4. Сослаться на библиотеку тегов

Четвертый шаг – сделать класс или классы и TLD доступными для веб-приложения. Чтобы использовать тег, надо сослаться на него, что можно сделать тремя способами:
1.    Сослаться на описатель библиотеки тегов неупакованной библиотеки тегов. Например:
<%@ taglib uri="/WEB-INF/customTag.tld" prefix="ct" %>
2.    Сослаться на файл JAR, содержащий библиотеку тегов. Например:
<%@ taglib uri="/WEB-INF/lib/customTag.jar" prefix="ct" %>
3.    Определить ссылку на описатель библиотеки тегов из описателя веб-приложения (web.xml) и определить короткое имя, чтобы ссылаться на библиотеку тегов из JSP.

<taglib>
    <taglib-uri>customTag</taglib-uri>  
    <taglib-location>/WEB-INF/customTag.tld</taglib-location>     
</taglib>

Далее добавляем объявление JSP в любую страницу, которой надо использовать библиотеку пользовательских тегов:
<%@ taglib uri="customTag" prefix="ct" %>

Шаг 5. Использовать тег на странице JSP

Теперь используем пользовательский тег на странице JSP.

<%@ taglib uri="/WEB-INF/customTag.tld" prefix="ct" %>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">

<html>
  <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Сегодня - пользовательский тег JSTL</title>
  </head>
  <body>
        <h2 align="center"><ct:today format="MMMM dd, yyyy"/></h2>
  </body>
</html>

Результаты должны выглядеть наподобие рисунка, показанного ниже: