EJB clientがEJB 3を呼び出します


http://hi.baidu.com/yecell/blog/item/5d9169037516d7ea08fa9386.html
あなたのEJB 3がdeploy to jbossの場合、ejb clientはEJB 3を呼び出します.
1)Jbossで公開されたウェブアプリをclientとしてEJBを呼び出します.
EJBとEJBを呼び出すWEBアプリケーションはすべてJbossの集積環境の下で発表されています.JbossでWEBアプリケーションをリリースするには、WEBアプリをwarファイルに包装する必要があります.また、この環境でEJBを呼び出すには、EJBのインターフェースクラスを/WEB-INF/clases/ディレクトリに入れる必要はありません.そうしないと、Stteful Beanを呼び出すとタイプが衝突し、以下の例外が発生します.
java.lang.CastException:$Proxy 84
org.apache.jsp.Stteful BeanTest_jsp._jspService(org.apache.jsp.Stteful Beabin Testujsp:55)
EJBとEJBを呼び出すWEBアプリケーションがすべてJbossの統合環境で発行されている場合、EJBのLocalまたはRemoteインターフェースはすべて呼び出されます.
Jbossにリリースされたクライアントは、JNDIアクセスのコンテキスト環境を明確に設定する必要はなく、直接に
表示
クリップボードにコピー
印刷
Initial Contect ctx = new Initial Contect()  
InitialContext ctx = new InitialContext()
コンテキスト環境を取得すると、コンテナが自動的にInitial Contectに正しい環境を与えます.例えば、
表示
クリップボードにコピー
印刷
Initial Contect ctx = new Initial Context()//クライアントとjbossは同じjvmで動作します.プロpsに入る必要はありません.   ハロルド ハローワールド = (ハローワールド) ctx.lookup(「ハローワールドBeat/remote」);  
InitialContext ctx = new InitialContext();//    jboss      jvm,     props
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
Initial Contectにアクセス属性を無理矢理設定すると、かえって移植できない問題をもたらします.あなたのアプリケーションはweblogicなどのアプリケーションサーバに展開する可能性があります.(本教程では一部の学生は独立したJ 2 seでEJBを呼び出す必要があるかもしれません.教育の便利さのために、アクセス属性を設定しました.このように、jboss、j 2 seまたは独立tomcatに関わらず、正しいInitial Contextが得られます.)
2)個別のTomcatまたはJ 2 SE(junnit testなど)でEJBを呼び出します.
正式な生産環境では、EJBを呼び出すクライアントのほとんどは、単独のTomcatまたはResinであるかもしれない.単独のTomcatサーバーでEJBを呼び出す方法を説明します.個別のTomcatサーバでEJBを呼び出すには以下の手順が必要です.
A)EJBを呼び出して依存するJarパケットをtomcatの下の/shared/libディレクトリまたはWEBアプリケーションのWEB-INF/libにコピーし、依存するJarはjbossインストールディレクトリのclientディレクトリの下にある.あなたはeclipseにカスタムのlibrary「ejb 3 library」を設定して、これらのjarsを全部このlibraryに追加して、あなたのEJB projectに「ejb 3 library」add to classipathを追加してもいいです.
B)EJBインターフェースをアプリケーションの/WEB-INF/clases/カタログにコピーする
C)クライアントがEJBにアクセスする時は、環境属性を明確に設定しなければならない.コードは以下の通りである.
表示
クリップボードにコピー
印刷
Propties props = new Propties();   props.set Property(「java.naming.factory.initial」) 「org.jnp.interfaces.NamingContect Factory」);   props.set Property(「java.naming.provider.url」、 「local host:1099」)   props.set Property(「java.naming.factory.url.pkgs」) “org.jboss.naming”;   Initial Contect ctx = new Initial Contect(props)//クライアントとjbossは同じjvmで動作します.プロpsに入る必要はありません.   ハロルド ハローワールド = (ハローワールド) ctx.lookup(「ハローワールドBeat/remote」);  
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props);//    jboss      jvm,     props
HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
Tip:上のハードコードにより環境属性を設定するほか、アプリケーションのclassipathにjndi.propertiesファイルを置くこともできます.
注意:単独のtomcatとJ 2 SEではEJBのLocalインターフェースを呼び出すことができません.彼はJBOSSと同じVMにいないからです.J 2 seでEJB 3を呼び出しても、上述のjar及びEJBインターフェースをアプリケーションのクラスパスの下に置く必要があります.