แหล่งที่มาของบทความ: Silicon Valley Power ผู้แต่ง: Mainstay
1. บทนำ
EJB (Enterprise JavaBeans) เป็นเนื้อหาที่ค่อนข้างสูงในการเขียนโปรแกรม Java และเป็นเกณฑ์สำหรับโปรแกรมเมอร์ Java ที่จะเลื่อนระดับจากระดับเริ่มต้นไปจนถึงระดับผู้เชี่ยวชาญ ข้อแตกต่างที่สำคัญระหว่าง SUN Certified Java Programmer (SCJP) และ SUN Certified Java Developer (SCJD) ก็คือ SCJP จะไม่ทำการทดสอบ EJB ในขณะที่ SCJD ทำ เนื่องจากองค์กรต่างๆ หันมาใช้แพลตฟอร์ม J2EE เพื่อพัฒนาระบบแอปพลิเคชันอีคอมเมิร์ซมากขึ้นเรื่อยๆ การพัฒนา EJB จึงกลายเป็นปัญหาที่โปรแกรมเมอร์ Java ในปัจจุบันต้องเผชิญ
บทความนี้จะแนะนำหลักการพื้นฐานของแอปพลิเคชันอ็อบเจ็กต์ทั่วไปด้วยรูทีน จากนั้นเริ่มต้นด้วยการดาวน์โหลด การติดตั้ง และการกำหนดค่าพื้นฐาน และค่อยๆ แนะนำวิธีการเขียนโปรแกรม EJB ทำให้การเรียนรู้ EJB เป็นเรื่องง่ายและน่าสนใจ
2. โปรแกรมอ็อบเจ็กต์แบบกระจายทั่วไป
ไม่ว่าจะเป็น CORBA หรือ RMI กลยุทธ์ในการใช้งานอ็อบเจ็กต์แบบกระจายก็คล้ายกัน เราสามารถใช้ตัวอย่างโปรแกรมง่ายๆ เพื่อจำลององค์ประกอบของโปรแกรมอ็อบเจ็กต์แบบกระจาย
ตัวอย่างนี้จำลองกระบวนการขอคุณสมบัติของวัตถุจากระยะไกล มี Dog วัตถุระยะไกลบนเครือข่าย และตอนนี้เราต้องได้รับแอตทริบิวต์ชื่อ (strName) โปรแกรมตั้งค่าคลาส stub (Dog_Stub) บนฝั่งไคลเอ็นต์และเริ่มคลาสโครงกระดูก (dog_Skeleton) บนฝั่งเซิร์ฟเวอร์ ทั้งสองคลาสใช้อินเทอร์เฟซ Dog Dog_Stub และ Dog_Skeleton สื่อสารจากระยะไกลผ่าน Socket เมื่อโปรแกรมไคลเอ็นต์ DogClient ส่งคำขอไปยัง Dog_Stub เพื่อรับแอตทริบิวต์ name วัตถุ Dog_Stub จะส่งชื่อเมธอด "getName()" เป็นสตริงไปยังวัตถุ Dog_Skeleton ระยะไกลผ่าน Socket หลังจากที่วัตถุ Dog_Skeleton ได้รับสตริงนี้ จะดำเนินการ content ดำเนินการเมธอด getName() ของอ็อบเจ็กต์ DogServer เพื่อรับชื่อของ Dog จากนั้นส่งคืนไปยังอ็อบเจ็กต์ DogStub ผ่านทางซ็อกเก็ต กระบวนการทั้งหมดถูกนำไปใช้ผ่านเครือข่าย แต่สำหรับโปรแกรมไคลเอนต์ DogClient นั้นไม่รู้ว่าวัตถุ Dog ที่แท้จริงอยู่ที่ไหน หรือแม้แต่รู้ว่ากระบวนการนี้ได้ผ่านเครือข่ายแล้ว มันรู้เพียงว่าคำขอเพื่อรับแอตทริบิวต์ชื่อเท่านั้น ก็ได้รับผลอันเป็นที่น่าพอใจ
ในความเป็นจริง การใช้งาน CORBA หรือ Java RMI ก็คล้ายคลึงกับสิ่งนี้ แต่ง่ายกว่ามาก โปรแกรมนี้มีประโยชน์สำหรับการอธิบายกลไกการทำงานของแอปพลิเคชันออบเจ็กต์แบบกระจาย
ซอร์สโค้ดของโปรแกรมมีดังนี้:
FileDog.java
สุนัขอินเทอร์เฟซสาธารณะ
-
สตริงสาธารณะ getName() พ่นข้อยกเว้น;
}/* สุนัข */
FileDogClient.java
DogClient คลาสสาธารณะ
-
โมฆะคงที่สาธารณะ main ( String[] args ) พ่นข้อยกเว้น
-
สุนัข สุนัข = ใหม่ Dog_Stub();
สตริง strName = dog.getName();
System.out.println( "ชื่อ: " + strName );
}//หลัก()
}/* DogClient */
FileDogServer.java
DogServer ระดับสาธารณะใช้งาน Dog
-
สตริง strName;
int intAge;
สตริงสาธารณะ getName() พ่นข้อยกเว้น
-
กลับ strName;
}//getName()
DogServer สาธารณะ ( สตริง strNameInput )
-
strName = strNameInput;
}//เซิร์ฟเวอร์สุนัข()
โมฆะคงที่สาธารณะ main ( String[] args ) พ่นข้อยกเว้น
-
ใหม่ Dog_Skeleton( DogServer ใหม่ ( "TOMCAT" ) );
}//หลัก()
}/* DogServer */
ไฟล์ Dog_Skeleton.java
นำเข้า java.io.*;
นำเข้า java.net.*;
Dog_Skeleton คลาสสาธารณะขยายเธรด
-
ServerSocket ss แบบคงที่ = null;
DogServer ds;
Dog_Skeleton สาธารณะ (DogServer dsInput) ส่งข้อยกเว้น
-
ds = dsอินพุต;
ถ้า(ss==null)
ss = ServerSocket ใหม่ (8000);
นี้.เริ่มต้น();
}//สุนัข_โครงกระดูก()
การรันโมฆะแบบซิงโครไนซ์สาธารณะ ()
-
พยายาม
-
ในขณะที่ ( เอสเอส != null )
-
ซ็อกเก็ตซ็อกเก็ต = ss.accept ();
ObjectInputStream ois = ObjectInputStream ใหม่ ( socket.getInputStream () );
ObjectOutputStream oos = ObjectOutputStream ใหม่ ( socket.getOutputStream () );
สตริง strMethodName = ( สตริง )ois.readObject();
ถ้า ( strMethodName.equals( "getName()" ) )
oos.writeObject( ds.getName() );
oos.ฟลัช();
ois.ปิด();
oos.ปิด();
ซ็อกเก็ต.ปิด();
}//ในขณะที่
}//พยายาม
จับ (ยกเว้น e)
-
e.printStackTrace();
}//จับ
}//วิ่ง()
}/* สุนัข_โครงกระดูก */
FileDog_Stub.java
นำเข้า java.io.*;
นำเข้า java.net.*;
Dog_Stub คลาสสาธารณะใช้งาน Dog
-
ซ็อกเก็ตซ็อกเก็ต;
ObjectOutputStream oos;
ObjectInputStream ois;
Dog_Stub() สาธารณะพ่นข้อยกเว้น
-
ซ็อกเก็ต = ซ็อกเก็ตใหม่ ( "wudi", 8000 );
Oos = ObjectOutputStream ใหม่ ( socket.getOutputStream () );
Ois = ObjectInputStream ใหม่ ( socket.getInputStream () );
}//สุนัข_Stub()
สตริงสาธารณะ getName() พ่นข้อยกเว้น
-
Oos.writeObject( "getName()" );
Oos.ฟลัช();
กลับ (สตริง)ois.readObject();
}//getName()
}/* Dog_Stub */
เมื่อรันโปรแกรมอ็อบเจ็กต์แบบกระจายนี้ ให้รัน DogServer ก่อน จากนั้นรัน DogClient บนไคลเอนต์เพื่อดูผลลัพธ์