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
А в итоге получается некое преобразование этого тега в обыкновенные HTML теги с данными, так?
Да, а потом дизайнер может менять table.vm не дергая при этом программиста.
Программист должен только положить нужные данные в Context и проверить их правильность.
Hi developers!
Кто может показать примеры приложения Velocity
относительно сайтов.
Как в принципе технология? Cобирается ли она развиваться? Bли это просто проба пера - для некоторых частных случаев?
Спасибо!
Поледний релиз Velocity был не так давно - 14 ноября 2005 года. Мне кажется, это говорит о популярности библиотеки. Сайтов, использующих Velocity, я назвать не могу… Это в принципе и отследить-то никак нельзя.
С другой стороны, сейчас Jakarta продвигает еще один свой продукт - Tapestry. Еще не разбирался с ним, но, насколько я понимаю, это что-то напоминающее Struts+Velocity.