Referans
web.xml dosyasına neler eklemek gerekiyor?
JUrfa'nın çalışabilmesi için web.xml dosyasına aşağıdaki gibi filter tanımlanması yapmak gerekir.
jurfa com.jurfa.filter.JUrfaFilter actionBase com.jurfa.action encoding UTF-8 documentBase /WEB-INF/view/ configFile /WEB-INF/jurfa-mappings.xml jurfa /*
Filtre parametreleri şu şekilde:
actionBase: Action'ların Jurfa tarafından tanınması için buraya Action sınıflarınızı barındıran en üst paketi belirtmeniz gerekir. Uygulama sunucu üzerinde çalışmaya başladığı zaman bu paket altındaki sınıfları tarayarak Action olanları bulur. Bulduğu sınıfları log'da belirtir.
encoding: Uygulamanın varsayılan encoding'ini burada belirtiriz. Böylece klasik encoding filter yazmaya gerek kalmaz. Jurfa request ve response'u bu burda belirtilen encoding ile işler.
documentBase: Action'lardan view'lara yönlendirme yaparken normalde tam adres vermek gerekir. Örneğin /WEB-INF/view/hello.jsp gibi.
Burada her seferinde tam adres (full-path) vermek yerine göreceli adres (relative path) vermek için bu parametre kullanılır.
Tam adrese örnek: success="/WEB-INF/view/hello.jsp"
Göreceli adrese örnek: success="hello.jsp"
İkinci örnekte tam adres verilmediği için Jurfa bu jsp dosyasını documentBase ile belirtilen adreste arar. Böylece her seferinde tam adres vermek zorunda kalmayız.
configFile: Bu parametre Jurfa'nın harici tek config dosyası olan ve mapping işlemlerini kolaylaştırmak için kullanılan jurfa-mapping.xml dosyası için belirtilir. Bu parametre zorunlu değildir. Ancak mapping yapılacaksa kullanılır.
@ActionHandler ne işe yarar?
@ActionHanler Action'ın hangi isteğe cevap vereceğini, başarılı ve başarısız durumda hangi view'a yönleneceğini belirten bilgileri içerir, yani Controller görevi görür. Alabileceği parametreler aşağıdaki gibidir:
@ActionHandler(path="/login", success="success.jsp", fail="fail.jsp", contentType="text/html", validate=true, redirect=RedirectMethod.FORWARD, cacheTimeout=-1)
path: Action'ın hangi isteğe cevap vereceği. Örneğe göre /login isteği gelirse bu sınıf tetiklenir.
pattern: Eğer aksiyon örtüşmesini regular expression kullanarak yapmak istiyorsanız o zaman bu alana ilgili pattern'i yazıp, path özelliğine de ActionHandler.PATTERN değerini vermek gerekiyor.
success: Action başarılı bir şekilde sonlandığı zaman hangi view'a gidecek. Zorunlu alan değildir. Action içerisinde istenilen şekilde yönlendirme de yapılabilir. Bu örnekte success.jsp'ye yönlenir.
fail: Action işletilirken exception oluşursa ve fail alanında bir view belirtilmiş ise oraya yönlenir. Eğer tanımlı değilse exception throw edilir. Bu örnekte fail.jsp'ye yönlenir.
contentType: Aksiyon sonucundaki çıktının content-type'ı burada belirtilebilir. Zorunlu değildir ve varsayılan değeri "text/html"'dir.
validate: @ActionParam ya da @UrlParam annotation'ı ile yapılan validasyonlar normalde otomatik olarak çalışır. Validasyon işleminin otomatik olarak yapılmasını istemediğimiz durumlarda bu parametreye false veriyoruz. Daha sonra validate() metodunu elle çağırarak validasyonları yaptırabiliyoruz.
redirect: Aksiyon işletildikten sonra yönleneceği bir view tanımlı ise, bu view'a hangi şekilde yönleneceği buradan belirtilebilir. Bu değerler RedirectMetod enum'ında tanımlanmıştır. FORWARD, REDIRECT ve INCLUDE olabilir. Zorunlu değildir ve varsayılan değeri "FORWARD"'dır.
cacheTimeout: Varsayılan olarak -1 yani no-cache durumundadır. Buraya belirtilen değer dakika cinsinden Action metodunun işletilmesi sonucu model nesnesine eklenen değerlerin memory üzerinde cache'lenmesini sağlar. Yani output'u değil Action metodunun sonucunda doldurulan model nesnesini belirtilen süre kadar dakika yeniden çalıştırmaz, cache'den getirir. Çok kullanışlı bir özellikten değildir, kompleks bir cache mekanizması sunmaz. Deneysel bir özelliktir. İleride geliştirilebilir, hatta burda hazelcasting yapabilirim :)
@ActionParam ne işe yarar?
@ActionParam annotation'ı, view'dan gelen request scope'undaki değerleri sınıfın içerisindeki değişkenlere atmak ve validation yapmak amacında kullanılır. Örnek kullanım ve parametreleri:
@ActionParam(name="user", min=3, max=10, required=true, error="Geçerli bir kullanıcı adı giriniz.") private String userName;
name: Request scope'unda olan değişkenin adıdır. Zorunlu değildir, belirtilmediğinde değişkenin adıyla aynı olması gerekir. Örnekte html tarafından user isimli değişkenin değeri Action tarafında userName'e değer olarak aktarılır.
min: Parametre sayısal ise, minimum alacağı değeri belirtir. Bu değerden düşük bir değer varsa ValidationException fırlatılır. Eğer parametre sayısal değil de String ise, o zaman en az min değeri kadar karakter içermesi gerekir. Örneğe göre userName değişkeni en az 3 karakter olmalıdır.
max: Parametre sayısal ise, maksimum alacağı değeri belirtir. Bu değerden büyük bir değer varsa ValidationException fırlatılır. Eğer parametere sayısal değil de String ise, o zaman en fazla max değeri kadar karakter içermesi gerekir. Örneğe göre userName değişkeni en fazla 10 karakter olabilir.
required: required=true olarak belirtildiğinde bu değişkenin değeri null olamaz.
error: Zorunlu alan değildir. Belirtildiği durumlarda validasyon hatası oluşursa model nesnesine "validationError" değişkeni olarak burada belirtilen değeri verir. Böylece view tarafında kullanıcıya oluşan durumla ilgili bilgi verilebilir. Jstl kullanılıyor ise $model.validationError gibi.
Validasyonlar varsayılan olarak otomatik yapılır. Otomatik validasyon yapılmaması için @ActionHandler annotation'da validate=false verip, Action'ın validate() metodunu çağırmak gerekir.
@UrlParam ne işe yarar?
@UrlParam annotation'ı, Action'a ait path'den veri almak için kullanılır.
@UrlParam(index=1, min=3, max=10, required=true, error="Geçerli bir kullanıcı adı giriniz.") private String userName;
index: index bilgisi 0'dan başlayarak url'nin / ile ayrılan parametrelerinin indexidir. (Örnek: /customers/customer/haqen gibi bir url de index=0 değeri customers olur)
Diğer özellikleri ActionParam ile aynıdır.
@LoginRequired ne işe yarar?
@LoginRequired annotation'ı güvenlik amacı ile kullanılır, Başına eklendiği Action'ın GET/POST metodunu çalıştırmadan önce role parametresi ile belirtilen değeri session'da kontrol eder. Eğer session'da böyle bir bilgi yoksa HTTP 403 hatası fırlatır.
@LoginRequired(role="admin,editor")
@ActionHandler(path="/admin/")
public class AdminAction extens Action
{
// hede hödö ...
}
role: Bu Action'ı çalıştırabilecek roller burada virgül ile ayrılmış olarak belirtilir.
Bunun dışında Action sınıfı authentication için aşağıdaki metodları kullanır:
void login(String role): Bu metod belirtilen rolü session'a atar ve Jurfa scope'unda login olmuş sayılır.
void logout(): Bu metod Jurfa scope'unda login ile ilgili bilgiyi silerek logout işlemi yapar.
boolean isLoggedIn(String role): Bu metod belirtilen role'ün login olup olmadığı bilgisini verir.
