Archive for the ‘JavaServer Faces JSF’ Category

ORM Nedir?

Temmuz 24, 2013

ORM, Object Relational Mapping anlamına gelmektedir. O/R Mapping olarakta yazılabilir. ORM nedir diye bir soru soracak olursak şöyle bir cevap verebiliriz: “İlişkisel veritabanı (RDBMS) ile nesneye yönelik programlanın (OO) arasında bir tür köprü özelliği gören ve ilişkisel veritabanındaki bilgilerimizi yönetmek için, nesne modellerimizi kullandığımız bir tekniktir/metodtur”. Basite indirgemek istersek: “Nesnelerimizi ilişkisel veritabanındaki tablomuza bağlayan ve veri alış-verişini bizim için yapan bir tekniktir/metodtur”. ORM tekniği belli bir programlama diline bağlı değildir ve her OO dilinde yazılabilir/kullanılabilir.
Günümüzde kullanılan popüler programlama dillerinde yazılmış bir çok ORM kütüphaneleri vardır. Bunlara çoğu zaman ORM araçları (ORM Tools) deniyor. Yazımın ilerleyen bölümlerinde Java dünyasında kullanılan popüler ORM araçlarına bir göz atacağız.

Popüler ORM aracları hangileridir?

Sektörde kullanılan en popüler Java ORM araçlarından bazılarını şöyle sıralayabiliriz:
Hibernate
2001 yılında Gavin King tarafından yazıldı ve şu an yazılım yönetimi JBoss şirketi tarafından yapılmaktadır. [2] Tamamen açık kaynak kodludur ve Java sektöründe en çok kullanılan ORM aracıdır. LPGL v2.1 lisansını kullanmaktadır. HQL adında (Hibernate Query Language) kendine has bir nesnesel veri çekme diline sahiptir. Criteria API içerisindeki sınıfları sayesinde bir çok işlemi SQL yazmadan yapmamıza olanak sağlamaktadır. Sınıfları, ilişkisel veritabanındaki tablolara bağlamak için hem XML hem de Anotasyon kullanır. Tüm veritabanları ile sorunsuz çalışmaktadır. JSR 220 (Enterprise Java Beans 3.0) [3] ve JSR 317 (Java Persistence 2.0) [4] spesifikasyonlarıyla tam uyumludur. Bunların yanında polymorphism, caching, otomatik transaksiyon yönetimi, lazy load etme gibi önemli özellikleri vardır.
Apache OpenJPA
JSR 220 (Enterprise Java Beans 3.0) spesifikasyonunun bir implementasyonlarından biridir. [1] Yazılımı Apache Software Foundation şirketi tarafından devam ettirilmektedir ve Apache 2.0 lisansıyla birlikte açık kaynak kodludur. JSR 220 spesifikasyonun sunduğu tüm özelliklere sahiptir. Tüm Apache serverleri ile tam uyum göstermektedir. Hibernate kadar popüler olmasada bir çok kesim tarafından kullanılmaktadır. Websphere şirketinin tercih ettiği ve kullandığı bir yazılımdır.
Toplink
Oracle şirketinin liderliğinde devam eden bir ORM aracıdır. [5] Sektörün en ileri derecede olan ORM araçlarının başında gelmektedir. Ne yazıkki açık kaynak kodlu değildir. Deneme amaçlı download edilebilir. Bu ORM aracının en dikkat çeken özelliklerinden biri hem veritabanıyla hem de XML kaynaklarıyla çalışabilmesidir. Bunun yanında tüm veritabanları ve application serverlerle uyumlu çalışabilmektedir.
Toplink ürünü altında Toplink Essentials adında bir ORM aracı vardır ve JSR 220 (Enterprise Java Beans 3.0) spesifikasyonu ile tam uyumludur. Bu araç tamamen açık kaynak kodludur. Fakat Toplink Essentials, Toplink içerisindeki tüm özelliklere sahip değildir.
EclipseLink
Eclipse Foundation şirketine bağlı olan bir ORM aracıdır ve açık kaynak kodludur. [7] Eclipse Public License ve Eclipse Distribution License lisanslarını kullanmaktadır. Oracle Toplink ürününün ortaya çıkması Oracle şirketinin Toplink ürününün 11g versiyonunu bu projeye bağışlamasıyla başlamıştır. Aslında EclipseLink bir ORM aracından çok daha geniştir. JPA, JAXB, JCA, SDO ve OSGI standartlarını desteklemektedir. EclipseLink kullanarak veritabanlarınının yanında web servisleri, object XML baglantıları ve kurumsal bilgi servisleriyle (EIS) bilgi alışverişi yapılabilir.
Apache Cayenne
Apache Software Foundation şirketinin çıkardığı bir ORM aracıdır. [8] Apache License 2.0 lisansını kullanmaktadır. ORM aracından beklenen tüm özelliklere sahiptir ve sektörde iyi bir yere gelmek için emin adımlarla devam etmektedir.
IBatis
Açık kaynak kodludur ve Apache License 2.0 lisansına sahiptir. [6] (IBatis tam olarak bir ORM aracı sayılmasa da belirtmek istedim.) IBatis bir nesne-veri aktarma aracıdır. Kullanımı çok basittir. Genellikle hazır olan bir veritabanından birebir bilgi çekmek ve bu bilgileri otomatik olarak nesnelere yazdırmak için kullanılır. Veritabanındaki tablolara bağlantı için yazılan SQL leri XML dosyaları içinde barındırıyor.
Spring Jdbc Template
Spring kütüphanesinin bir parçası olmakla beraber aynen IBatis gibi ORM aracı olmayıp veri alış-verişinde çok büyük kolaylıklar sağlamaktadır. Tamamen açık kaynak kodludur. [9]

ORM araci kullaniminda onemli tavsiyeler

Lazy loading özelliğini iyi bir şekilde kullanın. Örnek olarak, her zaman çekilmesi gerekmeyen verileri lazy olarak çekin.
Caching mekanızmasını iyi anlayın ve gereksinimlere gore değiştirin.
Çok karmaşık ORM sınıf modelleri yapmaktan kaçının.
Şunu kabul etmek gerekir ki, ORM araçları her soruna çözüm sağlamıyor. Bu nedenle bazen normal SQL kullanmak ta olağan birşeydir.
Veritabanınızdaki tablo şemanızı en iyi şekilde tasarlayın ki, nesne modeliniz ona göre uygun ve performanslı çalışsın. Kötü tasarlanmış bir veritabanı şeması, hangi ORM aracı seçilirse seçilsin efektif şekilde çalışmaz. Tavsiyem veritabanınızı iyi bir DBA (DataBase Administrator) tarafından kontrol ettirmeniz.
Verileri çekerken mümkün olduğu sürece pagination (sayfalandırma) kullanmaya çalışın. Böylelikle tüm bilgileri bir anda almanıza gerek kalmamış olacak.
Transaksiyon, concurrency batch processing ve locking mekanızmalarını, yazılımınıza en uygun şekilde configure edin.
ORM aracı kullanırken iki tür yöntemle başlıyabilirsiniz. İlki önce veritabanı hazırlanıp ardından java sınıfları hazırlanır/üretirilir. İkincisi de önce java sınıfları hazırlanıp, ardından veritabanı tasarlanır/üretilir. Ben şahsen önce veritabanı hazırlayıp, sonra java kodlarını yazıyorum/üretiyorum. Veritabanı çok önemli olduğu için, kontrolün bende olmasını istiyorum. Java sınıflarını yazarken de, bazen otomatik kod üreten program kullanıyorum, bazen de tüm sınıfları kendim yazıyorum. Tavsiyem, polymorphism veya karmaşık modeller kullanmak istiyorsanız sınıfları kendiniz hazırlanamanızdır.

JSF Nedir?

Temmuz 18, 2013

Java Server Faces web uygulamalarının arayüzünü inşa etmek için oluşturulan, yeni nesil
web uygulama çatısıdır.

Temel Özellikleri

  • Managed Beans Yönetimi
  • Bütünleşik Ajax Desteği Kullanımı
  • Bileşen Tabanlı (Component Oriented)
  • Gelişmiş EL (Expression Language) Desteği
  • Olaya Dayalı (Event Driven)
  • Durum Yönetimi(State management)
  • 3. Parti JSF Bileşenleri Kullanımı

jsf-life-cycle

Şimdi bu adımları sıralayalım;

1.Create or Restore View
2.Apply Values from User
3.Ensure Values are Valid
4.Update Model with Valid Values
5.Fetch a New View, If Necessary
6.Render View

1. Create or Restore View (Görünümü oluştur)
Bu aşama kullanıcını sayfada bir butonu ya da linki tıkladığı aşamadır.

2. Apply Values from User (Kullanıcıdan verileri al)
Bu aşamada ekrandaki değerler alınır ve bileşenler içerisinde saklanır.

3. Ensure Values are Valid – Process validations (Verilerin doğruluğunu kontrol et)
Kullanıcının girdiği değerlerin kritelerle uyup uymadığı, zorunlu alanların doldurup doldurulmadığı vb diğer işlemler bu fazda kontrol edilir, eğer herşey uygunsa bir sonraki faza geçilir, yoksa ilk faza dönülür. Mesela ilgili alana sadece sayı girilmesini istemişiz ama kullanıcı harf yazmış ya da ilgili alanı zorunlu yapmışız ama kullanıcı herhangi bir değer vermeden formu göndermiş gibi…

4. Update Model with Valid Values (Verilerle modeli güncelleştir)
Verilerin doğruluğunun bir önceki fazda kontrolünden sonra sıra artık modeli (bean, entity vb.) güncelleştirir yani formdan elde edilen verilen yapışmasını sağlar. Formdaki “name” alanına girilmiş veri “Student” sınıfının “name” alanına yapışması gibi…

5. Fetch a New View, If Necessary (Gerekliyse yeni bir görünüm oluştur)
Eğer formdaki işlemler sonucu yeni bir görünüm yaratmak istiyorsak onu oluşturur.

6. Render View (Görünümü İşle)
Son olarak web sayfasını kullanıcıya tekrardan göstermek için bu faz çalışır ve görünüm işlenmiş olur.

Managed Beans (Backing Bean) yönetimi
JSF ile ortaya çıkan bir kavramdır.Yaşam evreleri JSF IOC(Inversion Of Control) konteyner tarafından yönetilen JavaBean sınıfıdır.JSF ile hazırlanan bir sayfada birden çok Managed Bean kullanılmaktadır.JSF 2.0 ile birlikte sınıfların başında @MangedBean annotationını kullanarak ilgili beane erişim sağlanır.Daha eski versiyonlarında faces-config.xml dosyasında tanımlama yapmak gerekir.

Managed-bean-scope : faces-config.xml’e eklediğiniz bean’in ne kadar süreyle bellekte tutulacağını gösterir. 4 adet parametre alır.
a-request : Sayfa her çağırıldığında oluşturulur ve sayfa gösterimi ile sonlanır. Bir çok sayfada bu scope’u kullanırız çünkü bellekte request-response süresince kalacağı için belleğe fazla bir yük getirmez.

b-session : Kullanıcı uygulamamıza ilk eriştiğinde bir oturum açılır ve bu oturum kullanıcı tarayıcısını kapatana kadar devam eder. Bu süre içerisinde saklamak istediğimiz Bean’leri session scope’ta tutarız. Örneğin bir kullanıcı sisteme kendi hesabı (account) ile girdiğinde tarayıcısını kapatana kadar uygulamada takip edilmelidir. Bu tür işlemleri session scope’ta saklarız. Ancak unutulmamalıdır ki bu işlemin bize belli bir bellek maliyeti olacaktır. O nedenle sadece gerekli olması durumunda bu scope’u kullanmalıyız.

c-application : Bu scope uygulama başlatıldığında açılır ve uygulamayı durdurana kadar bellekte yer işgal eder. Burada aktif kullanıcı sayısını ya da kalıcı bir bağlantı nesnesini tutabilir. Uygulama başlarken veritabani bağlantısını yaratıp application’da saklarız ve gerektiğinde her yerden erişip çağırabiliriz.

d-none : Bu bean’in hiçbir scope’a ait olmadığını gösterir. Henüz hiçbir yerde kullanmadım.

http://ibrahimcatakli.com/2012/08/06/jsf/#more-25
http://jsf.kodcu.com/tr/blog
http://www.sukrucakmak.com/jsf-life-cycle/
http://www.herturbilgi.com/2013/01/jsf-java-server-faces-1/

Managed Bean Kavrami

Ocak 29, 2013

Managed Bean Kavrami

“Managed Bean” JSF ile dogan bir kavramdir, cesitli kaynaklarda “Backing Bean” olarakta gecmesine ragmen temelde ayni kavrami ifade eder. Adindan da anlasilabilecegi gibi ortada bir java bean’i var ve JSF kendi icindeki IOC(Inversion Of Control) containeri ile bu bean’in yasam dongusunu yonetiyor. Peki ne ise yariyor bu managed bean? Managed Bean genelde pratik olarak her sayfanin is mantigini ve model nesnelerini icerir. Buna benzer bir dizayni asp.net ve code behind sayfalarinda da gorebiliriz. ASP.NET den farki bir sayfada bircok managed bean kullanabilir ve managed beanlerin illaki Page gibi bir sinifi extend etmesi gerekmez. Hemen bir ornek verelim.

Ornegin sayfada outputText bilesenini kullarak bir text yazdirmak istiyoruz, bunun icin;

isimizi gorecektir, peki Hello World textini sayfada hardcoded yazmak yerine server daki kodumuzdan nasil aliriz.

Demo adli bir sinifimiz olsun;

package com.cc.blog.jsfcalistay.view;

public class Demo {

private String text = “Hello World”;

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}
}
Ve bu sinifi WEB-INF/faces-config.xml dosyasinda su sekilde tanimlayalim;

demo
com.cc.blog.jsfcalistay.view.Demo
request

managed-bean-name = JSF IOC Containerinda bean’in hangi isimle ulasilabilecegini belirler.
managed-bean-class = Uzun class ismini JSF bean’i yaratirken kullanir
managed-bean-scope = Bean yaratildiktan sonra hangi scope da duracagini belirler, gecerli degerler, request, session ve application dir.

Hepsi bu kadar, simdi Demo nesnesinin text alanini sayfada gostermek icin;

Bu kismi biraz acalim; #{demo.text} bir JSF EL(Expression Language) ornegidir ve #{expression} seklindedir. Ornekteki expression demo.text yani demo sinifinin text ozelligi. Peki bu ozellige JSF ulasirken neler oluyor

1) #{demo.text} ifadesi goruldugunde JSF en soldaki elemani yani “demo” yu cozmek icin kendi IOC containerina bakar, biz “demo” adli bir managed bean tanimladigimiz icin bu tanim JSF tarafindan bulunur
ve managed-bean-class kullanilarak Demo sinifindan bir tane nesne olusturulur. JSF demo adli bean’i ararken request, session ve application scope’a bakar.
2) Olusan Demo nesnesi request scope’a konulur, yani request basindan sayfa tekrar yenilenene kadar adi “demo” olan bir Demo nesnesi request scope da yasayacaktir. Buradaki onemli bir nokta demo’ya tekrar ulasilmak istendiginde, JSF once requestte demo adli bir nesne varmi diye kontrol eder, varsa o nesneyi döndürür yoksa yeni bir tane yaratilir. Ornegin sayfada demo adli bean’e tekrar bir referans var, , daha onceden demo yaratilip request scope’a kondugu icin tekrar yaratilmaz ve onceki döndürülür.
3) Artik demo nesnesi olustuguna gore sira text ozelligine gelir. JSF bunun icin Demonun getText metodunu cagirir, bu durumda “Hello World” texti doner ve outputText bileseni bu degeri kullanarak
text sayfada gosterilebilir.

4) Sayfa refresh edildiginde, yeni bir request olacagi icin, islem 1 den itibaren tekrar baslayacaktir. Eger bean scope’u session olsaydi, yeni bir request’te bean session da yasamaya devam edecegi icin yeniden yaratilmayacakti. Temel mantik bu aslinda, eger bean tanimlandigi scope’da yoksa, yaratilir ve scope’una konur ve scope’unun izin verdigi kadar yasar.

managed

Managed Property

Managed property ozelligi sayesinde, dekleratif olarak bir bean ozelligi tanimlanabilir, ornek olarak;

demo
com.cc.blog.jsfcalistay.view.Demo
request

text
Hello World

Bu sayede demo nesnesi JSF tarafindan yaratildiginda otomatik olarak text ozelligi “Hello World” olarak atanir. Managed-Property ile text gibi basit degiskenleri degil, collection gibi daha karmasik yapilari da xml tabanli tanimlanabilir.

Notlar:
– JSF 1.2 ve JSP 2.1 ile birlikte, bu 2 çatinin Expression Language’i birlestirildi, JSF 1.2’de # ve $ birbirleri yerine kullanilabilir.
– Facelets kullanicilari da JSF 1.1 ortaminda # ve $ kullanabilir.
– Managed Bean’lerin illaki JSF IOC Container’inda yonetilecek diye bir kaide yoktur, managed beanleri Spring kullanarak
veya seam yardimiyla ejb olarak da kullanilabilir. Gelismis jsf-spring entegrasyon ornekleri icin Ingilizce bloguma bakabilirsiniz.
Spring 2.5’le gelen annotation destegi sayesinde xml’e bulasmadan JSF beanlerini kullanmak cok avantajli.

Alıntı :
http://www.jroller.com/cagataycivicitr/entry/managed_bean_kavrami