Merhabalar arkadaşlar. Validator Tags JSF kütüphanesi içindeki f: etiekti ile kullanabileceğimiz doğrulayıcıları öğrenmiştik. Bu yazıda ise kendimize ait özel (custom) doğrulayıcı yazmayı öğreneceğiz.
Bu yazıda örnek uyglama olarak önceki yazıda e-posta için kullandığımız doğrulama işini özel dönüştürücü ile nasıl yapabiliriz ona bakalım.
ValidatorClass.java
package customValidator; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.FacesValidator; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by ilkaygunel on 09/02/16. */ @FacesValidator("customValidator.ValidatorClass") public class ValidatorClass implements Validator{ String emailPattern="^[A-Za-z0-9+-]+(\\.[A-Za-z0-9+-]+)*@[A-Za-z0-9-]+(.[A-Za-z0-9]+)*(.[A-Za-z]{2,})$"; private Pattern patternObject; private Matcher matcherObject; public ValidatorClass() { patternObject = Pattern.compile(emailPattern); } @Override public void validate(FacesContext facesContext, UIComponent uiComponent, Object o) throws ValidatorException { matcherObject = patternObject.matcher(o.toString()); if (!matcherObject.matches()) { FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,"E-Posta doğrulaması başarısız oldu.", "Geçersiz E-Posta Adresi"); throw new ValidatorException(message); } } }
Doğrulayıcı olarak kullanacağımız ValidatorClass sınıfının doğrulayıcı olabilmesi için 2 şeye ihtiyacı vardır. Birincisi sınıfın @FacesValidator notasyonu ile işaretlenmesi, ikincisi sınıfın Validator arabirimini uygulaması (implementation) . @FacesValidator notasyonuna parametre olarak verilen String XHTML içinde tanımlayıcı olarak kullanılacaktır.
Sınıfımız içinde bir emailPattern String’i tanımladık. Bu String’i java.util.regex.Pattern sınıfından bir pattern objesi elde ederken şablon olarak kullanacağız.
Pattern patternObject nesnesi sınıfın yapılandırıcı metodu içerisinde Pattern sınıfındaki static bir metot olan compile metoduna emailPattern String’ini parametre olarak verilerek oluşturuluyor ve az sonra validate metodu içinde eşleşme kontrolü için kullanılacak.
Matcher matcherObject eşleşme kontrolü sonucunu tutacak ve buna göre hata fırlatma ya da fırlatmama işlemi yapacak. Eğer siz Matcher nesnesi kullanmak istemezseniz if bloğuna
patternObject.matcher(o.toString()).matches()
kodunu yazarak da test edebilirsiniz.
Validator arabiriminin içinde tanımlı olan validate metodu form gönderildiğinde doğrulama işlemini yapacak metotdur. Benim anladığım kadarı ile bu metodun ilk iki parametresi JSF mimarisi içinde verinin XHTML’den alınıp bu metoda getirilmesi işlemini gerçekleştiriyor ve üçüncü parametre de gelen veriyi temsil ediyor. Metot içerisinde patternObject nesnesi ile Pattern sınıfındaki matcher metodunu çağırıyoruz ve metoda Object tipinde gelen o nesnesini toString metodu ile String’e çevirerek gönderiyoruz. matcher metodu patternObject’in sahip olduğu şablona göre gelen veriyi test ediyor (şablonumuz emailString) ve test sonucu matcherObject’de tutuluyor. matcherObject nesnesi ile çağırdığımız ve true ya da false değeri dönen macthes metodu eşleşmenin doğrulanıp doğrulanmadığını kontrol ediyoruz.
Eğer doğrulama başarısız olursa bir FacesMessage nesnesi oluşturup bu nesneyi parametre olarak vererek bir ValidatorException fırlatabiliriz.
CustomValidatorBean.java
import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; /** * Created by ilkaygunel on 13/02/16. */ @ManagedBean @SessionScoped public class CustomValidatorBean { String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
CustomValidatorBean sınıfı içinde kullanıcıdan alınan e-posta adresini tutacak bir String email değişkeni ve onun get-set metotları yer alıyor.
index.xhtml
<?xml version="1.0" encoding="UTF-8"?> <!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:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Custom Validator Page</title> </h:head> <h:body> <h:form> <h:panelGrid columns="1"> <h:outputText value="E-Mail Giriniz:"/> <h:inputText id="email" value="#{customValidatorBean.email}" validator="ValidatorClass"> <!--<f:validator validatorId="ValidatorClass"/>--> </h:inputText> <h:message for="email" style="color: red;"/> </h:panelGrid> <h:commandButton value="GÖNDER"/> </h:form> </h:body> </html>
index sayfamız içerisinde yazmış olduğumuz özel doğrulayıcıyı (custom validator) istersek bileşenizimin validator özelliği ile istersek de bileşenimizin açma-kapatma etiketleri arasında f:validator etiketi ile kullanabiliriz. Bileşenimizin validator özelliğini kullandığımızda özel doğrulayıcı sınıfında @FacesConverter notasyonuna parametre olarak verilen String değeri validator özelliğine atamamız yeterli. Eğer f:validator etiketini kullanırsak da bu etiketin validatorId özelliğine @FacesConverter notasyonuna parametre olarak verilen String değeri atamamız yeterli. Örnek kod içerisinde alternatif kullanım olan f:validator yorum satırı yapılarak kapatılmıştır.
Ekran Çıktısı
Geçersiz bir e-posta adresi girip doğrulayıcının çalışmasını test ediyorum.
Gönder dediğimde Custom Validator sınıfı içindeki hata mesajı ekrana yazdırılıyor.
Doğru olan bir e-posta adresi girip gönder dediğimde ekrana herhangi bir hata yazdırılmıyor.
Burada opsiyonellikten gelen hakla @ işaretinden önce iki noktalı yazım da yapılabilinir. [email protected] girip gönder dediğimde herhangi bir hata ile karşılaşmıyoruz.
Bu yazıda bu kadar arkadaşlar. Başka bir yazıda görüşene kadar sağlıcakla kalın. Görüşmek üzere.