EJB分類(lèi):
1.會(huì)話(huà)bean(session bean) 負(fù)責(zé)與客戶(hù)端交互,是編寫(xiě)業(yè)務(wù)邏輯的地方,,在session bean中操作數(shù)據(jù)庫(kù)有兩種方式: •通過(guò)jdbc直接操作數(shù)據(jù)庫(kù)(不常用)
2.實(shí)體bean(會(huì)話(huà)bean)•通過(guò)entity bean完成對(duì)數(shù)據(jù)庫(kù)的操作 session bean分為有狀態(tài)(stateful)會(huì)話(huà)bean和無(wú)狀態(tài)(stateless)會(huì)話(huà)bean,。 stateless session bean: 平時(shí)使用的比較多,它的bean實(shí)例可供多個(gè)用戶(hù)使用,,所以性能比stateful session bean性能高,。前一個(gè)用戶(hù)設(shè)置的值有可能被后一個(gè)用戶(hù)所修改,所以無(wú)法保存某個(gè)用戶(hù)設(shè)置的值,,因此是無(wú)狀態(tài)的,。 stateful session bean: 使用的比較少,一個(gè)bean實(shí)例只供一個(gè)用戶(hù)使用,,性能開(kāi)銷(xiāo)大,。用戶(hù)設(shè)置的值不會(huì)被其它用戶(hù)修改,可以正確保存用戶(hù)設(shè)置的值,。典型應(yīng)用是購(gòu)物車(chē),。 它實(shí)際上數(shù)據(jù)Java持久化規(guī)范(JPA:Java Persistence API)里的技術(shù),JPA的出現(xiàn)主要是為了簡(jiǎn)化現(xiàn)有的持久化開(kāi)發(fā)工作和整合ORM(Object-Relational Mapping)技術(shù),,結(jié)束現(xiàn)在Hibernate/Toplink等ORM框架各自為營(yíng)的局面,。 3.消息驅(qū)動(dòng)bean(message-driven bean) 它是專(zhuān)門(mén)用于異步處理Java消息的組件,具有處理大量并發(fā)消息的能力,。 接口(遠(yuǎn)程接口或本地接口) 實(shí)現(xiàn)類(lèi) 實(shí)例: 接口 1 package cn.jvpy.ejb3;
2 3 public interface HelloWorld { 4 public String sayHello(String name); 5 } 實(shí)現(xiàn) HelloWorldBean.java
1 package cn.jvpy.ejb3.impl; 2 3 import javax.ejb.Remote; 4 import javax.ejb.Stateless; 5 6 import cn.jvpy.ejb3.HelloWorld; 7 8 @Stateless 9 @Remote(HelloWorld.class) 10 public class HelloWorldBean implements HelloWorld { 11 12 public String sayHello(String name) { 13 return name + " said: Hello EJB3!"; 14 } 15 16 } EJB的客戶(hù)端 EJBClient.java
1 package cn.jvpy.test; 2 3 import java.util.Properties; 4 5 import javax.naming.InitialContext; 6 import javax.naming.NamingException; 7 8 import cn.jvpy.ejb3.HelloWorld; 9 10 public class EJBClient { 11 12 public static void main(String[] args) { 13 Properties props = new Properties(); 14 // 根據(jù)不同的服務(wù)器有不同的設(shè)置,,下面是JBoss的設(shè)置 15 props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); 16 props.setProperty("java.naming.provider.url", "localhost:1099"); 17 try { 18 InitialContext ctx = new InitialContext(props); 19 HelloWorld helloWorld = (HelloWorld) ctx.lookup("HelloWorldBean/remote"); 20 System.out.println(helloWorld.sayHello("Xiao Ming")); 21 } catch (NamingException e) { 22 System.out.println(e.getMessage()); 23 } 24 } 25 26 } 上面EJBClient中對(duì)jndi的設(shè)置是硬編碼設(shè)置的,,也可以通過(guò)jndi.properties文件設(shè)置,并將該文件放到項(xiàng)目的類(lèi)路徑下面(在eclipse中可以放到源文件下,,編譯的時(shí)候會(huì)自動(dòng)編譯進(jìn)類(lèi)路徑),。 如下: 1 java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
這時(shí)在EJBClient中可以去掉13~16行,只需要如下一行,,InitialContext 會(huì)自動(dòng)在類(lèi)路徑下尋找jndi的配置文件2 java.naming.provider.url=localhost:1099 InitialContext ctx = new InitialContext();
文件分布如下 當(dāng)把上面的remote相應(yīng)的改成local的時(shí)候,,程序無(wú)法運(yùn)行,拋出EJBException,,這是因?yàn)榭蛻?hù)端并沒(méi)有發(fā)布到ejb所在的jboss中,,即客戶(hù)端與ejb在不同的JVM內(nèi)。 這時(shí)可以建立一個(gè)web工程,將要測(cè)試的本地接口工程類(lèi)加入到web工程的Java build path中,,將該工程打包成war文件部署到j(luò)boss的deploy目錄下,,然后在jsp頁(yè)面中對(duì)local接口進(jìn)行測(cè)試。 jsp頁(yè)面如下: 工程結(jié)構(gòu): 運(yùn)行結(jié)果: |
|