11. نسخهٔ ۶ – ادغام لایهٔ وب در معماری سهلایه JSF / EJB
11.1. معماری برنامه
معماری اپلیکیشن وب قبلی به شرح زیر بود:
![]() |
ما لایه شبیهسازیشده [métier] را با لایههای [métier, DAO, jpa] که توسط EJB در بخش 7.1 پیادهسازی شدهاند، جایگزین میکنیم:
![]() |
11.2. پروژه NetBeans برای لایه وب
پروژه NetBeans برای نسخه وب ۲ با کپی کردن پروژه قبلی ایجاد میشود:
![]() |
- [1]: پروژه جدید را کپی کرده و آن را در برگه [Projects] جایگذاری کنید،
- [2]: برای آن نامی انتخاب کرده و پوشه آن را تنظیم کنید،
- [3]: پروژه ایجاد شد،
پروژه جدید همان نام پروژه قبلی را دارد. آن را تغییر میدهیم:
![]() |
- [4]: ما در حال تغییر نام پروژه هستیم،
- [5]: ما در حال تغییر نام آن هستیم، و همچنین نام artifactID.
ما چند تغییر باید انجام دهیم تا این لایه وب را با محیط جدیدش تطبیق دهیم: لایه شبیهسازیشده [metier] باید با لایه [metier, DAO, jpa] از سرور ساختهشده در بخش 7.1 جایگزین شود. برای این کار، دو مرحله انجام میدهیم:
- ما بستههای [exception, metier, jpa] را که در پروژه قبلی موجود بودند، حذف میکنیم.
- برای جبران این حذف، پروژهٔ سرور EJB را که در بخش 7.1 ساخته شده است، به وابستگیهای پروژهٔ وب اضافه میکنیم.
![]() |
- در [1]، یک وابستگی به پروژه اضافه میکنیم،
- در [2]، پروژه Maven را برای لایه [métier] انتخاب میکنیم. در [3]، نوع آن را مشخص میکنیم و در [4]، دامنه آن را تعیین میکنیم. این provided است تا نشان دهد که این وابستگی (provided) توسط محیط کاری خود به ماژول وب ارائه خواهد شد. به زودی خواهیم دید که این وابستگی توسط یک برنامه کاربردی سازمانی ارائه میشود،
- در [5]، وابستگی اضافه شده است.
بنابراین فایل [pom.xml] به شرح زیر است:
<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>
اکنون میتوانیم بستههایی را که دیگر مورد نیاز نیستند از لایه [métier] حذف کنیم:
![]() |
همچنین باید کد مربوط به bean [Form.java] را اصلاح کنیم:
public class Form {
public Form() {
}
//لایه کسبوکار
private IMetierLocal metier=new Metier();
// fields of the form
...
خط ۷ قبلاً لایه شبیهسازیشده [métier] را نمونهسازی کرده بود. اکنون باید به لایه واقعی [métier] ارجاع دهد. کد قبلی به صورت زیر درمیآید:
public class Form {
public Form() {
}
//لایه کسبوکار
@EJB
private IMetierLocal metier;
// fields of the form
در خط ۷، تگ @EJB به کانتینر سرولت، که لایه وب را اجرا میکند، دستور میدهد تا در فیلد metier از لایه ۸ تزریق کند، کلاس EJB را که رابط محلی IMetierLocal را پیادهسازی میکند.
چرا رابط محلی IMetierLocal به جای رابط IMetierRemote؟ زیرا لایه وب و لایه EJB در همان JVM اجرا میشوند:
![]() |
کلاسهای موجود در کانتینر سرولت میتوانند مستقیماً به کلاسهای EJB در کانتینر EJB ارجاع دهند.
به همین سادگی. لایه وب ما آماده است. این تبدیل ساده بود زیرا ما با دقت لایه [métier] را با استفاده از کلاسی که با رابط IMetierLocal پیادهسازیشده توسط لایه واقعی [métier] مطابقت داشت، شبیهسازی کرده بودیم.
11.3. پروژه NetBeans برای برنامهٔ سازمانی
یک برنامه کاربردی سازمانی امکان استقرار همزمان لایه [web] و لایه EJB یک برنامه را به ترتیب در کانتینر سرولت و کانتینر EJB فراهم میکند.
ما به شرح زیر عمل میکنیم:
![]() |
- در [1]، یک پروژه جدید ایجاد کنید
- در [2]، دسته [Maven] را انتخاب کنید
- در [3]، نوع [Enterprise Application] را انتخاب میکنیم
- در [4]، نام پروژه را وارد کنید
![]() |
- در [5]، ما جاوا EE نسخهٔ ۶ را انتخاب میکنیم
- به [6]؛ یک پروژهٔ تجاری میتواند شامل حداکثر دو نوع ماژول باشد:
- یک ماژول EJB
- یک ماژول وب
هنگام ایجاد پروژه سازمانی، میتوانید درخواست ایجاد این دو ماژول را بدهید که در ابتدا خالی خواهند بود. یک پروژه سازمانی تنها برای استقرار ماژولهایی که بخشی از آن را تشکیل میدهند، کاربرد دارد. به جز این، آن یک پوسته خالی است. در اینجا، ما میخواهیم استقرار دهیم:
- یک ماژول وب موجود، [mv-pam-jsf2-alone]. بنابراین نیازی به ایجاد یک ماژول وب جدید نیست.
- یک ماژول موجود EJB ([mv-pam-ejb-metier-dao-eclipselink]). در اینجا نیز نیازی به ایجاد یک ماژول جدید نیست.
در [6]، ما در حال ایجاد یک پروژه سازمانی بدون هیچ ماژولی هستیم. ما بعداً ماژولهای وب و EJB آن را اضافه خواهیم کرد.
- در [7]، دو پروژه Maven ایجاد شدهاند. پروژه سازمانی (enterprise project) همان پروژهای است که پسوند «ear» را دارد. پروژه دیگر یک پروژه Maven والد (parent) برای پروژه اول است. ما با این پروژه کار نخواهیم کرد.
ما در حال افزودن ماژول وب و ماژول EJB به پروژه سازمانی هستیم:
![]() |
- در [1]، یک وابستگی جدید اضافه کنید،
- در [2]، پروژه EJB [mv-pam-ejb-metier-dao-eclipselink] اضافه شده است. توجه داشته باشید که نوع آن ejb است،
- در [3]، پروژه وب [mv-pam-jsf2-ejb] اضافه شده است. نوع آن را توجه کنید: war.
فایل [pom.xml] سپس به شرح زیر است:
<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]، اطمینان حاصل کنید که پایگاه داده MySQL [dbpam_eclipselink] وجود دارد و دادهها در آن بارگذاری شده است. پس از انجام این کار، میتوانیم برنامه سازمانی [mv-pam-webapp-ear] را مستقر کنیم:
![]() |
- در [1]، اپلیکیشن سازمانی مستقر شده است
- به [2]؛ برنامه سازمانی [mv-pam-webapp-ear] با موفقیت مستقر شده است.
در مرورگر، صفحه زیر ظاهر میشود:
![]() |
- در [1]، URL درخواستی
- به [2]؛ فهرست کارکنان با رکوردهای جدول [Employes] در پایگاه داده dbpam تکمیل شده است.
از خوانندگان دعوت میشود تا آزمایشها را برای نسخه وب شمارهٔ ۱ تکرار کنند. در اینجا نمونهای از خروجی آورده شده است:












