Зміст
Якщо в попередній статті розповідалося про статичних атрибутах для власних 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 | > |