JSP Custom Tag Library

3,117 views

Published on

Jsp Custom tag library nedir nasıl oluşturulur...

Published in: Technology
  • Be the first to comment

JSP Custom Tag Library

  1. 1. Gökhan Tanışık gokhantanisik @ hotmail .com 30.06.2008
  2. 2. Amaç <ul><li>Custom tag library nedir? </li></ul><ul><li>Niçin kullanılır? </li></ul><ul><li>Kendi kütüphanemizi nasıl oluştururuz? </li></ul><ul><li>Jstl(Jsp standart tag library) nedir, fonksiyonları nelerdir? </li></ul>
  3. 3. İçerik <ul><li>Custom Tag Library nedir? </li></ul><ul><li>Kendi kütüphanemizi oluşturmak </li></ul><ul><li>Jsp Expression Language (ifade dili) </li></ul><ul><li>JSTL (JSP standart tag library ) </li></ul>
  4. 4. Custom Tag Library nedir? <ul><li>Jsp bilindiği gibi java ile yazılmış web uygulamalarında uygulamanın kullanıcı ara yüzünü oluşturmak ve bu arayüzü iş mantığından ayırmak için tasarlanmıştır. </li></ul><ul><li>Custom tag library jsp v1.1 ile gelen ve bu ayırma işlemine yardımcı olan güçlü bir özelliktir. </li></ul>
  5. 5. Custom Tag’ları çekici kılan? <ul><li>Custom Tag’lar </li></ul><ul><ul><li>Çağrılan sayfalar tarafından çalışma zamanında veya static olarak olarak attribute’ler aracılığıyla özelleştirilebilir. </li></ul></ul><ul><ul><li>Request, response, in ve out da dahil olmak üzere jsp sayfalarının kullanabildiği tüm nesnelere erişebilir </li></ul></ul><ul><ul><li>Çağıran sayfadan gelen response’u kullanabilir </li></ul></ul>
  6. 6. Custom Tag’ları çekici kılan?(2) <ul><ul><li>Birbirleriyle iletişim kurabilirler, JavaBeans bileşenlerini oluşturup, bir tag’da o bean’a referans bir değişken tanımlayıp, o bean’ı başka bir tag’da kullanabilirler. </li></ul></ul><ul><ul><li>Birbirleriyle iç içe olabilirler, bir jsp sayfası içerisinde karmaşık etkileşimlere izin verirler. </li></ul></ul><ul><ul><li>Basit ve karmaşık işlemleri kapsayarak, söz dizimi kolaylaştırır, jsp sayfasının okunabilirliğini artırır. </li></ul></ul>
  7. 7. Kendi kütüphanemizi oluşturmak <ul><li>Bir tag library’nin iki bileşeni vardır: </li></ul><ul><ul><li>Library discriptor File ( TLD -kütüphane tanım dosyası) </li></ul></ul><ul><ul><li>Tag handler (etiket işleyici) </li></ul></ul><ul><li>Bu iki bileşenle birlikte jsp dosyaları kütüphaneyi kullanabilirler. </li></ul>
  8. 8. TLD dosyası <ul><li>Bir tld (tag library descriptor) dosyası kütüphaneyi tanımlayan XML görünümlü bir dosyadır. </li></ul><ul><li>Dosya kütüphane hakkındaki tüm bilgiler ve kütüphanedeki bütün taglar ile ve bu tagların özelliklerini tarif eder. </li></ul><ul><li>Tld dosyaları jsp dosyları tarafından tag ları geçerlemek için kullanılır. </li></ul>
  9. 9. Kütüphanenin kimlik bilgilerini tanımlayan elemanlar <ul><li><taglib> : kütüphanenin kendisi </li></ul><ul><li><tlibversion> : Kütüphanenin versiyonu </li></ul><ul><li><jspversion> : Kütüphanenin bağlı olduğu jsp versiyonu </li></ul><ul><li><shortname> : Kütüphane için, anımsatıcı (mnemonic) bir değerle basit bir ön tanımlı(default) ad. </li></ul><ul><li><uri> : Kütüphaneyi belirleyen unique URI </li></ul><ul><li><info> : Kütüphaneyi açıklayıcı bilgi </li></ul>
  10. 10. Tag’ların TLD’de tanıtılması <ul><li><tag>: tagin niteliklerinin tanımlandığı bloktur. </li></ul><ul><li>Her kütüphanede birden fazla tag tanımlanabilir. Tüm tag’lar tek bir TLD dosyasında tanımlanabilir. Bu noktada TLD dosyaları etiket işleyicinin sınıfını (tag handler’s class) belirlemek için kullanılır: </li></ul><ul><li><tagclass> className </tagclass> </li></ul>
  11. 11. Tag’i tanımlayan diğer özellikler <ul><li>Eğer tag’ı tanımlayan nitelikler (attributes) varsa <tag> elemanı içerisinde tanımlanmalı </li></ul><ul><ul><li><name> : Niteliğin handler sınıfındaki adı </li></ul></ul><ul><ul><li><requeired> : Nitelik tag için zorunlu mu?(“true”/”“false”) </li></ul></ul><ul><ul><li><rtexprvalue> : Çalışma zamanlı ifadelere izin verilmeli mi? (“true”/”false”) </li></ul></ul>
  12. 12. Tag’i tanımlayan diğer özellikler(2) <ul><li>Tag in her niteliği için Bean’lar gibi getter/setter yöntemleri kullanılmalıdır. </li></ul><ul><li>Tag’larda programcık (scripting) değişkenleri de kullanmak mümkündür. Bunun için bir TagExtraInfo sınıfı tanımlamak gerekir ve bunu da tag’da belirtmek için </li></ul><ul><li><teiclass> className <teiclass> kullanılır </li></ul>
  13. 13. Örnek TLD dosyası(ornekTld.tld) <ul><li><?xml version=&quot;1.0&quot; encoding=“UTF-8&quot; ?> </li></ul><ul><li><taglib> </li></ul><ul><li><tlibversion> 1.0 </tlibversion> </li></ul><ul><li><jspversion> 1.1 </jspversion> </li></ul><ul><li><shortname> tagOrnegi </shortname> </li></ul><ul><li><info> Bu bir tag kutuphanesi ornegidir </info> </li></ul><ul><li> <!-- (acıklama satırı) --> </li></ul><ul><li> <!-- Basit bir tag --> </li></ul><ul><li><tag> </li></ul><ul><li><name> tagAdi </name> </li></ul><ul><li><tagclass> customTag.deneme .TagIsleyici </tagclass> </li></ul>
  14. 14. ornekTld.tld (2) <ul><li><!-- Tag’ın gövdesi aşağıdaki değerleri alabilir </li></ul><ul><li>empty : Tag’in gövdesinin olmadığını belirtir </li></ul><ul><li>JSP : Gövdedeki JSP kodu container tarafından değerlendirilir ve tag içerisinde işlenir </li></ul><ul><li>tagdependent : Gövde sadece tag tarafından işlenir.Gövdedeki JSP değerlendirilmez --> </li></ul><ul><li><bodycontent> empty </bodycontent> </li></ul><ul><li><info> Bu tag’imizin etiket bilgisidir </info> </li></ul><ul><li><!-- Tag’in niteliklerininin tanımlanması -- > </li></ul><ul><li><!-- Nitelikler sınıf işleyicilerinde tanımlı olmalıdır --> </li></ul>
  15. 15. ornekTld.tld(3) <ul><li><attribute> </li></ul><ul><li><name> degiskenAdi </name> </li></ul><ul><li><required> false </required> <rtexpvalue> false </rtexpvalue> </li></ul><ul><li></attribute> </li></ul><ul><li></tag> </li></ul><ul><li></taglib> </li></ul>
  16. 16. Etiket işleyici sınıfı (Tag Handler) <ul><li>Tag’ler işleyici sınıflarda tanımlanırlar. TagSupport basit tag’ler için ata sınıftır. Javax.servlet.tagext paketi altında bulunurlar. </li></ul><ul><li>Tag’lerin hangi interface’leri gerçekleştireceği hangi fonksiyonların çağrılma potansiyeli olduğu ile belirlenir. </li></ul>
  17. 17. Etiket işleyici sınıfı(2) <ul><li>TagSupport ve TagBodySupport aşağıdaki ön tanımlı fonksiyonları destekler </li></ul>Eğer tag’inizda… … karşılık gelen methodu gerçekleştirmelisiniz Gövde ve nitelik yoksa doStartTag, doEndTag, release Nitelik varsa doStartTag,doEndTag, set/getAttributes1…N Etkileşimsiz gövdesi varsa doStartTag,doEndTag, release Etkileşimli gövdesi varsa doStartTag, doEndTag, release,doInitBody,doAfterBody
  18. 18. Ornek tag işleyici:TagIsleyici.java <ul><li>public class TagIsleyici extends BodyTagSupport { </li></ul><ul><li>private String degiskenAdi = null ; </li></ul><ul><li>public void setDegiskenAdi(String degiskenAdi){ </li></ul><ul><li> this . degiskenAdi = degiskenAdi; </li></ul><ul><li>} </li></ul><ul><li>public String getDegiskenAdi() { </li></ul><ul><li> return degiskenAdi ; </li></ul><ul><li>} </li></ul><ul><li>public int doStartTag() { </li></ul><ul><li> try { </li></ul><ul><li>JspWriter out = pageContext.getOut(); </li></ul><ul><li>out.println( &quot;<table border=&quot; 1 &quot;>&quot; ); </li></ul><ul><li>if (name != null ) </li></ul><ul><li>out.println( &quot;<tr><td>Hello &quot; +degiskenAdi+ &quot;</td></tr>&quot; ); </li></ul><ul><li>else </li></ul><ul><li>out.println( &quot;<tr><td> Hello unnamed brother </td></tr>&quot; ); </li></ul>
  19. 19. <ul><li>} catch (Exception ex) { </li></ul><ul><li>throw new Error( “Hata!..&quot; ); </li></ul><ul><li>} </li></ul><ul><li>//Gövde olmadığı için SKIP_BODY döndürülür </li></ul><ul><li>return SKIP_BODY; </li></ul><ul><li>} </li></ul><ul><li>public int doEndTag(){ </li></ul><ul><li>try { </li></ul><ul><li>JspWriter out = pageContext .getOut(); </li></ul><ul><li>out.println( &quot;</table>&quot; ); </li></ul><ul><li>} catch (Exception ex){ </li></ul><ul><li>throw new Error( “Hata!..&quot; ); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  20. 20. <ul><li>doStartTag: Etiket ile karşılaşıldığında çağrılır </li></ul><ul><li>doEndTag: Etiket sonlandırılırken çağrılır </li></ul><ul><li>SKIP_BODY: Gövde yoksa veya işletilmeyecekse döndürülür. </li></ul>
  21. 21. Örnek Jsp miz: OrnekTag.jsp <ul><li><%@ page contentType = &quot;text/html&quot; %> </li></ul><ul><li><%@ page pageEncoding = &quot;UTF-8&quot; %> </li></ul><ul><li><%@ taglib uri = &quot;/WEB-INF/tld/OrnekTag.tld&quot; prefix = &quot;gokhan&quot; %> </li></ul><ul><li>< html > </li></ul><ul><li>< head > </li></ul><ul><li>< meta http-equiv = &quot;Content-Type&quot; content = &quot;text/html;&quot; > </li></ul><ul><li>< title > Ornek tag deneme </ title > </li></ul><ul><li></ head > </li></ul><ul><li>< body > </li></ul><ul><li>< hr /> </li></ul><ul><li>< gokhan:tagAdi degiskenAdi = “Angelina Jolie&quot; /> </li></ul><ul><li>< hr /> </li></ul><ul><li></ body > </li></ul><ul><li></ html > </li></ul>
  22. 22. Örnek Jsp’nin HTML çıktısı <ul><li><html> </li></ul><ul><li><head> </li></ul><ul><li><meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=ISO-8859-1&quot;> </li></ul><ul><li><title>Ornek tag deneme</title> </li></ul><ul><li></head> </li></ul><ul><li><body> </li></ul><ul><li><hr/> </li></ul><ul><li><table border=&quot;5&quot;> </li></ul><ul><li><tr><td> Hello Angelina Jolie </td></tr></table> </li></ul><ul><li><hr/> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>
  23. 23.
  24. 24. <ul><li><%@ taglib uri = &quot;/WEB-INF/tld/OrnekTag.tld“ prefix = &quot;gokhan&quot; %> </li></ul><ul><li>uri : Tld dosyasının yolunu gösterir. (/WEB-INF/tld klasoru icinde) </li></ul><ul><li>prefix: Tld dosyasımızdaki etiketler için ön işleyici değeri. Etiketler önİşleyici:tagAdi şeklinde kullanılır </li></ul>
  25. 25. Örneğimizi geliştirelim <ul><li>Basit bir etiketin nasıl kullanıldığını gördük. </li></ul><ul><li>Şimdi etikete ek özellikler ve gövde ekleyelim… </li></ul>
  26. 26. TagIsleyici2.java <ul><li>public class TagIsleyici2 extends BodyTagSupport { </li></ul><ul><li>private String degiskenAdi = null ; </li></ul><ul><li>private int yineleme =1 ; </li></ul><ul><li>public void setDegiskenAdi(String degiskenAdi) { </li></ul><ul><li>this . degiskenAdi = degiskenAdi; </li></ul><ul><li>} </li></ul><ul><li>public String getDegiskenAdi() { </li></ul><ul><li>return degiskenAdi ; </li></ul><ul><li>} </li></ul><ul><li>public String getYineleme() { </li></ul><ul><li>return (Integer. toString ( yineleme )); </li></ul><ul><li>} </li></ul><ul><li>public void setYineleme(String yineleme) { </li></ul><ul><li>try { </li></ul><ul><li>this . yineleme = Integer. parseInt (yineleme); </li></ul><ul><li>} catch (NumberFormatException e) { </li></ul><ul><li>this . yineleme =1; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  27. 27. TagIsleyici2.java(2) <ul><li>public int doStartTag() throws JspTagException{ </li></ul><ul><li>try { </li></ul><ul><li>JspWriter out= pageContext .getOut(); </li></ul><ul><li>out.println( &quot;<table border=&quot;5&quot;>&quot; ); </li></ul><ul><li>if ( degiskenAdi != null ) </li></ul><ul><li>out.print( &quot;<tr><td> Hello &quot; + degiskenAdi + &quot;</td></tr>&quot; ); </li></ul><ul><li>else </li></ul><ul><li>out.println( &quot;<tr><td>Hello World! </td></tr>&quot; ); </li></ul><ul><li>} catch (IOException e) { </li></ul><ul><li>throw new JspTagException ( “Hata!..&quot; + e); </li></ul><ul><li>} </li></ul><ul><li>return EVAL_BODY_TAG; </li></ul><ul><li>} </li></ul>
  28. 28. TagIsleyici2.java(3) <ul><li>public int doAfterBody() throws JspException { </li></ul><ul><li> if ( yineleme -- >=1 ){ </li></ul><ul><li>BodyContent body=getBodyContent(); </li></ul><ul><li>try { </li></ul><ul><li>JspWriter out= body.getEnclosingWriter(); </li></ul><ul><li>out.println(body.getString()); </li></ul><ul><li>body.clearBody(); </li></ul><ul><li>} catch (IOException e) { </li></ul><ul><li>throw new JspTagException( “Hata!..&quot; +e); </li></ul><ul><li>} </li></ul><ul><li>return EVAL_BODY_TAG; </li></ul><ul><li> } else { </li></ul><ul><li>return SKIP_BODY ; </li></ul><ul><li> } </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  29. 29. TagIsleyici2.java(4) <ul><li>public int doEndTag() throws JspTagException{ </li></ul><ul><li>try { </li></ul><ul><li>JspWriter out = pageContext .getOut(); </li></ul><ul><li>out.println( &quot;</table>&quot; ); </li></ul><ul><li>} catch (Exception e) { </li></ul><ul><li>throw new JspTagException( “Hata!..&quot; +e); </li></ul><ul><li>} </li></ul><ul><li>return SKIP_BODY ; </li></ul><ul><li>} </li></ul>
  30. 30. <ul><li>doAfterBody : Etiketin gövdesi değerlendirildikten sonra çağrılır. </li></ul><ul><li>EVAL_BODY_TAG: doAfterBody nin işletilmesini sağlar. Bu değer döndüğü sürece işletilmeye devam eder. Durmak için SKIP_BODY döndürülür. </li></ul>
  31. 31. OrnekTld2.tld <ul><li>OrnekTld dosyasını bodycontent ten itibaren aşağıdaki gibi degiştirelim </li></ul><ul><li>< bodycontent > JSP </ bodycontent > </li></ul><ul><li>< info > Bu tag’imizin açıklamasıdır </ info > </li></ul><ul><li>< attribute > </li></ul><ul><li><name > degiskenAdi </ name > </li></ul><ul><li>< required > false </ required > </li></ul><ul><li>< rtexpvalue > false </ rtexpvalue > </li></ul><ul><li></ attribute > </li></ul><ul><li>< attribute > </li></ul><ul><li>< name > yineleme </ name > </li></ul><ul><li>< required > false </ required > </li></ul><ul><li>< rtexpvalue > false </ rtexpvalue > </li></ul><ul><li></ attribute > </li></ul><ul><li></tag> </li></ul><ul><li></taglib> </li></ul>
  32. 32. OrnekTag2.jsp <ul><li><%@ page contentType = &quot;text/html&quot; %> </li></ul><ul><li><%@ page pageEncoding = &quot;UTF-8&quot; %> </li></ul><ul><li><%@ taglib uri = &quot;/WEB-INF/tld/OrnekTag.tld&quot; prefix = &quot;gokhan&quot; %> </li></ul><ul><li>< html > </li></ul><ul><li>< head > </li></ul><ul><li>< meta http-equiv = &quot;Content-Type&quot; content = &quot;text/html; /> </li></ul><ul><li>< title > Ornek tag deneme </ title > </li></ul><ul><li></ head > </li></ul><ul><li>< body > </li></ul><ul><li>< hr /> </li></ul><ul><li> < gokhan:tagAdi degiskenAdi = &quot;angelina jolie&quot; yineleme = &quot;5&quot; > </li></ul><ul><li>< tr >< td >angelina jolie</ td ></ tr > </li></ul><ul><li> </ gokhan:tagAdi > </li></ul><ul><li>< hr /> </li></ul><ul><li></ body > </li></ul><ul><li></ html > </li></ul>
  33. 33. OrnekTag2.jsp nin html çıktısı <ul><li><html> </li></ul><ul><li><head> </li></ul><ul><li><meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=ISO-8859-1&quot;> </li></ul><ul><li><title>Ornek tag deneme</title> </li></ul><ul><li></head> </li></ul><ul><li><body> </li></ul><ul><li><hr/> </li></ul><ul><li><table border=&quot;5&quot;> </li></ul><ul><li><tr><td> Hello angelina jolie</td></tr> </li></ul><ul><li><tr><td>angelina jolie</td></tr> </li></ul><ul><li><tr><td>angelina jolie</td></tr> </li></ul><ul><li><tr><td>angelina jolie</td></tr> </li></ul><ul><li><tr><td>angelina jolie</td></tr> </li></ul><ul><li><tr><td>angelina jolie</td></tr> </li></ul><ul><li></table> </li></ul><ul><li><hr/> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>
  34. 34.
  35. 35. JSP ifade dili (Expression Language) <ul><li>Jsp ifade dili JSP sayfalarında bulunan bean ve nesnelerin özelliklerine kolay bir yazım şakli ile ulaşılmasını sağlar </li></ul><ul><li>Basit karşılaştırma ve matematiksel işlemler yapılabilir. </li></ul><ul><li>Temel olarak Bean’ların özelliklerine hızlı erişebilmek için kullanılırlar </li></ul><ul><li>${ifade} şeklinde kullanılır. </li></ul>
  36. 36. Ifade dilinde tanımlı değişlenler <ul><li>pageContext: uygulama genelindeki değişkenler </li></ul><ul><li>param: parametreler </li></ul><ul><li>header: ServletRequest.getHeader(“ad”) = ${header.ad} </li></ul><ul><li>cookie: ${cookie.ad.value} adı verilen cookinin değerini çevirir </li></ul><ul><li>pageScope: sayfadaki değişkenler </li></ul><ul><li>requestScope: request nesnesindeki değişkenler </li></ul><ul><li>sessionScope: session daki değişkenler </li></ul><ul><li>applicationScope: uygulama genelindeki değişkenler </li></ul>
  37. 37. JSTL-Java Standart Tag Library <ul><li>Temel olarak 4 temel kütüphane vardır. </li></ul>Tanım Örnek(prefix) Varsayılan Uri Core c http://java.sun.com/jsp/jstl/core Xml x http://java.sun.com/jsp/jstl/xml Format fmt http://java.sun.com/jsp/fmt Database sql http://java.sun.com/jsp/sql
  38. 38. JSTL etiketleri <ul><li>* core : Temel fonksiyonlar: döngüler, koşul deyimleri, I/O </li></ul><ul><li>* xml : XML ile ilgili işlemler </li></ul><ul><li>* fmt : para birimi, tarihler gibi biçimlendirme işlemleri </li></ul><ul><li>* sql : Veritabanı erişimi </li></ul>
  39. 39. JSTL’i kullanmak için <ul><li>http://www. apache .org/ dist / jakarta / taglibs / standard / binaries / </li></ul><ul><li>adresinden ilgili arşivi indirin. </li></ul><ul><li>Arşivi açınca, lib klasörü altındaki jstl.jar ve standart.jar dosyalarını uygulamanızın /WEB-INF/lib klasörüne kopyalayın. </li></ul><ul><li><%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jstl/core&quot; %> </li></ul><ul><li>Yukardaki uri ile çalışmayabiliyor, bu durumda </li></ul><ul><li><%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jstl/core_rt&quot; %> </li></ul><ul><li>Şeklinde kullanmayı deneyin.(diğer tag lar için de geçerli) </li></ul>
  40. 40. OrnekJstl.jsp <ul><li><%@ taglib prefix = &quot;c&quot; uri = &quot;http://java.sun.com/jstl/core_rt&quot; %> </li></ul><ul><li><%@ page contentType = &quot;text/html; charset=UTF-8&quot; %> </li></ul><ul><li>< html > </li></ul><ul><li>< head > </li></ul><ul><li>< title > JSTL </ title > </li></ul><ul><li></ head > </li></ul><ul><li>< body > </li></ul><ul><li>< c:if test = &quot; ${9>8} &quot; > </li></ul><ul><li>< b > 9, 8'den büyüktür </ b >< br /> </li></ul><ul><li></ c:if > </li></ul><ul><li>< jsp:useBean id = &quot;renkler&quot; class = &quot;java.util.ArrayList&quot; /> </li></ul><ul><li><% renkler.add( &quot;red&quot; ); </li></ul><ul><li>renkler.add( &quot;blue&quot; ); </li></ul><ul><li>renkler.add( &quot;black&quot; ); </li></ul><ul><li>renkler.add( &quot;green&quot; ); %> </li></ul><ul><li>< c:forEach var = &quot;renk&quot; items = &quot; ${renkler} &quot; > </li></ul><ul><li>< font color = &quot; ${renk} &quot; >< c:out value = &quot; ${renk} &quot; /></ font > </li></ul><ul><li></ c:forEach > </li></ul><ul><li></ body > </li></ul><ul><li></ html > </li></ul>
  41. 41. OrnekJstl.jsp’nin html çıktısı <ul><li>< html > </li></ul><ul><li>< head > </li></ul><ul><li>< title > JSTL </ title > </li></ul><ul><li></ head > </li></ul><ul><li>< body > </li></ul><ul><li>< b > 9, 8'den büyüktür </ b >< br /> </li></ul><ul><li>< font color = &quot;red&quot; > red </ font > </li></ul><ul><li>< font color = &quot;blue&quot; > blue </ font > </li></ul><ul><li>< font color = &quot;black&quot; > black </ font > </li></ul><ul><li>< font color = &quot;green&quot; > green </ font > </li></ul><ul><li></ body > </li></ul><ul><li></ html > </li></ul>
  42. 43. Sorular?

×