Spring ve Primefaces

Daha önceki yazılarımda JSF ile nasıl uygulama geliştirmeye başlanılacağını anltmıştım. Bu yazı da ise konuyu bir seviye daha ileriye taşıyıp Primefaces ve Spring kullanarak nasıl JSF uygulamaları geliştirilebileceğini anlatacağım.

BildiÄŸiniz üzere Primefaces yerli üretim, JSF bileÅŸenleri kütüphanesi. JSF’ın size saÄŸladığı bileÅŸenler ne yazık ki uygulama geliÅŸtirmek için yeterli deÄŸil. Bu sebepten JSF kullanan bir çok firma beraberinde bir de bileÅŸen kütüphanesi kullanıyor. Bu zamana kadar çalıştığım yerlerde eÄŸer JSF kullanılıyorsa beraberinde Richfaces kullanılıyordu. Fakat richfaces, Primefaces gibi hızlı geliÅŸmiyor ve daha önceki yazılarımda bahsettiÄŸim gibi Jquery ve Internet Explorer gibi sorunları mevcut. Bundan dolayı eÄŸer yeni bir projeye baÅŸlayacaksanız ya da yeni yeni JSF’e geçiÅŸ yapıyorsanız ve illa da JSF yazacağım diyorsanız bileÅŸen kütüphanesi olarak mutlaka Primefaces kullanın. BaÅŸtan belirteyim, JSF Enterprise uygulama geliÅŸtirirken bir çok durumda bize kolaylık saÄŸlasa da yine de diÄŸer alternatifleri deÄŸerlendirmenizi öneririm. Rest backend’i olan bir AngularJS uygulaması çok daha fazla iÅŸinize yarayabilir. Yine de eÄŸer JSF kullanıyorsanız Prime en iyi alternatif olarak karşımıza çıkıyor. Zaten infoq sitesinde yayınlanan bir makalede de, Primefaces’ın ne kadar önde olduÄŸunu görebiliriz.

prime_vs_others

Projenin Olusturulması

Primefaces’ı biraz anlattıktan sonra artık uygulamamızı geliÅŸtirmeye baÅŸlayabiliriz. Basit bir uygulama yapacağız. Uygulamamız sadece bir nesnenin kaydedilmesi ve kaydedilen nesnelerin gösterilmesi üzerine olacak. Primefaces Showcase‘inde olduÄŸu gibi biz de Araba(Car) nesnesi üzerinden gideceÄŸiz. Spring tarafında bir araba servisi yazıp (ICarService) ön tarafta Primefaces bileÅŸenlerini kullanarak arabaları listeleyeceÄŸiz.

Projemizi Eclipse ortamında, Maven kullanarak geliştireceğiz. Geliştirdiğimiz uygulama herhangibir servlet container üzerinde çalışabilir durumda olacak. Fakat biz işimizi kolaylaştırmak için maven üzerinden jetty kullanacağız. JDK 1.7, JSF 2.2 ve Primefaces 5.0 kullanacağız.

Maven

Projeden kısaca bahsettiğimize göre Maven ile projeyi oluşturmaya başlayabiliriz. Maven ile, maven-archetype-webapp  archetpye’ını kullanarak projemizi oluşturuyoruz. Benim örneği yaparken kullandığım diğer bilgiler aşağıdaki gibidir.

  • Group Id: com.bahadirakin
  • Artifact Id:spring-prime

Projemiz oluştuğuna göre, projemizin bağımlılılarını ekleyebilir ve nasıl build olacağını belirleyebiliriz. Bunun için spring-prime klasörünün altındaki pom.xml dosyasını aşağıdaki şekilde değiştiriyoruz.

pom.xml

Ayarların Yapılması

Tüm bağımlılıklarımızı eklemiş olduk. Şimdi ise src/main/webapp/WEB-INF dosyasının altındaki web.xml dosyasının içeriğini aşağıdaki gibi değiştirelim.

web.xml

Burada hem Spring tanımlamalarını hemde JSF tanımlamalarını yapmış olduk. Åžimdi JSF’ın son ayarlarını yapalım. Bunun için src/main/webapp/WEB-INF dosyasının altına faces-config.xml dosyasını oluÅŸturuyoruz ve içeriÄŸini aÅŸağıdaki gibi yapıyoruz.

faces-config.xml

Bu dosyada dikkat etmeniz gereken kıssımlar;

  • EÄŸer spring ve JSF’i birlikte kullanacaksanız, JSF kısmında da Spring’in el-resolver’ını kullanmanız yerinde olacaktır. El-resolver bildiÄŸiniz gibi xhtml sayfalarında da kullanılan #{myObj.attribute} ÅŸeklindeki yazımları yorumlayan kısımdır.
  • Prime faces ile ilgil iolarak verilen exception-handler, action-listener, navigation-handler vs. hepsi opsiyoneldir. Fakat geliÅŸtirme sırasında ve sonrasında iÅŸinizi kolaylaÅŸtıracaktır. ÖrneÄŸin primefaces’ın exception handler’ını kullandığınızda hataları daha detaylı görürsünüz. Tabi kendi projenizde kendi handler’ınızı yazmanızda fayda vardır.

Spring Servislerinin Tanımlanması

Ayarlarımızı yaptığımıza göre Spring tarafında servis katmanızımızı ve modelimizi yazabiliriz. Hem web.xml içerisinde belirttiğimiz applicationContext.xml dosyamızı da daha yaratmadık. Bu sırada o dosyayıda yaratacağız. Öncelikle bahsettiğimiz Car modelimizi yaratalım. Bunun için src/main/java klasörünün altına com.bahadirakin.model paketini yaratıyoruz. Daha sonra bu paketin altına Car sınıfımızı yaratıyoruz.

Car.java

Bu klasik bir model nesnesi. EÄŸer arka tarafta JPA kullanıyor olsaydık, bu mdel DAO’larımız üzerinden veritabanına kaydedilecekti. Fakat biz örneÄŸimizi basitleÅŸtirmek adına sadece Servis katmanımızı yazacağız. Servis katmanımız rastgele bu nesnelerden üretip bize dönüş yapacak.

Servis katmanımız için öncelikle arayüzümüzü belirleyeceÄŸiz. Bunun için yine src/main/java klasörünün altına com.bahadirakin.service paketini oluÅŸturuyoruz. Daha sonra bu paketin altına ICarService.java interface’ini yaratıp içeriÄŸini aÅŸağıdaki gibi yapıyoruz.

ICarService.java

Arayüzümüzü belirlediÄŸimize göre ÅŸimdi servisimizin implementasyonunu yazabiliriz. Az önce de bahsettiÄŸim gibi bu servisi destekleyen bir DAO katmanımız olmayacak. Onun yerine PrimeFaces showcase’inde yapıldığı gibi rastgele arabalar üreteceÄŸiz. Bunun için yine com.bahadirakin.service paketinin içerisine RandomCarService sınıfını oluÅŸturuyoruz ve içeriÄŸini aÅŸağıdaki gibi yapıyoruz.

RandomCarService.java

Servislerimizi oluşturduğumuza göre şimdi applicationContext.xml dosyasını oluşturup, Spring içerisinde servisimizi tanımlayabiliriz. Bunun için src/main/resources klasörünün içerisine applicationContext.xml dosyasını oluşturuyoruz ve içeriğini aşağıdaki gibi yapıyoruz.

applicationContext.xml

Burada dikkat etmeniz gereken noktalar ise;

  • RandomCarService sınıfımız xml içerisinde Bean olarak tanımlandı. Scope’u singleton olarak belirlendi. Bu da bu servis sınıfının Application boyunca bir sefer yaratılacağı anlamına geliyor.
  • Ek olarak JSF tarafında oluÅŸturacağımız Bean’leri ManagedBean ÅŸeklinde deÄŸil de Spring’in Component’i ÅŸeklinde oluÅŸturacağız. Bunun için Spring’e hangi paketi kontrol etmesi gerektiÄŸini belirtiyoruz.

JSF

Bu zamana kadar spring tarafında servislerimizi oluÅŸturduk, spring’e hangi paketi taraması gerektiÄŸini söyledik, modelimizi oluÅŸturduk ve geri kalan tüm ayarlarımızı yaptık. Fakat web sayfası namına hiç birÅŸey yapmadık. Bu kısımda ise oluÅŸturduÄŸumuz servisleri kullanan bir sayfa ve bunu destekleyen bir bean yazacağız.

İşe Bean kısmını yazmakla başlayalım. Yazımızın başında da belirttiğimiz gibi tek sayfalık bir uygulama olacak. Basitçe bir Car nesnesi oluşturup kaydedeceğiz ve kaydeddiğimiz arabaları listeleyeceğiz. Önceden kayıtlı arabalarımız varmış gibi yapmak içinde rastgele araba üreten bir servis yazdık. Bunun için src/main/java klasörünün altına com.bahadirakin.webapp paketini oluşturuyoruz. Daha sonra bu paketin altına CarBean sınıfını oluşturuyoruz.

CarBean.java

Burada dikkat etmeniz gereken kısım ise applicationContext.xml  dosyası içerisinde com.bahadirakin.webapp paketinin taranacağını belirttiğimizden Autowired ve Component annotasyonlarımız başarılı bir şekilde çalışmaktadır.

Şimdi ise bu sınıfta yapılan işlemleri destekleyecek XHTML sayfasını oluşturalım. Bunun için src/main/webapp klasörünün altına index.xhtml sayfasını oluşturuyoruz.

index.xhtml

Son

Şimdi ise projemizin ana dizinine gelip mvn clean install jetty:run komutu ile projemizi çalıştırıyoruz. Eğer herşey düzgün şekilde ayarlandıysa http://localhost:8080 adresinden index sayfamıza erişebiliyor olmamız lazım.  Projenin kaynak kodlarına aşağıdaki adresten erişebilirsiniz.

Enf of Line