Как создать JSTL тег с динамическими атрибутами

июня
12
2012
Метки: java jstl tag

Содержание

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

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии