Servlet & JSP – 36 – DynamicAttributes

Merhaba Arkadaslar
Bu bolumde JSP 2.0 ile birlikte desteklenen DynamicAttributes arabirimini inceleyecegiz.
Onceki orneklerde  .tld dosyamizda <attribute> etiketini kullandik. Bu etiket sayesinde SimpleTag ya da Classic Tag’da kullanacagimiz attribute’lerin tanimini/bildirimini gerceklestirdik.

Custom Tag & DynamicAttributes

Peki dinamik bir attribute listesi yapabilir miyiz ? Gereken butun attribute’leri tld dosyamizda tanimlamak zorunda miyiz ? Hayir. Bunun icin DynamicAttributes arabirimini implements etmemiz ve tld dosyamiza kucuk bir etiket eklememiz yeterli olacaktir.

Yeni bir SimpleTag olusturalim ve DynamicAttributes arabirimini implement etsin. DynamicAttributes arabirimi setDynamicAttribute metoduna sahiptir , bu metodu override edecegiz.

    public void setDynamicAttribute( String uri, String localName, Object value ) throws JspException;

Hatirlayacagimiz gibi Tag Handler olarak kullandigimiz siniflarda her attribute’e karsilik olarak bir instace variable ve setter metodu tanimlanmaliydi. Burada da dinamik attribute’leri ekleyebilecegimiz bir Map tanimlamamiz gereklidir.

Ekledigimiz her dynamic attribute icin setDynamicAttribute metodu calisir. Boylelikle biz de Map’e bu dynamic attribute’leri eklemis oluruz.

DynamicAttributeHandler.java

package _16_DynamicAttributes;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.DynamicAttributes;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class DynamicAttributeHandler extends SimpleTagSupport implements DynamicAttributes {

	// dinamik attribute'leri ekleyecegimiz Map
	private Map<String, Object> dynamicAttrs = new HashMap<String, Object>();

	// DynamicAttributes arabirimi setDynamicAttribute metoduna sahiptir.
	@Override
	public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
		// dinamik attribute'leri ekleyecegimiz Map'e attribute'leri name/value
		// cifti seklinde ekleyelim.
		dynamicAttrs.put(localName, value);
	}

	@Override
	public void doTag() throws JspException, IOException {

		PageContext pageContext = (PageContext) getJspContext();
		JspWriter out = pageContext.getOut();

		//dongu icerisinde Map e eklenen elemanlari yazdiralim.
		for (String attr : dynamicAttrs.keySet()) {
			out.print("<p>" + attr + " " + dynamicAttrs.get(attr) + "</p>");
		}

		out.print("doTagFinished");

	}
}

dynamicAttributesTag.tld
tld dosyamizi incelersek tag taniminda ekstra bir etiket goruruz.
<dynamic-attributes>true</dynamic-attributes> dedigimizde dynamic attribute ozelligi aktif hale gelecektir.

<?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/web-
jsptaglibrary_2_0.xsd"
	version="2.0">

	<uri>myDynamicAttributesTagURI</uri>

	<tlib-version>2.0</tlib-version>

	<tag>
		<name>mySimpleTagDynamicAttribute</name>
		<tag-class>_16_DynamicAttributes.DynamicAttributeHandler</tag-class>
		<body-content>scriptless</body-content>
		<dynamic-attributes>true</dynamic-attributes>
	</tag>

</taglib>

dynamicAttributeTag.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ taglib uri="myDynamicAttributesTagURI" prefix="dynamicAttrPrefix"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello DynamicAttributesTag</title>
</head>
<body>

	<h1>Dynamic Attribute Tag</h1>
	<dynamicAttrPrefix:mySimpleTagDynamicAttribute name="Levent"
		surname="Erguder" />


	<dynamicAttrPrefix:mySimpleTagDynamicAttribute city="Istanbul"
		country="Turkey" regional="Asia" />


</body>
</html>

jsp dosyamizi inceleyecek olursak daha once kullandigimiz taglib directive’ini prefix vs ayni sekilde kullaniyoruz.

Burada dikkat edecek olursak tag’i ilk kullandigimizda “name” , “city” attribute’lerini kullandik daha sonrasinda “city” , “country” , “regional” attribute’lerini kullandik.
Bu attribute’lerin hic biri tld dosyasinda tanimlanmadi ! Burada oldugu gibi dinamik olarak attribute’leri kendimiz belirtip kullanabiliyoruz.

DynamicAttributeHandler doTag metodunda basit olarak out.print kullandik , bunun yerine cok daha esnek bir sekilde attribute e gore farkli isler yapabilecegimiz esnek bir yapi kurabiliriz.

  • Dynamic attribute kullanildiginda tld dosyasinda <attribute> de tanimlanabilir.
  • Classic Tag da dynamic attribute kullanabilir.

dynamic attributes tag

Tag Files & DynamicAttributes

Onceki bolumlerde tag file kullanimini inceledik. Tag File <jsp:include> Standard Action’i ya da <c:import> JSTL etiketi gibi calisir. Yani reusable content amaciyla kullanilabilir.

Hatirlayacagimiz gibi tag file da <@attribute .. > directive’ini kullanarak attribute tanimi yapabiliriz. Dynamic attribute yapisini tag file yapisinda da kullanabiliriz

WEB-INF/tags dizini altina tag dosyamiziolusturalim.

dynamicTag.tag
tag dosyamizin dynamic attribute yapisina uygun olmasi icin dynamic-attributes=”dynamicAttrs” attribute’unu eklememiz yeterli olacaktir. Daha sonrasinda dynamic attribute’leri forEach dongusu icerisinde table’da yazdiralim.

<%@ tag body-content="empty" dynamic-attributes="dynamicAttrs" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<table border="1">
	<c:forEach items="${dynamicAttrs}" var="element">
	<tr>
		<td>${element.key}</td>
		<td>${element.value}</td>
	</tr>
	</c:forEach>
</table>

includeDynamicTagFile.jsp
Onceki ornegimizde oldugu gibi Tag File yapisinda da dynamic attribute kullanimi benzer sekilde olacaktir. Burada da tag file ilk kullandigimizda “name” , “surname” daha sonrasinda “city” , “country” , “regional” attribute’lerini kullanabiliriz.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@ taglib prefix="myTag" tagdir="/WEB-INF/tags"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>DynamicAttributes TagFile</title>
</head>
<body>

	<p>Name&Surname </p>

	<myTag:dynamicTag  name="Levent" surname="Erguder"/>
	
	<p>Address </p>

	<myTag:dynamicTag  city="Istanbul" country="Turkey" regional="Asia"/>


</body>
</html>

dynamic tag file

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *