Richfaces Sorunsalı

Richfaces’i ilk kullanmaya Seam-gen ile başladım. Seam-gen, Seam fremawork’ü için geliştirilmiş bir araç. Yaptığı şey sizin için projenizi belirli bir yere kadar hazırlamak. Belirli bir yer derken Entity sınıflarınız için CRUD ekranlarının hazırlanmasını kastediyorum. Bunu yaparkende yine JBoss dağıtımı olan Richfaces kullanıyor. Bende ilk kullanmaya bu şekilde başladım. Genel olarak memnun olsamda bu bana hiç bir sorun çıkarmıyor demek değil. Öncelikle Seam-Gen kullanmak bir şirket politikası olduğundan Seam 2 versyionuna takılmış durumdayız. Seam 2 versiyonununda JSF 1.2’ye takıldığını düşünecek olursak benim neden Richfaces’te sorunlar yaşadığımı daha iyi anlayabilirsiniz.

Richfaces JSF 1.2’yi destekliyor. Fakat desteklediği version 3.3.3. Şu anda projenin 4.3.0 versiyonunun çıktığını düşünecek olursanız, version 3.3.3’te ne kadar çok bug olacağını tahmin edebiliyorsunuzdur. Üstelik yayımlandığından bu yana güncellenen internet tarayıcılarını saymıyorum bile. İşte tüm bunları göz önüne alarak, kendi yaşadığım büyük sorunları ve bunların küçük çözümlerini buradan paylaşmayı yazılım camiasına bir borç bildim.

Büyük Sorunlar ve Küçük Çözümleri

Öncelikle sorunlarımın ne olduğunu anlatmak istiyorum. Çözümleri basit bile olsa, sizin sorunlarınızla uyup uymadığını bilmelisiniz.

Internet Explorer 9 Sorunu

Her web uygulaması geliştiren kişi internet explorer’dan dert yanmıştır.Tam projenizi yaparsınız herşey hazırdır, birden aklınıza yöneticinizin hala internet explorer kullandığı gelir. Tabi siz işinizi bitirdiğinizde internet explorer üzerinden test edilecektir. Bunu hatırlar hatırlamaz açar bakarsınız ve gördüğünüz şeye inanamazsınız. Herşey gayet düzgün görnmektedir. [pullquote3 quotes=”true” align=”right”]Internet Explorer 9’da, ajax ile “reRender” ederken, elemanların kaybolması sorunsalı[/pullquote3]Tüm css’ler yerli yerindedir. Fakat tabi bu işleri uzun zamandır yaptığınız için görüntünün şaşırtıcı olabileceğini bilirsiniz. Bundan dolayı en yakın CRUD ekranını açarsınız ve Entity’nizi yaratmaya başlarsınız. Tam ajax yapılarınız çalıştığı ve form elemanlarınızın tekrardan render edildiği sırada sorunu görürsünüz. Sevgili internet explorer 9 ( bakın 8 değil, 7 değil, 9! Neden? Bende bilmiyorum.), reRender ettiğiniz yani güncellemek istediğiniz form elemanlarınızın yerinde olmadığını görürsünüz. Internet Explorer 9 basitçe form elemanlarınızı kaybetmiştir. Tam projenin bittiğini düşünürken birden daha nedenini bile bilmediğiniz bir sorunla karşılaşırsınız. Sorunu richfaces’ta ajax4jsf’te hatta jsf’in kendisinde ararsınız. Tabi buralardan hemen bir çözüm çıkmaz. Hatta richfaces’ın kendi forumlarına denk gelirsiniz. Bu forumlarda çözümün olmadığını bu sorunun 4.x versiyonunda kaldırıldığını söylerler. Doğal olarak çıldırırsınız. Peki çözümü var mıdır? Elbette

Çözümü

Çözümünü çok uzaklarda aramanıza gerek yok. Deneyimli bir PHP uzman bir arkadaşınıza sorarakta çözümü öğrenebilirsiniz. Fakat doğrudan Java ile yazılım geliştirmeye başlamış ve burdan JSF’e geçtiyseniz bu soruna anlam veremezsiniz. Neyse daha fazla uzatmadan çözüme geçiyorum.

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" >

Yukarıdaki tagı her web sayfanızın ya da kullandığınız temel sayfanın head kısmına ilk sıradan eklerseniz sorununuz çözülecektir. Evet bu kadar küçük bir şey bile sorununuzu çözecektir. Eğer daha önceden web uygulaması geliştirmediyseniz ya da web teknolojilerinden bir haberseniz bunu doğrudan bilmeniz pek mümkün değil. Fakat yinede aşağıdaki yollardan bunu öğrenebilirsiniz.

  • Internet Explorer 9 içerisinde F12’ye basarsanız geliştirici ekranını açacaktır. Bu ekrandan ie9’un çalışma modunu önceki sürümlerine çekebilirsiniz. Önceki bir internet explorer versiyonuna geçmenin sorununuzu çözdüğünü gördükten sonra yukarıdaki tagi bulmak çocuk oyuncağı oluyor.
  • Diğer bir araştırma yöntemi ise richfaces üzerinden. Eğer richfaces’ta uygulama geliştiriyorsanız mutlaka showcase sayfalarında dolaşmışsınızdır. Bu ekranları ie9 ile test ederseniz sorunsuz çalışacağını göreceksiniz. Yani ne kadar kendi forumlarında çözümü olmadığını söyleseler bile çözümü var. Bu showcase’in kaynak kodlarına bakmak çözüm hakkında size bilgi verecektir.

Her iki yoldan da teyit etmiş biri olarak bu çözümün çalışacağına güveniyorum.

Jquery Sorunu

Jquery heralde en çok kullanılan JavaScript kütüphanelerinden biridir. Eğer benim gibi çok fazla JavaScript bilmiyorsanız yer yer hayatınızı kurtarmıştır. Özellikle Wicket ile kod geliştirdiğim günlerde görsellik açısından hayat kurtarmaktaydı. JSF kullanmaya başladıktan hemen sonra Richfaces’ta kullanmaya başladım. [pullquote3 quotes=”true” align=”left”]Richfaces ile birlikte gelen JQuery sorunsalı.[/pullquote3]
Bu benim seçimimden çok şirketin tercihi olduğundan neden kullandığımızı da başlarda çok anlamıyordum. Neyse işte ben yine görselliği ya da bazı arayüz elemanlarını Jquery ile kotarırım sanıyordum. Önceden de biraz deneyimim yani hazır kodum olduğundan kolayda geliyordu. Ama javascript bilmeden jquery yazmak çokta kolay olmuyor hani. Herşeye rağmen richfaces olmayan ortamda kullanmak istediğim bir arayüz elemanını çalıştırmayı başardım. Dedim ki ben bunu projemede eklerim çok ta güzel çalışır. Tabi atladığım şey Richfaces’inde Jquery kullandığıydı. Doğal olarak ben kendi jquery kütüphanemi eklediğimde arayüz sapıtıyordu. Bu durumda ya richfaces’a benim Jquery kütüphanemi kullanmasını söyleyecektim ya da kendim Richfaces’ın kütüphanesini kullanacaktım. Acemi olduğumdan biraz işin kolayına kaçtım ve Richfaces ile gelen JQuery kütüphanesini kullanmayı seçtim. Tabi bu kullanacağınız eleman ile alakalı birşey. Eğer daha yeni bir Jquery versiyonu isteseydi pek hoş şeyler olmayacaktı.

Çözümü

Öncelikle JQuery elemanımızı kullanacağımız sayfada, kendi eklediğimiz JQuery kütüphanesini değilde, Richfaces ile gelen kütüphaneyi ekliyor. Bunu yapmak için JSF projemizde yine header kısmına aşağıdaki kod parçasını eklemeniz yeterli olacaktır.

<a4j:loadScript src="resource://jquery.js"/>

Bunu yaptıktan sonra, kullanacağınız JQuery elementinde $ fonksiyonu yerine jQuery fonksiyonunu kullanıyorsunuz. Bunu test etmek için aşağıdaki html kodunu ve scriptini kullanabilirsiniz.

HTML

<a href="">Link</a>

SCRIPT

<script type="text/javascript">
  jQuery(document).ready(function() {
    jQuery("a").click(function() {
      alert("Hello world!");
     });
  });
</script>

Bu testten sonra sorununuzun kalmadığını sizde göreceksiniz. Tabi Richfaces elemanlarınızı ve kullanacağınız JQuery elamanlarınızı doğru seçerseniz bu sorunla hiç karşılaşmayada bilirsiniz.

Son

Şimdilik benim karşılaştığım ve bana zaman kaybettirmesine rağmen küçük çözümleri olan sorunlar bu kadar. Umarım size yardımcı olabilmişimdir.

End Of Line