14
March

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

Posted in: Java open-source проекты, Java technologies, J2SE |

Данная статья является продолжением статьи о Velocity Framework.
Taglib – один из подпроектов 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” prefix=“tl” %>,

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

<tl:table count=“5” />

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

4 Comments »

RSS feed for comments on this post. TrackBack URI



January 17, 2006 #

А в итоге получается некое преобразование этого тега в обыкновенные HTML теги с данными, так?

January 17, 2006 #

Да, а потом дизайнер может менять table.vm не дергая при этом программиста.
Программист должен только положить нужные данные в Context и проверить их правильность.

Maxwell
January 30, 2006 #

Hi developers!

Кто может показать примеры приложения Velocity
относительно сайтов.

Как в принципе технология? Cобирается ли она развиваться? Bли это просто проба пера - для некоторых частных случаев?

Спасибо!

January 30, 2006 #

Поледний релиз Velocity был не так давно - 14 ноября 2005 года. Мне кажется, это говорит о популярности библиотеки. Сайтов, использующих Velocity, я назвать не могу… Это в принципе и отследить-то никак нельзя.
С другой стороны, сейчас Jakarta продвигает еще один свой продукт - Tapestry. Еще не разбирался с ним, но, насколько я понимаю, это что-то напоминающее Struts+Velocity.

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>