20 Mart 2009 Cuma

Ah filtre vah filtre, amanında web.xml

Evet filtre javada bir nimet olsa gerek. Hele request ve response nesnelerini değiştirme olanığınıyla tanıştıktan sonra acayip bir sevgidir aldı başını gitti içimde...

Neyse yine bir sorunla başlayalım. Sorunlar olmasa hayat çekilmez olurdu herhalde.

Sorun: Daha önce her şeyi ile doğru dürüst çalışan yönetim paneliniz vardır. Daha önce diyorum, çünkü, artık düzgün çalışmıyordur. Eskiden, yönetim paneliniz aracılığıyla girdiğiniz içeriklerde hiçbir sıkıntı olmadığını varsayıyoruz.

Örneğin: Türkçe içerik girdiğinizde hiç bir sorun yaşamıyordunuz. Fakat bir başka işlemi gerçeklemesi için "IkinciFiltre" adında bir filtre yazıyorsunuz. Her şey çok iyi görünürken bir de karşınıza daha önce çözdüğünüz ; Türkçe karekter sorununu ile yine burunburuna kaldınız.

Bu canınızı sıkmıştır. Muhtemelen "IkinciFiltre" her şeyi bozuyordur. Doğrudur. Ancak nasıl? Ve neden?

Burada basitçe filtreler ile alakalı bir kaç şey bilmek lazım herhalde. Filtrelerin ayaklanması ile alakalı işlem adımları aşağıda sırasıya verilmiş

  1. Web.xml'de önce filtreler ayaklanır - initialize -
  2. Ayaklanan filtrelerin önce init() fonksiyonları daha sonra ise bağlantı örüntüsü - url pattern - kimin sorumluluk alanına giriyorsa o filrelerin doFilter() fonksiyonları çalışır.
  3. Web.xml'de girilen sırada, yukarıdan aşağıya çağrılırlar. Eğer bir bağlantı örüntüsü birden fazla filtrenin sorumluluğunda ise web.xml'de hangisi ön sırada tanımlanmışsa onun doFilter() fonksiyonu çağrılır.
  4. Aynı bağlantı örüntüsü sorumluluk alanına giren birden fazla filtre var ise önce ilk tanımlanın doFilter() fonksiyonu çağrılır. Ardından ikinci filtreye birinci filtrenin doFilter() fonksiyonu içinde çağrılan chain.doFilter() fonksiyonuyla geçilir. Sonra n adet filte sırasıyla bu işlemi yapar. Ve zincirin - chain - en altındaki filtre işlemini tamamlarsa yani doFilter() son satırına kadar çalıştırılırsa bu sefer adımların tersinden, n. filtreden ikinciye oradan da birinci filtreye geri dönülür ve en son ilk çalışan filtrenin doFilter() fonksiyonu tamamlanır.
  5. Eğer zincirin en sonunda servlet var ise servlet çalışmasını bitirsikten sonra zincirin en son halkasında olan filtreye görev geri teslim edilir. doFilter() fonksiyonuna tamamlayan en son filtre görevi bir üste ve ... En son ilk çalışan filtre çalışmasını bitirir.
Bu arada servlet bağlantı adresi ile çağrıldığında önce servletin öntanımlı kurucu fonksiyonu çalıştırılır. Ardından servlet ayaklanır - initialize - . Ve ardından filtreler devreye girer. Sonrasında filtre zinciri işlemlerine başlar. Yani yukarıdaki maddeler işleme konulur sırasıyla...

Yukarıda anlatınları daha iyi anlamanıza yardımcı olabilecek bir adet resim aşağıda verilmiştir.




Burada S1, S2, S3 servlettir. F1, F2, F3 filtredir. Okların akış yönü tarayıcının isteğinden - request - sunucuya ve ilgili web bileşenlere doğrudur.

Kaynaklar:
  1. http://java.sun.com/products/servlet/Filters.html
  2. http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html?page=1

1 yorum:

Adsız dedi ki...

Paylaşımın için teşekkürler, üstad.