11. Sürüm 6 - Web katmanının 3 katmanlı bir mimariye entegrasyonu JSF / EJB
11.1. Uygulama mimarisi
Önceki web uygulamasının mimarisi şu şekildeydi:
![]() |
Simüle edilen [métier] katmanını, 7.1. paragrafta EJB ile uygulanan [métier, DAO, jpa] katmanlarıyla değiştiriyoruz:
![]() |
11.2. Web katmanının NetBeans projesi
Web sürümü 2'nin NetBeans projesi, önceki projenin kopyalanmasıyla elde edilir:
![]() |
- [1]: yeni proje kopyalanır ve [Projects] sekmesine yapıştırılır,
- [2]: Projeye bir ad verilir ve klasörü belirlenir,
- [3]: proje oluşturuldu,
Yeni proje, eskisiyle aynı adı taşıyor. Bunu değiştiriyoruz:
![]() |
- [4]: Projenin adını değiştiriyoruz,
- [5]: Bu projenin adını ve artifactID projesinin adını değiştiriyoruz.
Bu web katmanını yeni ortamına uyarlamak için yapmamız gereken çok az değişiklik var: simüle edilen [metier] katmanı, 7.1. paragrafında oluşturulan sunucudaki [metier, DAO, jpa] katmanıyla değiştirilmelidir. Bunun için iki şey yapıyoruz:
- önceki projede bulunan [exception, metier, jpa] paketlerini siliyoruz.
- Bu silme işlemini telafi etmek için, web projesinin bağımlılıklarına 7.1. paragrafta oluşturulan EJB sunucu projesini ekliyoruz.
![]() |
- [1] projesine bir bağımlılık ekliyoruz,
- [2]'te, [métier] katmanının Maven projesini seçiyoruz. [3]'te türünü, [4]'te ise kapsamını belirtiyoruz. Kapsam, provided olarak belirlenir; bu, söz konusu bağımlılığın (provided) çalışma ortamı tarafından web modülüne sağlanacağını belirtir. Yakında göreceğimiz üzere, bu bağımlılık bir kurumsal uygulama tarafından sağlanacaktır;
- [5] olarak bağımlılık eklenmiştir.
[pom.xml] dosyası şu şekildedir:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
<type>ejb</type>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
Artık artık gerekli olmayan [métier] katmanındaki paketleri silebiliriz:
![]() |
Ayrıca [Form.java] bean'inin kodunu da değiştirmemiz gerekiyor:
public class Form {
public Form() {
}
// iş mantığı katmanı
private IMetierLocal metier=new Metier();
// form alanları
...
- satırda simüle edilmiş [métier] katmanı oluşturuluyordu. Artık bu satır, gerçek [métier] katmanına referans vermelidir. Önceki kod şu şekilde değiştirilir:
public class Form {
public Form() {
}
// iş katmanı
@EJB
private IMetierLocal metier;
// form alanları
- satırda, @EJB açıklaması, web katmanını çalıştıracak servlet konteynerine, 8. katmanın metier alanına, yerel arayüz IMetierLocal'i uygulayan EJB'i enjekte etmesini söyler.
Neden IMetierRemote arayüzü yerine IMetierLocal yerel arayüzü? Çünkü web katmanı ve EJB katmanı aynı JVM içinde çalışır:
![]() |
Servlet konteynerindeki sınıflar, EJB konteynerindeki EJB sınıflarına doğrudan başvurabilir.
Hepsi bu kadar. Web katmanımız hazır. Dönüşüm işlemi kolay oldu, çünkü [métier] katmanını, gerçek [métier] katmanı tarafından uygulanan IMetierLocal arayüzüne uyan bir sınıfla simüle etmeyi ihmal etmemiştik.
11.3. Kurumsal uygulamanın NetBeans projesi
Bir kurumsal uygulama, bir uygulamanın [web] katmanının ve EJB katmanının sırasıyla servlet kapsayıcısında ve EJB kapsayıcısında bir uygulama sunucusuna eşzamanlı olarak dağıtılmasını sağlar.
İşlem şu şekilde gerçekleştirilir:
![]() |
- [1]'te, [2] adında yeni bir proje oluşturuyoruz
- [2]'te, [Maven] kategorisini seçiyoruz
- [3]'te, [Enterprise Application] türünü seçiyoruz
- [4]'te projeye bir ad verin
![]() |
- [5]'te Java'yı seçiyoruz EE 6
- [6]'e, bir kurumsal proje en fazla iki tür modül içerebilir:
- bir EJB modülü
- bir web modülü
Kurumsal projenin oluşturulmasıyla birlikte, başlangıçta boş olacak bu iki modülün de oluşturulmasını talep edebiliriz. Bir kurumsal proje, yalnızca ona dahil olan modüllerin dağıtımı için kullanılır. Bunun dışında, boş bir kabuktur. Burada dağıtmak istediğimiz:
- mevcut bir web modülü olan [mv-pam-jsf2-alone]. Dolayısıyla yeni bir web modülü oluşturmaya gerek yoktur.
- [mv-pam-ejb-metier-dao-eclipselink] adlı mevcut bir modül. Burada da yeni bir modül oluşturmaya gerek yoktur.
[6]'te, modül içermeyen bir kurumsal proje oluşturuyoruz. Web modüllerini ve EJB'leri daha sonra bu projeye ekleyeceğiz.
- [7]'te iki Maven projesi oluşturulmuştur. Kurumsal proje, son eki "ear" olan projedir. Diğer proje ise birincisinin üst projesi olan bir Maven projesidir. Bununla ilgilenmeyeceğiz.
Web modülünü ve EJB modülünü kurumsal projeye ekliyoruz:
![]() |
- [1]'e yeni bir bağımlılık ekliyoruz,
- [2]'e, EJB ve [mv-pam-ejb-metier-dao-eclipselink] projelerini ekliyoruz. ejb türüne dikkat edelim,
- [3]'te, [mv-pam-jsf2-ejb] web projesinin eklenmesi. Bunun türü war olarak belirtilmelidir.
[pom.xml] dosyası şu şekildedir:
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
<version>${project.version}</version>
<type>ejb</type>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-pam-jsf2-ejb</artifactId>
<version>${project.version}</version>
<type>war</type>
</dependency>
</dependencies>
[mv-pam-webapp-ear] kurumsal uygulamasının dağıtımından önce, MySQL ve [dbpam_eclipselink] veritabanlarının mevcut ve doldurulmuş olduğundan emin olunmalıdır. Bu işlem tamamlandıktan sonra, [mv-pam-webapp-ear] kurumsal uygulamasını dağıtabiliriz:
![]() |
- [1]'te, kurumsal uygulama dağıtılmıştır
- [2]'te, [mv-pam-webapp-ear] kurumsal uygulaması başarıyla dağıtılmıştır.
Tarayıcıda şu sayfa görüntülenir:
![]() |
- [1] olarak, istenen URL
- [2]'e, çalışan listesi dbpam veritabanındaki [Employes] tablosundaki öğelerle doldurulmuştur.
Okuyucunun web sürümü 1'deki testleri tekrarlaması istenir. İşte bir yürütme örneği:












