《Tomcat JSP调用JBoss布署的EJB远程方法》-王伟东的个人Blog|你好Blog
你好Blog-王伟东的个人Blog

王伟东的个人Blog
学无止境,贵在有恒。常学常新,与时俱进。 

05-2-2

Tomcat JSP调用JBoss布署的EJB远程方法   (Java学习)

王伟东 发表于:05-02-02 13:58

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就对了
 
 
 
 

版权声明:如本文牵涉版权问题,"你好Blog"不承担相关责任,请版权拥有者直接与文章作者联系解决。谢谢!
引用通告地址(TrackBack Ping Url)
复制引用地址 http://www.nihaoblog.com/trackback.action?itemId=827
复制引用地址 http://www.nihaoblog.com/trackback.action?itemId=827

评论1

发表来自:eesen
发表时间:05-08-07 11:34
电子邮件:@
评论内容:
我是用ServletContext context.getResourceAsStream("jndi.properties");
jndi.properties可以放在web-inf的文件夹下

评论2

发表来自:梦醒了
发表时间:05-07-26 17:17
电子邮件:ihqtg@hotmail.com
评论内容:
我想这才是ejb和jb的一个重要区别

评论3

发表来自:伟东
发表时间:05-05-23 12:20
评论内容:
tomcat下读配置文件:
 protected Configuration() {
       try {
 InputStream fin = getClass().getResourceAsStream("/config.properties");
    Properties dbProps = new Properties();
    dbProps.load(fin);
    String para= dbProps.getProperty("parameter", "default")
      fin.close();
    } catch (IOException e) {
    }
  }

评论4

发表来自:mary01
发表时间:05-05-23 09:42
电子邮件:loveandbread@163.com
评论内容:
大哥,我 jndi.properties 放在通常放在WEB-INF/classes目录下
怎么取不到配置文件啊,报错:java.io.FileNotFoundException: jndi.properties (系统找不到指定的文件。)

评论5

发表来自:伟东
发表时间:05-03-16 22:12
评论内容:
通常放在WEB-INF/classes目录下

评论6

发表来自:fcfs
发表时间:05-03-16 21:39
电子邮件:w_y1015@sohu.com
评论内容:
您好,您的文章写的很好。我还有一个疑惑。如果我在tomcat上的相关代码中不想将jndi服务器的ip地址写进去,而想通过配置jndi.properties文件的方式。那么那个jndi.properties文件应该怎么放呢?是放在系统的CLASSPATH中就可以,还是需要放在tomcat中的什么地方?谢谢

评论7

发表来自:伟东
发表时间:05-03-19 09:30
电子邮件:@
评论内容:
以上方法我都测试过的
注意:
B服务器上Tocamt上调用JBoss下EJB的remote接口
1. Copy Jboss下的client目录下的jar文件copy到你的测试工程的lib目录,有些jar是不需要的根据实际情况
 
2. 将上述两个接口b、c文件生成的class文件打包成jar文件,也copy到lib下,可以看到到不管你的EJB里业务内容如何变化这个接口的定义都不会变

评论8

发表来自:kalog
发表时间:05-03-19 01:07
电子邮件:hyhhang@163.cn
评论内容:
文章的确比较有新意:通过一个非ejb容器调用一个分布式的ejb服务。
因为网络上太多的人云亦云的简单描述:在ejb服务器中用本机jsp调用ejb,非常简单,可以说根本就不是远程调用。

上面的例子通过jndi调用另外一台机器的ejb,思路很好,但是很多错误,难以操作。比如调试时总是提示 javax.ejb.EJBHome does not exits,不可能的啊,我编译都可以。

评论9

发表来自:kalog
发表时间:05-03-19 01:24
电子邮件:hyhhang@163.cn
评论内容:
donne.study.HelloWorld myBean = getHome().create();

在tomcat里面根本就没有donne.study.HelloWorld 这个类,在ejb中才有(另一台服务器),怎么可以在本机直接生成一个实例?
*评 论 人 记忆
*电子邮件 公开Email
*评论内容
(少于256字)
新发的评论置于第1页 评论1