Javenue logo

Javenue

Программирование на Java

Информационные технологии

Velocity для создания библиотек тэгов Taglib

Данная статья является продолжением статьи о Velocity Framework.

Taglib – один из подпроектов Apache (ранее Jakarta). Это репозиторий готовых библиотек тэгов (custom tags). Тэги в последствии могут быть использованы при создании JSP-страниц. Преимущество использования таких тегов - отделение отображения веб-приложения от его логики.

В этой статье На конкретном примере я покажу как создавать тэги используя Velocity. Конечно их можно создавать и без этого движка, но при использовании Velocity достигается небывалая гибкость в поддержке тэгов.

Для начала придумаем задание. Пусть нужно создать тэг, отображающий таблицу с именем пользователя и адресом его сайта. В качестве параметра тэга будет выступать необязательный атрибут count для оганичения кол-ва пользователей при выводе. Итак, начнем.

Опишем тэг в файле taglib-conf.tld:

<taglib>
    ...
    <tag>
        <name>table</name>
        <tagclass>info.javenue.Table</tagclass>
        <bodycontent>JSP</bodycontent>
        <attribute>
            <name>count</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

Создадим класс Table, который будет наследоваться от TagSupport (import и обработка ошибок опущены):

public class Table extends TagSupport {
    private String count;
    protected JspWriter writer;

    public Table() {
        count = "";
        super();
    }

    public void setCount(String count) {
        this.count = count;
    }

    public String getCount() {
        return count;
    }

    public int doStartTag() {
        Set set = null;
        writer = pageContext.getOut();
        VelocityContext context = new VelocityContext();
        context.put("count", count);
        context.put("userSet", set); // comment1

        VelocityEngine engine = new VelocityEngine();
        engine.init(props); // comment2
        engine.mergeTemplate("table.vm", context, writer);

        return SKIP_BODY;
    }

    public void release() {
        writer = null;
        super.release();
    }
}

Comment1: Перед этой строкой нужно добавить код, который создает необходимую имплементацию Set (например, HashSet) и заполняет ее необходимым кол-вом пользователей в зависимости от значения переменной count. Класс для пользователей может быть например таким:

public class User {
    private String name;
    private String url;
    
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUrl() {
        return url;
    }
}

Данные про пользователей могут находиться, например, в базе данных.

Comment2: Инстанс класса VelocityEngine после создания нужно проинициализировать. Переменная props содержит свойства, прочитанные из файла velocity.config и является экземпляром класса Properties.

Наконец перейдем к написанию шаблона table.vm на языке VTL:

<h2> 
  #if ($count == "") All 
  #else $count 
  #end 
  users listed
</h2>
<table>
  <th>
    <td>User</td>
    <td>Site</td>
  </th>
  #foreach ($user in $userSet)
  <tr>
    <td>$user.Name</td>
    <td>$user.getUrl()</td>
  </tr>
  #end
</table>

Все, тэг готов.

Чтобы веб-приложение знало о существовании библиотеки тэгов, нужно написать в web.xml следующее:

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

На конкретной JSP-странице библиотека тэгов подключается так:

<%@ taglib uri="taglib-conf.tld&#quot; prefix="tl" %>,

где tl - префикс с которого будут начинаться все тэги из библиотеки

А использовать наш самописный тэг можно следующим образом:

<tl:table count="5" />

Возможно на первый взгляд все описанное выше немного сложновато. На самом деле здесь нет ничего сложного, достаточно небольшой практики. Ну а результат вы сами увидите, жалеть о потраченном времени не придется.

Жду вопросов и комментариев.


Комментариев: 0

  Выйти

  * для публикации комментариев нужно