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