Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

JSP Custom Tag Library

3,129 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?

×