Tomcat JSP调用JBoss布署的EJB远程方法
王伟东
EJB技术的基础是另外两种技术:RMI-IIOP和JNDI。要想了解EJB,一定要先了解RMI-IIOP和JNDI。
Java RMI-IIOP
Java RMI-IIOP(Java Remote Method Invocation over the Internet Inter-ORB Protocol)是J2EE的网络机制。Java RMI-IIOP允许你编写分布式对象,使得对象的通信范围能够在内存中,跨Java虚拟机,跨物理设备。
Java命名和目录接口(Java Naming and Directory Interface,JNDI)
JNDI是Java Naming and Directory Interface 的简写,中意为:Java命名及目录接口,它是为了对高级网络应用开发中的使用的目录基础结构的访问。实际上这个目录是一个特殊的数据库,提供了对存储数据的快速访问,不象传统的目录服务访问方式-你必须提供不同的API接口去访问不同的目录服务(如:LDAP,NIS,ADS等),而它提供了一种标准的API来访问类型不同的目录。据说,使用完整的SDK可以开发那些JNDI还不支持的目录服务提供者。
JNDI是J2EE的一个API,提供了一套标准的接口,以定位用户、机器、网络、对象、以及服务。例如,你可以使用JNDI来定位内部网中的一台打印机,你也可以使用它来定位Java对象或连接到一个数据库。JNDI可以用于EJB、RMI-IIOP、JDBC中。它是网络查找定位的标准方法。 JNDI API被用来访问命名和目录服务。它提供一个相容的模式来访问和操作企业范围大的资源,例如一个应用服务器中的DNS、LDAP、本地文件系统或者对象。
有了上述两种技术的支持就可以实施分布式布署了。
比如你有两个服务器:
A服务器192.168.0.1:JBOSS 4.0其上布署了EJB的业务实现模块
B服务器192.168.0.2:Tomcat 5.0 运行Jsp/JavaBean或Struts等Web页面程序
实验目的:分布式不同应用服务器访问EJB组件
A服务器上对EJB的开发及布署,请参见其它相关文档:
a. HelloWorldBean.java //业务实现了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服务器上Tocamt上调用JBoss下EJB的remote接口
1. Copy Jboss下的client目录下的jar文件到你的测试工程的lib目录,有些jar是不需要的根据实际情况
2. 将上述两个接口b、c文件生成的class文件打包成jar文件,也copy到lib下,可以看到到不管你的EJB里业务内容如何变化这个接口的定义都不会变
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将出现Hello World! From Tomcat Jsp就对了