Содержание
Если в предыдущей статье рассказывалось о статических атрибутах для собственных JSTL тегов, то в этой статье речь пойдет о динамических атрибутах.
Динамический атрибут - это атрибут, который может присутствовать в теге JSTL тега, но он явно не объявлен.
Для того чтобы использовать подобные атрибуты, необходимо в описании тега добавить свойство dynamic-attributes со значением true, а класс, обрабатывающий тег, унаследовать от интерфейса javax.servlet.jsp.tagext.DynamicAttributes.
То есть, в итоге тег будет описан следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" 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_1.xsd">
<tlib-version>1.0</tlib-version>
<short-name>seostella</short-name>
<uri>/WEB-INF/dynamicattrTag</uri>
<tag>
<name>dynamicattr</name>
<tag-class>com.seostella.jstl.DynamicAttrTag</tag-class>
<body-content>empty</body-content>
<dynamic-attributes>true</dynamic-attributes>
<info>DynamicAttrTag displayes dynamic attribute values</info>
</tag>
</taglib>
А класс, соответственно:
package com.seostella.jstl;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.DynamicAttributes;
import javax.servlet.jsp.tagext.TagSupport;
public class DynamicAttrTag extends TagSupport implements DynamicAttributes{
private static final long serialVersionUID = 1L;
private Map<String, Object> map = new HashMap<String, Object>();
@Override
public int doStartTag() throws JspException {
try {
StringBuffer buffer = new StringBuffer();
buffer.append( "<ul>" );
for( String name : map.keySet() ){
buffer.append( "<li>" )
.append( name )
.append( " - " )
.append( map.get( name ) )
.append( "</li>" );
}
buffer.append( "</ul>" );
pageContext.getOut().print( buffer.toString() );
} catch(IOException ioException) {
throw new JspException("Error: " + ioException.getMessage());
}
return SKIP_BODY;
}
public void setDynamicAttribute(String uri, String name, Object value)
throws JspException {
map.put(name, value);
}
}
Как видно из примера, в метод setDynamicAttribute() передаются значения всех динамических атрибутов, которые добавляются в свойство map. Затем, в методе doStartTag() будет составлен список из комбинации "Имя Атрибута" - "Значение Атрибута".
Конечно же, Вы можете использовать статические атрибуты вместе с динамическими.
Пример использования тега dynamicattr:
<%@ taglib uri="/WEB-INF/dynamicattrTag.tld" prefix="seostella"%>
<%@ page session="false" pageEncoding="UTF-8"%>
<html>
<head>
<title>DynamicAttrTag</title>
</head>
<body>
<h1>DynamicAttrTag</h1>
<seostella:dynamicattr value1="Value1" value2="Value2" />
</body>
</html>
Скачать проект, демонстрирующий работу этого тега Вы можете по следующей ссылке - Скачать dynamicattrtag.zip
В следующей статье рассмотрим создание тега с использованием тела тега.
< | Как создать JSTL тег с атрибутами | JSTL тег и EVAL_BODY_AGAIN | > |