﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Tom-随笔-随笔分类-EJB</title><link>http://www.blogjava.net/43880800/category/19922.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:10:39 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:10:39 GMT</pubDate><ttl>60</ttl><item><title>Tomcat JSP调用JBoss布署的EJB远程方法</title><link>http://www.blogjava.net/43880800/archive/2007/02/09/99040.html</link><dc:creator>Tom</dc:creator><author>Tom</author><pubDate>Fri, 09 Feb 2007 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/43880800/archive/2007/02/09/99040.html</guid><wfw:comment>http://www.blogjava.net/43880800/comments/99040.html</wfw:comment><comments>http://www.blogjava.net/43880800/archive/2007/02/09/99040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/43880800/comments/commentRss/99040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/43880800/services/trackbacks/99040.html</trackback:ping><description><![CDATA[
		<div align="center">
				<strong>Tomcat JSP调用JBoss布署的EJB远程方法</strong>
		</div>
		<div> </div>
		<div align="center">王伟东</div>
		<div align="center"> </div>
		<div>   EJB技术的基础是另外两种技术：RMI-IIOP和JNDI。要想了解EJB，一定要先了解RMI-IIOP和JNDI。</div>
		<div>
				<br />
				<strong>Java RMI-IIOP</strong>
				<br />
				<br />    Java RMI-IIOP（Java Remote Method Invocation over the Internet Inter-ORB Protocol）是J2EE的网络机制。Java RMI-IIOP允许你编写分布式对象，使得对象的通信范围能够在内存中，跨Java虚拟机，跨物理设备。<br /></div>
		<div>
				<strong>Java命名和目录接口（Java Naming and Directory Interface，JNDI）<br /></strong>
				<br />    JNDI是Java Naming and Directory Interface 的简写，中意为：Java命名及目录接口，它是为了对高级网络应用开发中的使用的目录基础结构的访问。实际上这个目录是一个特殊的数据库，提供了对存储数据的快速访问，不象传统的目录服务访问方式-你必须提供不同的API接口去访问不同的目录服务（如：LDAP，NIS，ADS等），而它提供了一种标准的API来访问类型不同的目录。据说，使用完整的SDK可以开发那些JNDI还不支持的目录服务提供者。<br /><br />    JNDI是J2EE的一个API，提供了一套标准的接口，以定位用户、机器、网络、对象、以及服务。例如，你可以使用JNDI来定位内部网中的一台打印机，你也可以使用它来定位Java对象或连接到一个数据库。JNDI可以用于EJB、RMI-IIOP、JDBC中。它是网络查找定位的标准方法。    JNDI API被用来访问命名和目录服务。它提供一个相容的模式来访问和操作企业范围大的资源，例如一个应用服务器中的DNS、LDAP、本地文件系统或者对象。</div>
		<div> </div>
		<div>有了上述两种技术的支持就可以实施分布式布署了。</div>
		<div> </div>
		<div>比如你有两个服务器：</div>
		<div>A服务器192.168.0.1：JBOSS 4.0其上布署了EJB的业务实现模块</div>
		<div>B服务器192.168.0.2：Tomcat 5.0 运行Jsp/JavaBean或Struts等Web页面程序</div>
		<div>实验目的：分布式不同应用服务器访问EJB组件</div>
		<div> </div>
		<div> </div>
		<div>A服务器上对EJB的开发及布署，请参见其它相关文档：</div>
		<div> </div>
		<div>a. HelloWorldBean.java //业务实现了getHelloWorld提供remote的方法</div>
		<div> </div>
		<div>
				<blockquote>
						<div>package donne.study;</div>
						<div>public abstract class HelloWorldBean implements javax.ejb.SessionBean {</div>
						<div>    /**<br />     * @ejb.interface-method view-type="remote"<br />     */<br />    public String getHelloWorld(String sMessage) {</div>
						<div>        return "Hello World! "+sMessage;<br />    }</div>
						<div>}<br /></div>
				</blockquote>
		</div>
		<div> </div>
		<div>EJB Classes 由lomboz自动生成的EJB接口文件</div>
		<div>b. HelloWorld.java</div>
		<div>
				<blockquote>
						<div>package donne.study;</div>
						<div>/**<br /> * Remote interface for HelloWorld.<br /> * @generated <br /> * @lomboz generated<br /> */<br />public interface HelloWorld<br />   extends javax.ejb.EJBObject<br />{</div>
						<div>   public java.lang.String getHelloWorld( java.lang.String sMessage )<br />      throws java.rmi.RemoteException;</div>
						<div>}<br /></div>
				</blockquote>
		</div>
		<div> </div>
		<div>c. HelloWorldHome.java</div>
		<div> </div>
		<div>
				<blockquote>
						<div>package donne.study;</div>
						<div>/**<br /> * Home interface for HelloWorld.<br /> * @generated <br /> * @lomboz generated<br /> */<br />public interface HelloWorldHome<br />   extends javax.ejb.EJBHome<br />{<br />   public static final String COMP_NAME="java:comp/env/ejb/HelloWorld";<br />   public static final String JNDI_NAME="HelloWorld";</div>
						<div>   public donne.study.HelloWorld create()<br />      throws javax.ejb.CreateException,java.rmi.RemoteException;</div>
						<div>}</div>
				</blockquote>
		</div>
		<div>其它文件略</div>
		<div> </div>
		<div>B服务器上Tocamt上调用JBoss下EJB的remote接口</div>
		<div>1. Copy Jboss下的client目录下的jar文件到你的测试工程的lib目录，有些jar是不需要的根据实际情况</div>
		<div> </div>
		<div>2. 将上述两个接口b、c文件生成的class文件打包成jar文件，也copy到lib下，可以看到到不管你的EJB里业务内容如何变化这个接口的定义都不会变</div>
		<div> </div>
		<div>3. HelloWorldClient.java</div>
		<div> </div>
		<div>
				<blockquote>
						<div>package donne.study;</div>
						<div>import java.util.Hashtable;</div>
						<div>import javax.naming.InitialContext;<br />import javax.naming.NamingException;</div>
						<div> </div>
						<div>public class HelloWorldClient {</div>
						<div>    private donne.study.HelloWorldHome getHome() throws NamingException {<br />        return (donne.study.HelloWorldHome) getContext().lookup(<br />                donne.study.HelloWorldHome.JNDI_NAME);<br />    }</div>
						<div>    private InitialContext getContext() throws NamingException {<br />        Hashtable props = new Hashtable();</div>
						<div>        props.put(InitialContext.INITIAL_CONTEXT_FACTORY,<br />                "org.jnp.interfaces.NamingContextFactory");<br />        props.put(InitialContext.PROVIDER_URL, "jnp://192.168.0.1:1099");<br />        InitialContext initialContext = new InitialContext(props);<br />        return initialContext;<br />    }</div>
						<div> </div>
						<div>    public String getEJBString() {<br />        try {<br />            donne.study.HelloWorld myBean = getHome().create();<br />            return myBean.getHelloWorld("From Tomcat Jsp");<br />        } catch (Exception e) {<br />            return e.getMessage(); <br />            <br />        }<br />    }<br />}<br /></div>
				</blockquote>
		</div>
		<div> </div>
		<div>4. hello.jsp</div>
		<div> </div>
		<div>
				<blockquote>
						<div>&lt;%@ page contentType="text/html; charset=GBK"%&gt;<br />&lt;%@ page import = "donne.study.HelloWorldClient" %&gt;<br />&lt;HTML&gt;<br />&lt;BODY&gt;<br />&lt;%<br /> HelloWorldClient helloID=new HelloWorldClient();<br /> out.print(helloID.getEJBString());<br />%&gt;</div>
						<div>&lt;/BODY&gt;<br />&lt;/HTML&gt;</div>
				</blockquote>
		</div>
		<div> </div>
		<div>运行一下hello.jsp将出现Hello World! From Tomcat Jsp就对了</div>
<img src ="http://www.blogjava.net/43880800/aggbug/99040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/43880800/" target="_blank">Tom</a> 2007-02-09 16:48 <a href="http://www.blogjava.net/43880800/archive/2007/02/09/99040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>