Tomcat JSP調(diào)用JBoss布署的EJB遠程方法
?
王偉東
?
?? EJB技術(shù)的基礎(chǔ)是另外兩種技術(shù):RMI-IIOP和JNDI。要想了解EJB,一定要先了解RMI-IIOP和JNDI。
Java?RMI-IIOP
????Java?RMI-IIOP(Java?Remote?Method?Invocation?over?the?Internet?Inter-ORB?Protocol)是J2EE的網(wǎng)絡(luò)機制。Java?RMI-IIOP允許你編寫分布式對象,使得對象的通信范圍能夠在內(nèi)存中,跨Java虛擬機,跨物理設(shè)備。
Java命名和目錄接口(Java?Naming?and?Directory?Interface,JNDI)
????JNDI是Java?Naming?and?Directory?Interface?的簡寫,中意為:Java命名及目錄接口,它是為了對高級網(wǎng)絡(luò)應(yīng)用開發(fā)中的使用的目錄基礎(chǔ)結(jié)構(gòu)的訪問。實際上這個目錄是一個特殊的數(shù)據(jù)庫,提供了對存儲數(shù)據(jù)的快速訪問,不象傳統(tǒng)的目錄服務(wù)訪問方式-你必須提供不同的API接口去訪問不同的目錄服務(wù)(如:LDAP,NIS,ADS等),而它提供了一種標準的API來訪問類型不同的目錄。據(jù)說,使用完整的SDK可以開發(fā)那些JNDI還不支持的目錄服務(wù)提供者。
????JNDI是J2EE的一個API,提供了一套標準的接口,以定位用戶、機器、網(wǎng)絡(luò)、對象、以及服務(wù)。例如,你可以使用JNDI來定位內(nèi)部網(wǎng)中的一臺打印機,你也可以使用它來定位Java對象或連接到一個數(shù)據(jù)庫。JNDI可以用于EJB、RMI-IIOP、JDBC中。它是網(wǎng)絡(luò)查找定位的標準方法。????JNDI?API被用來訪問命名和目錄服務(wù)。它提供一個相容的模式來訪問和操作企業(yè)范圍大的資源,例如一個應(yīng)用服務(wù)器中的DNS、LDAP、本地文件系統(tǒng)或者對象。
?
有了上述兩種技術(shù)的支持就可以實施分布式布署了。
?
比如你有兩個服務(wù)器:
A服務(wù)器192.168.0.1:JBOSS 4.0其上布署了EJB的業(yè)務(wù)實現(xiàn)模塊
B服務(wù)器192.168.0.2:Tomcat 5.0 運行Jsp/JavaBean或Struts等Web頁面程序
實驗?zāi)康模悍植际讲煌瑧?yīng)用服務(wù)器訪問EJB組件
?
?
A服務(wù)器上對EJB的開發(fā)及布署,請參見其它相關(guān)文檔:
?
a. HelloWorldBean.java //業(yè)務(wù)實現(xiàn)了getHelloWorld提供remote的方法
?
package donne.study;
public abstract class HelloWorldBean implements javax.ejb.SessionBean {
??? /**
???? * @ejb.interface-method view-type="remote"
???? */
??? public String getHelloWorld(String sMessage) {
??????? return "Hello World! "+sMessage;
??? }
}
?
EJB Classes 由lomboz自動生成的EJB接口文件
b. HelloWorld.java
package donne.study;
/**
?* Remote interface for HelloWorld.
?* @generated
?* @lomboz generated
?*/
public interface HelloWorld
?? extends javax.ejb.EJBObject
{
?? public java.lang.String getHelloWorld( java.lang.String sMessage )
????? throws java.rmi.RemoteException;
}
?
c. HelloWorldHome.java
?
package donne.study;
/**
?* Home interface for HelloWorld.
?* @generated
?* @lomboz generated
?*/
public interface HelloWorldHome
?? extends javax.ejb.EJBHome
{
?? public static final String COMP_NAME="java:comp/env/ejb/HelloWorld";
?? public static final String JNDI_NAME="HelloWorld";
?? public donne.study.HelloWorld create()
????? throws javax.ejb.CreateException,java.rmi.RemoteException;
}
其它文件略
?
B服務(wù)器上Tocamt上調(diào)用JBoss下EJB的remote接口
1. Copy Jboss下的client目錄下的jar文件到你的測試工程的lib目錄,有些jar是不需要的根據(jù)實際情況
?
2. 將上述兩個接口b、c文件生成的class文件打包成jar文件,也copy到lib下,可以看到到不管你的EJB里業(yè)務(wù)內(nèi)容如何變化這個接口的定義都不會變
?
3. HelloWorldClient.java
?
package donne.study;
import java.util.Hashtable;
import javax.naming.InitialContext;
import javax.naming.NamingException;
?
public class HelloWorldClient {
??? private donne.study.HelloWorldHome getHome() throws NamingException {
??????? return (donne.study.HelloWorldHome) getContext().lookup(
??????????????? donne.study.HelloWorldHome.JNDI_NAME);
??? }
??? private InitialContext getContext() throws NamingException {
??????? Hashtable props = new Hashtable();
??????? props.put(InitialContext.INITIAL_CONTEXT_FACTORY,
??????????????? "org.jnp.interfaces.NamingContextFactory");
??????? props.put(InitialContext.PROVIDER_URL, "jnp://192.168.0.1:1099");
??????? InitialContext initialContext = new InitialContext(props);
??????? return initialContext;
??? }
?
??? public String getEJBString() {
??????? try {
??????????? donne.study.HelloWorld myBean = getHome().create();
??????????? return myBean.getHelloWorld("From Tomcat Jsp");
??????? } catch (Exception e) {
??????????? return e.getMessage();
???????????
??????? }
??? }
}
?
4. hello.jsp
?
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import = "donne.study.HelloWorldClient" %>
<HTML>
<BODY>
<%
?HelloWorldClient helloID=new HelloWorldClient();
?out.print(helloID.getEJBString());
%>
</BODY>
</HTML>
?
運行一下hello.jsp將出現(xiàn)Hello World! From Tomcat Jsp就對了