مصدر المقال: Silicon Valley Power الكاتب: الدعامة الأساسية
1. مقدمة
يعد EJB (Enterprise JavaBeans) محتوى متقدمًا نسبيًا في برمجة Java، وهو أيضًا عتبة مبرمجي Java للتقدم من مستوى الدخول إلى مستوى الخبراء. يتمثل الاختلاف الكبير بين مبرمج Java المعتمد من SUN (SCJP) ومطور Java المعتمد من SUN (SCJD) في أن SCJP لا يخضع لاختبار EJB، بينما يقوم SCJD بذلك. نظرًا لأن المزيد والمزيد من المؤسسات تعتمد منصة J2EE لتطوير أنظمة تطبيقات التجارة الإلكترونية، فقد أصبح تطوير EJB مشكلة يجب على مبرمجي Java اليوم مواجهتها.
تقدم هذه المقالة أولاً المبادئ الأساسية لتطبيقات الكائنات الموزعة العامة بشكل روتيني، ثم تبدأ بالتنزيل الأساسي والتثبيت والتكوين، وتقدم تدريجيًا طريقة برمجة EJB، مما يجعل تعلم EJB أمرًا سهلاً ومثيرًا للاهتمام.
2. برنامج الكائنات الموزعة النموذجي
سواء كانت CORBA أو RMI، فإن استراتيجيات تنفيذ الكائنات الموزعة متشابهة. يمكننا استخدام مثال برنامج بسيط لمحاكاة تكوين برنامج الكائنات الموزعة.
يحاكي هذا المثال عملية طلب خصائص الكائن عن بعد. يوجد كائن بعيد Dog على الشبكة، ونحن الآن بحاجة إلى الحصول على سمة اسمه (strName). يقوم البرنامج بإعداد فئة كعب روتين (Dog_Stub) على جانب العميل ويبدأ فئة هيكلية (dog_Skeleton) على جانب الخادم. تقوم كلا الفئتين بتنفيذ واجهة Dog_Stub وDog_Skeleton عن بعد من خلال المقبس. عندما يرسل برنامج العميل DogClient طلبًا إلى Dog_Stub للحصول على سمة الاسم، يرسل كائن Dog_Stub اسم الطريقة "getName ()" كسلسلة إلى كائن Dog_Skeleton البعيد من خلال المقبس بعد أن يتلقى كائن Dog_Skeleton هذه السلسلة ينفذ المحتوى طريقة getName () لكائن DogServer للحصول على اسم الكلب، ثم يعيده إلى كائن DogStub من خلال المقبس. يتم تنفيذ العملية بأكملها من خلال الشبكة، ولكن بالنسبة لبرنامج العميل DogClient، فهو لا يعرف مكان وجود كائن Dog الحقيقي، أو حتى يعرف أن هذه العملية قد مرت عبر الشبكة، فهو يعرف فقط أن طلب الحصول على سمة الاسم وقد حصل على نتيجة مرضية.
في الواقع، تنفيذ CORBA أو Java RMI يشبه هذا، لكنه أقل بساطة بكثير. هذا البرنامج مفيد لتوضيح آلية تنفيذ تطبيقات الكائنات الموزعة.
الكود المصدري للبرنامج هو كما يلي:
FileDog.java
الواجهة العامة للكلب
{
سلسلة getName () العامة تطرح استثناءً؛
}/* كلب */
FileDogClient.java
الطبقة العامة DogClient
{
يلقي الفراغ الرئيسي العام (String[] args) استثناءً
{
كلب كلب = جديد Dog_Stub();
String strName = dog.getName();
System.out.println( "الاسم: " + strName );
}//رئيسي()
}/*عميل الكلب*/
FileDogServer.java
يقوم DogServer من الفئة العامة بتنفيذ Dog
{
اسم السلسلة؛
كثافة العمليات؛
سلسلة getName () العامة تطرح استثناءً
{
إرجاع اسم السلسلة؛
}//الحصول على الاسم ()
DogServer العام (سلسلة strNameInput)
{
strName = strNameInput;
}//DogServer()
يلقي الفراغ الرئيسي العام (String[] args) استثناءً
{
New Dog_Skeleton(new DogServer("TOMCAT" ));
}//رئيسي()
}/* دوج سيرفر */
ملف Dog_Skeleton.java
استيراد java.io.*;
استيراد java.net.*;
الطبقة العامة Dog_Skeleton تمتد الموضوع
{
static ServerSocket ss = null;
DogServer ds;
يطرح Dog_Skeleton العام (DogServer dsInput) استثناءً
{
ds = dsInput;
إذا (SS==فارغة)
ss = new ServerSocket(8000);
this.start();
}//Dog_Skeleton()
تشغيل الفراغ المتزامن العام ()
{
يحاول
{
بينما (ss != null)
{
مقبس المقبس = ss.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
String strMethodName = ( String )ois.readObject();
إذا ( strMethodName.equals( "getName()" ) )
oos.writeObject( ds.getName() );
oos.flush();
ois. Close();
oos. Close();
المقبس. إغلاق ()؛
}//بينما
}//يحاول
قبض (استثناء ه)
{
printStackTrace();
}//يمسك
}//يجري()
}/* هيكل_الكلب */
FileDog_Stub.java
استيراد java.io.*;
استيراد java.net.*;
الطبقة العامة Dog_Stub تنفذ Dog
{
مقبس المقبس
ObjectOutputStream oos;
ObjectInputStream ois;
يطرح Dog_Stub () العام استثناءً
{
المقبس = مقبس جديد ("wudi"، 8000)؛
Oos = new ObjectOutputStream(socket.getOutputStream());
Ois = new ObjectInputStream(socket.getInputStream() );
}//Dog_Stub()
سلسلة getName () العامة تطرح استثناءً
{
Oos.writeObject( "getName()");
Oos.flush();
return (String)ois.readObject();
}//الحصول على الاسم ()
}/* Dog_Stub */
عند تشغيل برنامج الكائنات الموزعة هذا، قم أولاً بتشغيل DogServer، ثم قم بتشغيل DogClient على العميل لرؤية النتائج.