Недавно я решил получить некоторые знания о написании пользовательских тегов.И есть проблема.
В моем веб-приложении я использую несколько тегов JSTL, и на каждой странице JSP у меня есть идентичный фрагмент кода:
<c:if test="${sessionScope.locale == 'locale_ru_RU' or empty sessionScope.locale}" >
<fmt:setBundle basename="locale_ru_RU" />
</c:if>
<c:if test="${sessionScope.locale == 'locale_en_US'}">
<fmt:setBundle basename="locale_en_US" />
</c:if>
Как вы можете видеть эту конструкциюустанавливает правильный пакет ресурсов.
Поэтому я хотел бы знать, есть ли возможность обернуть этот кусок кода и использовать вместо него один тег (я знаю, что есть другой способ - просто поместите этот код вотдельную страницу JSP и используйте директиву <% @ include%>, но я хотел бы попробовать тег)?
Как я понимаю, мне нужно каким-то образом установить содержимое тела (внутри класса тега, а не из JSP) исделать контейнер для его выполнения, но я не могу найти никаких примеров об этом.
Что я получил сейчас:
tld:
<?xml version="1.0" encoding="UTF-8"?>
<taglib 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
http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<tag>
<name>setLocale</name>
<tag-class>com.test.tags.LocaleBundleTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
и мой тег:
public class LocaleBundleTag extends BodyTagSupport {
@Override
public void setBodyContent(BodyContent b) {
try {
b.clear();
b.append("<c:if test=\"${sessionScope.locale == 'locale_ru_RU' or empty sessionScope.locale}\" >");
b.append("<fmt:setBundle basename=\"locale_ru_RU\" />");
b.append("</c:if>");
b.append("<c:if test=\"${sessionScope.locale == 'locale_en_US'}\">");
b.append("<fmt:setBundle basename=\"locale_en_US\" />");
b.append("</c:if>");
} catch (IOException e) {
}
super.setBodyContent(b);
}
}
Он компилируется, но ничего не делает правильно.