servletでEJBを呼び出す


私のように初めてEJBを学んだ菜鳥にとって、EJBの配置はとても煩わしいことで、振り返るにたえないでしょう.ほほほ、今日やっと昨日の夜出会った1つのばかの間違いを理解して、だから1つの簡単な例を書きます.
私のこの例の前提は、EJBがパブリッシュに成功し、servletでパブリッシュされたEJBを呼び出すことです.
まず、公開されたEJBコンポーネントのjarファイルを現在のWebエンジニアリングのlibにコピーします.ディレクトリ構造は次のとおりです.
EJB端子:
    EJBFolderName
          |
          |------classes 
          |            |
          |            |-------hello
          |            |           |---------hello.class  //Remote
          |            |           |---------helloHome.class  //Home
          |            |           | ---------helloBean.class //Bean
          |            |
          |            |--------META-INF
          |                           |------ejb-jar.xml//EJBプロファイル
            |                           |------MANIFEST.MF //Manifest-Version: 1.0  Class-Path:
          | 
          |-----------src
                       |
                       |-------hello
                       |           |---------hello.java   //Remote
                       |           |---------helloHome.java   //Home
                       |           | ---------helloBean.java //Bean
                       |
                       |--------META-INF
                                     |----ejb-jar.xml//servletプロファイル
                                     |-----MANIFEST.MF //Manifest-Version: 1.0  Class-Path:
servleteエンド:
ServletFolderName
          |
          |----------src
          |            |-------hello
          |            |          |--------TestEJB.JAva//被サーブレット(目標がはっきりしているだけで、サーブレット内に直接書くこともできます)
          |            |
          |            |-------TestEJBServlet.JAva//サーブレット呼び出しパッケージhelloのメソッド.
          |
          |
          |----------WebRoot
                           |----------META-INF
                           |                  |--------MANIFEST.MF   //Manifest-Version: 1.0       Class-Path:
                           |
                           |----------WEB-INF
                                            |----------classes
                                            |               |-----------TestEJBServlet.class
                                            |               |
                                            |               | -----------hello                                              |                               |----------TestEJB.class
                                            |-----------lib              
                                            |            |----------
FirstEJB.jar//EJBが打ったJarバッグ!EJB2.0不可欠
                                            |                           
                                            |------------web.xml//servletプロファイル
基本ファイル構造はこうです.終わりだ!         
*/以下は各ファイルについて詳しく説明する://まずサーブレット側で、サーブレットにはservletファイルがあり、doGetメソッドとdoPostメソッドを実現し、サーブレットプロファイルwebもある.xml
//TestEJBServlet.java:
import java.io.IOException;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



import hello.TestEJB;

public class TestEJBServlet extends HttpServlet {



	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {

		this.doPost(request,response);  //          Servlet     doGet  ,

                                                                                            //      doGet     EJB

	}

         public void doPost(HttpServletRequest request, HttpServletResponse response){

         		try{

			new TestEJB("iiop://localhost:2809/").test();  //   TestEJB.java   test()  。

		} catch(Exception e){

			e.printStackTrace();

		}



          }

}

//TestEJB.java:

package hello;

import javax.naming.Context;

import java.util.Properties;

import javax.naming.NamingException;

import javax.naming.InitialContext;

import javax.rmi.PortableRemoteObject;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

public class TestEJB {

	private static final String JNDI_NAME = "HelloEJB";  //EJB  websphere   JNDI Name

	private String url;

	private HelloHome home;

	public TestEJB(String url) throws NamingException{

		this.url = url;

		home = lookUpHome();

	}

	private Context getInitialContext() throws NamingException {

		Properties prop = new Properties();

	   prop.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");

		prop.put(Context.PROVIDER_URL, url);

		return new InitialContext(prop);

	}

	private HelloHome lookUpHome() throws NamingException{

		Context ctx = getInitialContext();

		Object home = ctx.lookup(JNDI_NAME);

		return (HelloHome)PortableRemoteObject.narrow(home,HelloHome.class);

	}

	public void test() throws RemoteException,CreateException,NamingException {

		Hello hello = (Hello)PortableRemoteObject.narrow(home.create(),Hello.class);

		System.out.println(hello.sayHello());

	}

	/*public static void main(String args[]) throws Exception{

		try{

		new TestEJB("iiop://localhost:2809/").test();

		}catch(Exception e){

			e.printStackTrace();

		}

	}*/

}

//Servletプロファイルweb.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" 

	xmlns="http://java.sun.com/xml/ns/j2ee" 

	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 

	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<servlet>

		<servlet-name>TestEJB</servlet-name>   

		<servlet-class>TestEJBServlet</servlet-class> 

	</servlet>

	<servlet-mapping>

		<servlet-name>TestEJBServlet</servlet-name>  //Servlet   web       

		<url-pattern>/servlet/TestEJBServlet</url-pattern>//Servlet   web       

	</servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>//      (    )

  </welcome-file-list>

</web-app>

次にEJB側:3つのjavaファイル(Home.java,Remote.java,Bean.java)と1つのejb-jarプロファイル
helloHome.JAva(Home.javaローカルインタフェース)

package hello;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;


public interface HelloHome extends EJBHome {

	public Hello create()throws CreateException,RemoteException;

}

hello.JAva(Remote.javaリモートインタフェース)

package hello;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;

public interface Hello extends EJBObject {

	public String sayHello()throws RemoteException;

}

helloBean.JAva(Bean.java実装クラス)

package hello;
import java.rmi.RemoteException;

import javax.ejb.EJBException;

import javax.ejb.CreateException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

public class HelloBean implements SessionBean {

	private SessionContext ctx;

	private String words ;

	public String sayHello(){

		System.out.println("i am in an EJB server."+words);

		return words;

	}

	public void ejbCreate() throws CreateException{

		this.words = "hello world";
	}
	public void ejbActivate() throws EJBException, RemoteException {

		// TODO Auto-generated method stub
	}

	public void ejbPassivate() throws EJBException, RemoteException {

		// TODO Auto-generated method stub
	}

	public void ejbRemove() throws EJBException, RemoteException {

		// TODO Auto-generated method stub
	}



	public void setSessionContext(SessionContext arg0) throws EJBException,

			RemoteException {
		this.ctx = arg0;
	}
}

もう1つのプロファイルejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>

	<display-name>HelloEjb</display-name>

	<enterprise-beans>

		<session>

			<ejb-name>FirstEJB</ejb-name>

			<home>hello.HelloHome</home>

			<remote>hello.Hello</remote>

			<ejb-class>hello.HelloBean</ejb-class>

			<session-type>Stateless</session-type>

			<transaction-type>Container</transaction-type>

		</session>

	</enterprise-beans>

	<assembly-descriptor>

		<container-transaction>

			<method>

				<ejb-name>FirstEJB</ejb-name>

				<method-intf>Remote</method-intf>

				<method-name>*</method-name>

			</method>

			<trans-attribute>Required</trans-attribute>

		</container-transaction>

	</assembly-descriptor>

</ejb-jar>

最後にEJBの呼び出しの集中方式についてもお話ししたいと思いますが、主に3つあります.
1、propertyヘルプで環境を設定する

Properties properties = System.getProperties();
		 	
			properties.put(Context.PROVIDER_URL, "iiop://localhost:2809");
			properties.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
			Context ctx = new InitialContext(properties);

2、Hashtableで環境の設定を助ける

Hashtable environment = new Hashtable();

		    environment.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");

		    environment.put(Context.PROVIDER_URL, "iiop://localhost:2809");  //  , “corbaloc:iiop:localhost:2809”     。

		    Context ctx= new InitialContext(environment);

3、WASのデフォルトの方法

	Context ctx = new InitialContext();
			Object ref = ctx.lookup("ejb/TestEJB");
			TestEJBHome home = (TestEJBHome) PortableRemoteObject.narrow(ref,	TestEJBHome.class);
			
			testinst = home.create();
			arg1.getWriter().println(testinst.testEJB());
			System.out.println(testinst.testEJB());