วันพฤหัสบดีที่ 10 กุมภาพันธ์ พ.ศ. 2554

EJB คือ?

EJB - Enterprise Java Bean Architecture



EJB Component.

1. Session Bean
 เป็น Bean ที่ใช้สำหรับการทำงานตาม business logic ต่างๆ หรือ อาจเรียก session bean ว่าเป็น bean สำหรับให้บริการ
session bean แบ่งเป็น 2 ประเภทคือ
1.1. stateless session สำหรับ EJB ประเภทนี้ Application server จะไม่เก็บ State ของ client ไว้ ทำให้การทำงานใช้ทรัพยากรน้อย แต่ละ instance ของ session bean จะให้บริการ client ได้หลาย client
1.2. statefull session สำหรับ EJB ประเภทนี้ Application server จะเก็บ State ของ client ไว้ และไม่มีการใช้ instatnce ร่วมกันของ Client การให้บริการ session bean กับ client จะเป็น 1 ต่อ 1 ซึ่งจะแตกต่างจาก stateless ที่ยอมให้ Client มีการใช้ instance ของ session bean ร่วมกันได้

2. Entity Bean เป็น EJB ที่ใช้สำหรับการทำงานเกี่ยวกับ Data ซึ่งจะทำหน้าที่เป็นตัวแทนของข้อมูลในฐานข้อมูล Entity Bean แบ่งออกเป็น 2 ประเภท คือ
2.1. CMP - Entity Bean (Container-Managed Persistence Entity Bean)
2.2. BMP - Entity Bean (Bean-Managed Persistence Entity Bean)
การสร้าง Stateless Session การ implement Stateless Session Developer จะต้องประกอบไปด้วย
1. remote interface
2. home interface
3. Class สำหรับการ implement Interface
4. ส่วนที่เป็น client (JSP or servlet) เพื่อเรียกใช้งาน session bean

ตัวอย่างการสร้าง Stateless Session Bean
Remote Interface

จะต้องทำการสร้าง method ที่ทำหน้าที่เกี่ยวข้องกับการประมวลผลทาง business process โดย remote interface จะต้อง extends EJBObject. เช่น
HelloObj.java                

package test;
import java.rmi.*;
import javax.ejb.*;
public interface  HelloObj extends EJBObject {
                                String hello() throws RemoteException;
               }
               
Home Interface
Home interface จะทำหน้าที่ในการ create a remote object. ใน class นี้จะมีเพียง methods create() เท่านั้น

HelloHome.java 

package test;
import java.rmi.*;
import javax.ejb.*;

public interface   HelloHome extends EJBHome {
                                 HelloObj create() throws CreateException, RemoteException;
               }
               
Class Implement Interface
จากตัวอย่างการสร้าง interface class ข้างต้นจะต้องทำการ implement method ใน class remote inteface สำหรับตัวอย่างนี้จะต้อง implement method hello() ดังนี้

HelloBean.java 

package test;
import java.rmi.*;
import javax.ejb.*;
import com.caucho.ejb.*;

public class HelloBean extends AbstractSessionBean {
               // no initialization needed
               public void ejbCreate() {
               }
               public String hello() {
                             return "Hello, world";
               }
}
               
จะได้ session bean แบบ stateless แล้วครับ จากนั้นก็มาสร้าง client หรือ ส่วนเรียกใช้งาน session bean ข้างต้น ตัวอย่างนี้จะให้เรียกจาก jsp

Client


สร้าง client ขึ้นมาเพื่อการร้องขอใช้บริการ หรือ เรียกใช้ EJB มีลำดับขั้นตอนการทำงาน คือ

1 . สร้าง home handle สำหรับ remote home.
2. หา home stub โดยอาศัย home handle ที่ได้จากข้อ 1
3. สร้าง remote stub โดยอาศัย home object ที่ได้จากข้อ 2
4. Client เรียกใช้งาน business process หรื method ต่างๆ ใน remote interface ที่เตรียมไว้.

EJB client จะหา home handle ได้จากการช่วยเลือของ JNDI.
ตัวอย่างต่อไปนี้จะแสดงให้เห็นถึงการเรียกใช้งาน EJB โดย JSP ซึ่งจะทำหน้าที่เป็น EJB client และเรียกใช้ method hello ของ EJB ที่ได้เตรียมไว้ด้านบนดังตัวอย่างการ เขียน JSP ได้ดังนี้

hello-ejb.jsp 

<%@ page import="com.caucho.burlap.*, test.*, javax.ejb.*" %>

<%

String url = "http://localhost:8080/ejb/hello";

// create the home handle
HomeHandle homeHandle = new BurlapHomeHandle(url);

// get the home stub
HelloHome home = (HelloHome) homeHandle.getEJBHome();

// create the remote object
HelloObj hello = (HelloObj) home.create();

%>

message: <%= hello.hello() %>



ตัวอย่างการสร้าง Stateless Local Session Remote Interface
การทำงานจะคล้ายกับ EJB ในตัวอย่างข้างต้น แต่จะทำการ extends EJBLocalObject แทน EJBObject.
CounterLocal.java 
package test;
import javax.ejb.*;

public interface CounterLocal extends EJBLocalObject {
int hit();
}

Local Home Interface
จะใช้สำหรับการสร้าง counter instance และจะมีเพียง create() methods เท่านั้น

CounterLocalHome.java 
package test;
import javax.ejb.*;

public interface CounterLocalHome extends EJBLocalHome {
CounterLocal create() throws CreateException;
}

Class สำหรับการ implement 
CounterBean.java 
package test;
import javax.ejb.*;
import com.caucho.ejb.*;

public class CounterBean extends AbstractSessionBean {
int count;

// no initialization needed
public void ejbCreate()
{
}
public int hit()
{
return ++count;
}
}

Client
สร้าง client ขึ้นมาเพื่อการร้องขอ หรือ เรียกใช้ EJB มีลำดับขั้นตอนการทำงาน คือ
1. หา home stub ด้วยการเรียกใช้บริการจาก JNDI.
2. สร้าง local stub โดยอาศัย home object ที่ได้จากข้อ 1.
3. Client เรียกใช้งาน business process จาก Object ที่ได้. 

counter.jsp 
<%@ page import="test.*, javax.ejb.*, javax.naming.*" %>
<%!
CounterLocalHome home;

// Get the home stub once and save it in home
public void _jspInit()
throws ServletException
{
try {
Context env = (Context) new InitialContext().lookup("java:comp/env");

home = (CounterLocalHome) env.lookup("local-ejb/counter");
} catch (NamingException e) {
e.printStackTrace();
}
}
%><%

// create the remote object
CounterLocal counter = home.create();
%>
hit: <%= counter.hit() %><br/>
hit: <%= counter.hit() %>



ตัวอย่าง Entity Bean
 

Home.java 
package test;
import java.rmi.*;

public interface Home extends javax.ejb.EJBHome {
public String hello() throws RemoteException;

public int add(int a, int b) throws RemoteException;
public HomeObj findByPrimaryKey(String a)
throws RemoteException, FinderException;
}

HelloObj.java 
package test;
public interface HelloObj extends javax.ejb.EJBObject {
}

HelloBean.java 
package test;
import javax.ejb.*;

public class HelloBean extends com.caucho.ejb.AbstractEntityBean {
public String ejbHomeHello()
{
return "Hello, world";
}

public int ejbHomeAdd(int a, int b)
{
return a + b;
}

public String ejbFindByPrimaryKey(String key)
throws FinderException
{
throw new FinderException("no children");
}
}

Servlet Implementation

The client in this example is a servlet. As with other EJBs, the client gets the home interface using JNDI. Since it's only necessary to do the JNDI lookup once, the servlet caches the home object as a servlet variable.

package test.entity.home;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import javax.ejb.*;
import javax.naming.*;

public class HomeServlet                extends GenericServlet {
               Home home;
 public void init() throws ServletException {
               try {
                               Context env = (Context) new InitialContext().lookup("java:comp/env");
                               home = (Home) env.lookup("ejb/home");
                               } catch (Exception e) {
                              throw new ServletException(e);
                     }
               }
 public void service(ServletRequest  req, ServletResponse res) throws IOException, ServletException {
               PrintWriter pw = res.getWriter();
               
               try {
                              pw.println("message: " + home.hello() + "");
                              pw.println("1 + 3 = " + home.add(1, 3) + "");
                              pw.println("7 + 1 = " + home.add(7, 1) + "");
                              } catch (Exception e) {
                              throw new ServletException(e);
                     }
     }
}

credit :  http://www.itmelody.com/tu/ejb.htm