Sunday, October 28, 2001

Etiket Yazmak: JSP, JSTL

JSP'nin ve Servlet standartının önemli özelliklerinden biri, programcılara kendi etiketlerini yazmasına izin vermesidir. İsteğe uyarlanmış etiket (custom tag) denilen bu kavramı bir örnek kullanarak açıklayalım.

Mesela, güvenlik hakkındaki yazımızda, salt erişimi sınırlamak için yapılacak değişikliklerden bahsetmiştik. Eğer bu tür bir güvenlik özelliğini geliştirmek istesek, mesela sayfaların bazı bölümlerinin kullanıcıya göre değişik içerik göstermesi gibi, bunu isteğe uyarlanmış etiket ile rahat bir şekilde yapabiliriz.

Örneği devam ettirelim. Etiketin ismi "roldemiyiz" olsun.

Sitemizde her kullanıcının bir rolü (ya da görevi) olduğunu düşünürsek, ki bu kavramı gerçekleştirmek Tomcat alanlar (Realm) ile çok kolaydır, roldemiyiz sorusu, kullanıcının bu rolde olup olmadığına dair sorulan cevaba göre, roldemiyiz etiketinin sarmaladığı HTML ya da JSP kodunu gösterip göstermeme gibi bir kararı sayfa içinde alabilir. Örnek:

<sk:roldemiyiz rol="bakici">
<tr><td>BU SATIRI SADECE BAKICILAR G�REBİLİR</td></tr>
</sk:roldemiyiz>


Bu şekilde bir kullanımın sayfa içerik yaratıcıları açısından ne kadar rahat olduğu şüphe götürmez. Şimdi arka plan programcılık açısından bu etiketin nasıl gerçekleştirildiğine gelelim.

Etiket Kütüphaneleri

Etiket kütüphaneleri (tag library) yaratmak ve kullanmak için, birkaç ayartanım değişikliğini yapmak gerekiyor.


* Etiketi gerçekleştiren Java kodu
* Etiketkutuphanesi.tld gibi bir ad kullanarak, etiket tipini tanıtan bir ayartanım dosyası
* Web.xml seviyesinde kütüphanenin kullanıcı kod tarafından "ithal" edilmesi
* Yeni etiketi kullanan her sayfanın kütüphaneyi "ithal" etmesi

Java Kodu

Roldemiyiz örneği ile devam edersek, bu kod şöyle tanımlanabilir.

package sk;

import java.util.StringTokenizer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class RoldemiyizEtiketi extends TagSupport {
private String rol;

public String getRol() {
return rol;
}

public void setRol(String rol) {
this.rol = rol;
}

public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
if (request.isUserInRole(rol)) {
return EVAL_BODY_INCLUDE;
} else {
return SKIP_BODY;
}
}
}


Kodun yaptığı çok basit. Servlet standartına göre bir JSP sitesine giren her kullanıcının, alanlar kavramı bağlamında kullanıcı ismini ve hangi rolde olduğunu bulmak için request.isUserInRole(rolİsmi) gibi bir işlevi çağırmak yeterli olmaktadır. Etiketin hangi rolü kontrol ettiğini, etikete, sayfa dikte ettiriyor tabii ki. Bu rol ismi, setRol ile etikete önceden iletiliyor. Sonra, kontrol aşamasında istek nesnesi üzerinden o rölde olup olmadığımızı kontrol edebiliyoruz.

TLD dosyası

Bir (ya da birkaç) etiketi dış dünyaya "tanıtan" dosya, TLD dosyasıdır. Bu yazıda, örneğimiz için sk.tld gibi bir dosya ismi kullandık.

Roldemiyiz etiketini de şöyle tanımladık.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>sk</short-name>
<uri>http://www.sk.com</uri>
<description>
SK Icin Etiket Kutuphanesi (taglib)
</description>
<tag>
<name>roldemiyiz</name>
<tag-class>sk.RoldemiyizEtiketi</tag-class>
<attribute>
<name>rol</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>


TLD dosyası, genelde Ant ya da başka bir betik tarafından WEB-INF/tags gibi bir dizin altına gönderilir. Site kodu WAR paketine konulduğu zaman, TLD dosyası da Java kodu ile beraber paketlenmiş olur.

Etiket Kullanımı

Şimdi, kullanıcı kodlara gelelim. Eğer sk.tld kütüphanesinin (ve içindeki roldemiyiz etiketini) kullanmak istiyorsak, web.xml dosyamız şu ibareyi içermelidir.

  <taglib>
<taglib-uri>sk</taglib-uri>
<taglib-location>/WEB-INF/tags/sk.tld</taglib-location>
</taglib>


Ve her sayfa, şu ibareyi ekledikten sonra yeni etiketi rahatça kullanabilir.

<%@ taglib uri="sk" prefix="sk" %>

No comments: