Як створити 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 >

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі