jsp custom tag library
DESCRIPTION
Jsp Custom tag library nedir nasıl oluşturulur...TRANSCRIPT
AmaçCustom tag library nedir?Niçin kullanılır?Kendi kütüphanemizi nasıl oluştururuz?Jstl(Jsp standart tag library) nedir,
fonksiyonları nelerdir?
2
İçerikCustom Tag Library nedir?Kendi kütüphanemizi oluşturmakJsp Expression Language(ifade dili)JSTL (JSP standart tag library)
3
Custom Tag Library nedir?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.
Custom tag library jsp v1.1 ile gelen ve bu ayırma işlemine yardımcı olan güçlü bir özelliktir.
4
Custom Tag’ları çekici kılan?Custom Tag’lar
Çağrılan sayfalar tarafından çalışma zamanında veya static olarak olarak attribute’ler aracılığıyla özelleştirilebilir.
Request, response, in ve out da dahil olmak üzere jsp sayfalarının kullanabildiği tüm nesnelere erişebilir
Çağıran sayfadan gelen response’u kullanabilir
5
Custom Tag’ları çekici kılan?(2)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.
Birbirleriyle iç içe olabilirler, bir jsp sayfası içerisinde karmaşık etkileşimlere izin verirler.
Basit ve karmaşık işlemleri kapsayarak, söz dizimi kolaylaştırır, jsp sayfasının okunabilirliğini artırır.
6
Kendi kütüphanemizi oluşturmakBir tag library’nin iki bileşeni vardır:
Library discriptor File(TLD-kütüphane tanım dosyası)
Tag handler (etiket işleyici)Bu iki bileşenle birlikte jsp dosyaları
kütüphaneyi kullanabilirler.
7
TLD dosyasıBir tld (tag library descriptor) dosyası
kütüphaneyi tanımlayan XML görünümlü bir dosyadır.
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.
Tld dosyaları jsp dosyları tarafından tag ları geçerlemek için kullanılır.
8
Kütüphanenin kimlik bilgilerini tanımlayan elemanlar<taglib> : kütüphanenin kendisi<tlibversion> : Kütüphanenin versiyonu<jspversion> : Kütüphanenin bağlı olduğu
jsp versiyonu<shortname> : Kütüphane için, anımsatıcı
(mnemonic) bir değerle basit bir ön tanımlı(default) ad.
<uri> : Kütüphaneyi belirleyen unique URI
<info> : Kütüphaneyi açıklayıcı bilgi9
Tag’ların TLD’de tanıtılması<tag>: tagin niteliklerinin
tanımlandığı bloktur.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:
<tagclass>className</tagclass>10
Tag’i tanımlayan diğer özelliklerEğer tag’ı tanımlayan nitelikler (attributes)
varsa <tag> elemanı içerisinde tanımlanmalı<name> : Niteliğin handler sınıfındaki adı<requeired> : Nitelik tag için zorunlu mu?
(“true”/”“false”) <rtexprvalue> : Çalışma zamanlı ifadelere izin
verilmeli mi? (“true”/”false”)
11
Tag’i tanımlayan diğer özellikler(2)Tag in her niteliği için Bean’lar gibi
getter/setter yöntemleri kullanılmalıdır.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
<teiclass>className<teiclass> kullanılır
12
Örnek TLD dosyası(ornekTld.tld)<?xml version="1.0" encoding=“UTF-8" ?> <taglib>
<tlibversion> 1.0 </tlibversion><jspversion> 1.1 </jspversion><shortname> tagOrnegi </shortname><info> Bu bir tag kutuphanesi ornegidir </info> <!-- (acıklama satırı) --> <!-- Basit bir tag --><tag>
<name>tagAdi</name><tagclass>customTag.deneme.TagIsleyici</
tagclass>
13
ornekTld.tld (2)<!-- Tag’ın gövdesi aşağıdaki değerleri alabilir
empty: Tag’in gövdesinin olmadığını belirtirJSP: Gövdedeki JSP kodu container tarafından değerlendirilir ve tag içerisinde işlenirtagdependent: Gövde sadece tag tarafından
işlenir.Gövdedeki JSP değerlendirilmez--><bodycontent> empty </bodycontent><info> Bu tag’imizin etiket bilgisidir </info><!-- Tag’in niteliklerininin tanımlanması -- ><!-- Nitelikler sınıf işleyicilerinde tanımlı olmalıdır --
>
14
ornekTld.tld(3)<attribute>
<name> degiskenAdi </name><required> false </required>
<rtexpvalue> false </rtexpvalue> </attribute>
</tag></taglib>
15
Etiket işleyici sınıfı (Tag Handler)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.
Tag’lerin hangi interface’leri gerçekleştireceği hangi fonksiyonların çağrılma potansiyeli olduğu ile belirlenir.
16
Etiket işleyici sınıfı(2)TagSupport ve TagBodySupport aşağıdaki
ön tanımlı fonksiyonları destekler
17
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
Ornek tag işleyici:TagIsleyici.javapublic class TagIsleyici extends BodyTagSupport {
private String degiskenAdi= null;public void setDegiskenAdi(String degiskenAdi){ this.degiskenAdi = degiskenAdi;}public String getDegiskenAdi() { return degiskenAdi;}public int doStartTag() {
try { JspWriter out = pageContext.getOut(); out.println("<table border="\1\">"); if (name != null) out.println("<tr><td>Hello "+degiskenAdi+"</td></tr>"); else out.println("<tr><td> Hello unnamed brother </td></tr>");
18
} catch (Exception ex) { throw new Error(“Hata!.."); } //Gövde olmadığı için SKIP_BODY döndürülür return SKIP_BODY;
}
public int doEndTag(){ try { JspWriter out = pageContext.getOut(); out.println("</table>"); } catch (Exception ex){ throw new Error(“Hata!.."); } }}
19
doStartTag: Etiket ile karşılaşıldığında çağrılırdoEndTag: Etiket sonlandırılırken çağrılırSKIP_BODY: Gövde yoksa veya işletilmeyecekse
döndürülür.
20
Örnek Jsp miz: OrnekTag.jsp<%@page contentType="text/html" %><%@page pageEncoding="UTF-8" %><%@taglib uri="/WEB-INF/tld/OrnekTag.tld" prefix="gokhan" %>
<html> <head> <meta http-equiv="Content-Type" content="text/html;"> <title>Ornek tag deneme</title> </head>
<body> <hr/> <gokhan:tagAdi degiskenAdi=“Angelina Jolie"/> <hr/> </body> </html>
21
Örnek Jsp’nin HTML çıktısı<html> <head> <meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1"> <title>Ornek tag deneme</title> </head> <body>
<hr/><table border="5"><tr><td> Hello Angelina Jolie </td></tr></table>
<hr/> </body> </html>
22
23
<%@taglib uri="/WEB-INF/tld/OrnekTag.tld“ prefix="gokhan"%> uri : Tld dosyasının yolunu gösterir. (/WEB-INF/tld klasoru
icinde) prefix: Tld dosyasımızdaki etiketler için ön işleyici değeri.
Etiketler önİşleyici:tagAdi şeklinde kullanılır
24
Örneğimizi geliştirelimBasit bir etiketin nasıl kullanıldığını gördük.Şimdi etikete ek özellikler ve gövde
ekleyelim…
25
TagIsleyici2.javapublic class TagIsleyici2 extends BodyTagSupport {
private String degiskenAdi= null;private int yineleme=1 ;public void setDegiskenAdi(String degiskenAdi) {this.degiskenAdi = degiskenAdi;}public String getDegiskenAdi() {return degiskenAdi;}public String getYineleme() {return (Integer.toString(yineleme));}public void setYineleme(String yineleme) {try {this.yineleme = Integer.parseInt(yineleme);} catch (NumberFormatException e) {this.yineleme=1;}}
26
TagIsleyici2.java(2)public int doStartTag() throws JspTagException{try{
JspWriter out= pageContext.getOut();out.println("<table border=\"5\">");if (degiskenAdi!=null)
out.print("<tr><td> Hello "+ degiskenAdi + "</td></tr>");
else out.println("<tr><td>Hello World!
</td></tr>");}catch (IOException e) {
throw new JspTagException (“Hata!.." + e);}return EVAL_BODY_TAG;
}
27
TagIsleyici2.java(3)public int doAfterBody() throws JspException { if(yineleme-- >=1 ){
BodyContent body=getBodyContent();
try {JspWriter out= body.getEnclosingWriter();out.println(body.getString());body.clearBody();
} catch (IOException e) {throw new JspTagException(“Hata!.."+e);
}return EVAL_BODY_TAG;
}else {return SKIP_BODY;
}}
}28
TagIsleyici2.java(4)public int doEndTag() throws JspTagException{try {
JspWriter out = pageContext.getOut();out.println("</table>");
} catch (Exception e) {throw new JspTagException(“Hata!.." +e);
} return SKIP_BODY;
}
29
doAfterBody : Etiketin gövdesi değerlendirildikten sonra çağrılır.
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.
30
OrnekTld2.tld OrnekTld dosyasını bodycontent ten itibaren aşağıdaki gibi degiştirelim
<bodycontent> JSP </bodycontent><info> Bu tag’imizin açıklamasıdır </info><attribute>
<name> degiskenAdi </name><required> false </required><rtexpvalue>false</rtexpvalue>
</attribute>
<attribute><name>yineleme</name><required>false</required><rtexpvalue>false</rtexpvalue>
</attribute></tag>
</taglib>
31
OrnekTag2.jsp<%@page contentType="text/html" %><%@page pageEncoding="UTF-8" %><%@taglib uri="/WEB-INF/tld/OrnekTag.tld" prefix="gokhan" %><html> <head>
<meta http-equiv="Content-Type" content="text/html; /><title>Ornek tag deneme</title>
</head> <body>
<hr/> <gokhan:tagAdi degiskenAdi="angelina jolie" yineleme="5">
<tr><td>angelina jolie</td></tr> </gokhan:tagAdi><hr/>
</body> </html>
32
OrnekTag2.jsp nin html çıktısı<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-
8859-1"><title>Ornek tag deneme</title></head><body>
<hr/><table border="5">
<tr><td> Hello angelina jolie</td></tr><tr><td>angelina jolie</td></tr><tr><td>angelina jolie</td></tr><tr><td>angelina jolie</td></tr><tr><td>angelina jolie</td></tr><tr><td>angelina jolie</td></tr>
</table><hr/>
</body> </html>
33
34
JSP ifade dili (Expression Language)Jsp ifade dili JSP sayfalarında bulunan bean
ve nesnelerin özelliklerine kolay bir yazım şakli ile ulaşılmasını sağlar
Basit karşılaştırma ve matematiksel işlemler yapılabilir.
Temel olarak Bean’ların özelliklerine hızlı erişebilmek için kullanılırlar
${ifade} şeklinde kullanılır.
35
Ifade dilinde tanımlı değişlenlerpageContext: uygulama genelindeki değişkenlerparam: parametrelerheader: ServletRequest.getHeader(“ad”) = ${header.ad}cookie: ${cookie.ad.value} adı verilen cookinin değerini
çevirirpageScope: sayfadaki değişkenler requestScope: request nesnesindeki değişkenlersessionScope: session daki değişkenlerapplicationScope: uygulama genelindeki değişkenler
36
JSTL-Java Standart Tag LibraryTemel olarak 4 temel kütüphane vardır.
37
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
JSTL etiketleri*core : Temel fonksiyonlar: döngüler, koşul
deyimleri, I/O*xml: XML ile ilgili işlemler*fmt: para birimi, tarihler gibi biçimlendirme
işlemleri*sql: Veritabanı erişimi
38
JSTL’i kullanmak içinhttp://www.apache.org/dist/jakarta/taglibs/
standard/binaries/ adresinden ilgili arşivi indirin.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.
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
Yukardaki uri ile çalışmayabiliyor, bu durumda <%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>Şeklinde kullanmayı deneyin.(diğer tag lar için de geçerli)
39
OrnekJstl.jsp<%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%><%@page contentType="text/html; charset=UTF-8" %><html><head><title>JSTL</title></head><body>
<c:if test="${9>8}"><b> 9, 8'den büyüktür </b><br/>
</c:if><jsp:useBean id="renkler" class="java.util.ArrayList" /><% renkler.add("red");
renkler.add("blue");renkler.add("black");renkler.add("green"); %>
<c:forEach var="renk" items="${renkler}"><font color="${renk}" ><c:out value="${renk}" /></font></c:forEach></body></html>
40
OrnekJstl.jsp’nin html çıktısı<html><head><title>JSTL</title></head><body><b> 9, 8'den büyüktür </b><br/>
<font color="red" >red</font>
<font color="blue" >blue</font>
<font color="black" >black</font>
<font color="green" >green</font>
</body></html>
Sorular?
43