Sansür, bir toplumun kendine olan güvensizliğini yansıtır ve otoriter rejimlerin belirgin bir özelliğidir.

--Potter Stewart

25.04.2011

Türkçe Maven Rehberi

"Kahvenin Hatırı" adlı blogta Sonatype'ın Maven belgelerinin Türkçe'ye çevrilmiş hallerine ulaşabilirsiniz. Son blog girdilerinde Maven ile ilgili örnekler de mevcut. Emeği geçen arkadaşa teşekkür ederiz:

http://kahveninhatiri.blogspot.com/2011/04/turkce-maven-rehberi.html

17.04.2011

JSF 2.0 ve Composite Components

JSF 1.2 ve Facelets ile halihazırdaki bileşenleri biraraya getirip yeni bir tag yaratarak tek bir bileşen olarak kullanabiliyorduk. Bunun için izlenen adımlar:

1) Biraraya getirilecek bileşenlerin .xhtml dosyasında <ui:composition> tagi altında yazılması.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html">
  
 <ui:composition>
  <h:outputLabel value="#{label}" for="#{id}"/>
  <h:inputText id="#{id}" value="#{value}"/>
 </ui:composition>
  
</html>


2) Hazırlanan bu .xhtml dosyasının namespace'i belirtilmiş *.taglib.xml içerisinde ismi ve dosya adresini belirten bir tag olarak tanımlanması.

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
                version="2.0">

    <namespace>http://mdasgin.blogspot.com/custom</namespace>
    
    <tag>
     <tag-name>myInput</tag-name>
     <source>tags/customTag.xhtml</source>
    </tag>
</facelet-taglib>


3) *.taglib.xml' in web.xml'de tanımının yapılması.

<context-param>
 <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
 <param-value>
        /WEB-INF/taglibs/custom.taglib.xml;
    </param-value>
</context-param>

4) Yeni yaratılan tag'in kullanılmak istendiği yerde namespace ve tag ismi belirtilerek kullanılmasını içermekteydi.

<html xmlns:m="http://mdasgin.blogspot.com/custom">
..
<m:myInput id="myInput" label="Username" value="#{user.name}"/>
..
</html>



Ne var ki bu şekilde Facelets ile yapılan yeni bileşen yaratma işleminde yaratılan bileşene sadece Value Expression tanımları geçilebiliyordu. Örneğin h:inputText'in yanına h:commandButton bileşeni ekleyerek commandButton'un kullanımına <m:myInput action="#{user.save}"> gibi bir Method Expression parametresi veremiyorduk.

Neyseki JSF 2.0 ile gelen Composite Components özelliği ile geliştiriciyi yoran gereksiz adımlardan ve yeni bileşenimize method expression aktaramama gibi kısıtlardan kurtuluyoruz. WEB-INF/resources klasörü içinde namespace görevi gören bir dizin oluşturmak ve bu dizin altında bileşenIsmi.xhtml dosyası hazırlamamız yeterli:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:composite="http://java.sun.com/jsf/composite"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:p="http://primefaces.prime.com.tr/ui">
 
 <composite:interface>
  <composite:attribute name="id" required="true"/>
  <composite:attribute name="label" required="true"/>
  <composite:attribute name="value"/>
  <composite:attribute name="action" method-signature="void action()"/>
 </composite:interface>
 
 <composite:implementation>
  <h:outputLabel value="#{cc.attrs.label}" for="#{cc.attrs.id}"/>
  <h:inputText id="#{cc.attrs.id}" value="${cc.attrs.value}"/>
  <h:commandButton value="Save" action="#{cc.attrs.action}"/> 
 </composite:implementation>
 
</html>


Yukarda /WEB-INF/resources/components dizini altına myInput.xhtml dosyasının içeriği mevcut. Ayrıntılara  göz atarsak, JSF 2.0 ile gelen composite namespace'inin kullanımı hemen dikkat çekiyor. Dosya içeriği composite:interface ve composite:implementation olarak ikiye ayrılıyor. Implementation kısmında istenen yetenek gerçekleştirilirken interface kısmında yeni bileşenin ihtiyaç duyduğu değişkenler sıralanıyor. Değişkenleri detaylı incelersek value expression alan değişkenlerin yanında method expression alan action değişkeninin tanımlanması örneklemiştir. Ayrıca değişkenlere erişim de görüldüğü gibi #{cc.attrs.degiskenIsmi}  şeklinde yapılıyor.

Yeni bileşenimizi bu şekilde hazırladıktan sonra hiçbir ek tanım yapmadan JSF sayfalarımızda kullanabiliriz:

<html xmlns:m="http://java.sun.com/jsf/composite/components">
 ...
  <m:myInput id="myInput" label="Username" value="#{user.name}" action="${user.save}"/>
 ...
</html>

Küçük bir not: Composite Components kullanırken tanımladığınız değişkenin ismi "rendered" olursa JSF'in hata fırlattığını da hatırlatayım. İlgili bug kaydı burada.