Merhabalar arkadaşlar. Dönüştürücüler 1 yazımıda f:convertNumbers ve f:convertDateTime etiketlerini incelemiştik ve JSF mimarisi içindeki dönüştürme yapısını görmüştük. Bu yazımızıda ise özel dönüştürücü yazmayı öğreneceğiz. Önceki yazıda da belirttiğim üzere daha bütün yapıda gitmesi için JSF Nedir? Giriş,IDE Kurulumu Ve İlk Uygulama yazımda Converter 1 ve 2 yazılarını yazı listesinde öne aldım.
Kimi zamanlarda JSF’nin kendi dönüştürücüleri yetmez ve bir özel dönüştürücü yazmamız gerekebilir. Bu durumda yapılması gereken işlemler:
- Java sınıfı oluşturmak,
- Sınıfa Converter arabirimini uygulamak (implement etmek)
- @FacesConverter notasyonu ile eşsiz bir id ataması yapmak
- f:converter etiketi ya da converter özelliği ile yazılan dönütürücüyü uygulamak.
Şimdi örnek kod üzerinden gidelim.
CustomConverterBean.java
import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.ConverterException; import javax.faces.convert.FacesConverter; import java.net.URI; @FacesConverter("CustomConverterBean") public class CustomConverterBean implements Converter{ @Override public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) { StringBuilder url=new StringBuilder(); if(!arg2.contains("http://")) { url.append("http://"); } url.append(arg2); try { new URI(url.toString()); } catch (Exception e) { FacesMessage msg = new FacesMessage("URL dönüşümü sırasında hata!", "Geçersiz URL formatı!"); msg.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ConverterException(msg); } ConverterBean converterBeanObject = new ConverterBean(); converterBeanObject.setUrl(url.toString()); return converterBeanObject; } @Override public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) { return arg2.toString(); } }
Sınıfmız içinde ilk olarak @FacesConverter notasyonu ile bu sınıfa eşsiz bir converter id’si ataması yapıyoruz. Xhtml içinden dönüştürücü çağırımı bu id ile yapılacak.
CustomConverterBean sınıfını Converter arabiriminden implement ettiğimiz takdirde getAsString ve getAsObject metodlarını override etmemiz gerekmektedir. Burada dönüştürme işlemi devreye girdiğinde öncelikle getAsString metodu çağırılır ve dönüştürme işlemine tabi tutulacak değer String’e dönüştürülüp return edilir. Akabinde getAsObject metodu devreye girer. Bu metot içinde dönüştürme işlemlerimizi gerçekleştireceğiz. String tipinde gelen değer üzerinde kontrol ve ekleme çıkarma işlemleri yapacağız. Önceki dersten hatırlayacağınız üzere pattern belirleme yapmıştık, bunu da onun gibi düşünebilirsiniz. Örneğimizde kullanıcıdan bir URL alınıyor, dönüştürme işlemine tabi tutulacağı anlaşılıp bu sınıfa gönderiliyor, getAsString ile String’e dönüştürülüp getAsObject metoduna gönderiliyor. Bu metot içinde bir StringBuilder oluşturuluyor, oluşturulan StringBuilder’a ilk olarak kullanıcının girdiği değerde eğer başında http:// yoksa ekleniyor. Sonra girilen metin geçerli bir URL mi değil mi URI ile kontrol ediliyor. Geçerli ise StringBuilder’a ekleniyor. Değilse ConvertException ile hata döndürülüyor. Son adımda ise bir ConverterBean nesnesi oluşturulup URL konulup return ediliyor.
ConverterBean.java
import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean @SessionScoped public class ConverterBean { String url; public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @Override public String toString(){ return url; } }
Bu sınıf basit bir Managed Bean sınıfımız. Yalnız url nesnemiz String olduğu için içinde toString metodunu Override etmeyi unutmamamız gerekiyor.
ConverterPage.xhtml
<!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:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Converter Örnek Kodu</title> </h:head> <h:body> <h:form> <h:outputText value="Bir URL Giriniz:" /> <h:inputText id="urlText" value="#{converterBean.url}"> <f:converter converterId="CustomConverterBean"/> </h:inputText> <h:message for="urlText" style="color:red"/> <h:commandButton value="Submit" action="result.xhtml" /> </h:form> </h:body> </html>
Xhtml kodumuz içerisinde bir değer dönüştürme işlemine tabi tutulacaksa elementin etiketleri arasında f:converter etiket ile ya da elementin converter özelliği ile işlem yapılabilir. Bu noktada atama işlemi yapılırken yazılmış olan dönüştürücünün Id bilgisi (@FacesConverter ile atanmış) f:converter etiketinin converterId özelliğine atanır. Eğer f:converter kullanmak istemezseniz şu şekilde converter özelliğinden de faydalabilirsiniz:
<h:inputText id="urlText" value="#{converterBean.url}" converter="CustomConverterBean">
Böylece yazmış olduğunuz özel dönüştürücü butona basıldığı anda devreye girecek ve buton bizi result.xhtml sayfasına yönlendirecek.
result.xhtml
<!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:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <h:head></h:head> <body> <h:form> <h:outputText value="#{converterBean.url}" /> </h:form> </body> </html>
Ekran Çıktıları
İlk olarak inputText’e geçersiz olacak, URL olarak kabul edilmeyecek karakterler giriyorum.
Submit butonuna tıkladığımda girilen metnin geçersiz URL olduğu söylendi.
Şimdi geçerli URL olarak kod5.net’u giriyorum ve Submit butonuna tıklıyorum.
Ben http:// girmediğim halde result sayfasında http:// eklenmiş halde görünüyor.
Bu yazıda da bu kadar arkadaşlar. Temel olarak Custom Converter (Özel Dönüştürücü) nasıl kullanabileceğimizi öğrenmiş olduk. Gelecek yazıda görüşmek üzere sağlıcakla kalın.