我觉得做一个客户端调用一个实体bean算是一个完整列子吧,实体bean这里不就不详细说了。客户端调用需要使用会话bean这个也写好吧。然后打包这个EJB,这里EJB部署到jboss下就可以使用了
另外我使用oracle数据库,所以在jboss下的deploy下得增加oracle数据源配置文件,如下:
以下是引用片段: oracledb-ds.xml <datasources> <local-tx-datasource> <jndi-name>oracleDS</jndi-name> <connection-url> jdbc:oracle:thin:@localhost:1521:cmmboss </connection-url> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <user-name>system</user-name> <password>cmmboss</password> <metadata> <type-mapping>oracle10g</type-mapping> </metadata> </local-tx-datasource> </datasources> |
注意这个jndi名字和你调用的时候一致,这个实在EJB这个里面的persistence.xml里面一致部署的话。EJB打包的jar可以单独部署于deploy下面。
也可以打包成ear里面
ear的结构:mytestEJBweb.ear
以下是引用片段: META-INF --application.xml testEJBweb.war testEJB.jar |
客户端调用,可以是普通类,也可以是servlet 。我这里以一个servlet距离
在servlet初始化的时候处理
以下是引用片段: public void init() throws ServletException { Hashtable properties = new Hashtable(); properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); properties.put(Context.PROVIDER_URL, "jnp://localhost:1100"); |
这里特别注意的是使用jnp方式访问,其他容器都有自己的访问方式,比如weblogic使用T3,ip如果是夸ip访问注意ip绑定,还有端口号是jnp的端口1100,而不是http端口8080等
以下是引用片段: properties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); try { InitialContext ctx = new InitialContext(properties); ComputerBeanRemote computerBean = (ComputerBeanRemote)ctx.lookup("mytestEJBweb/ComputerBean/remote"); |
这里首先调用的是ear这个资源的jndi路径(我第一次使用了war的资源路径,对jndi没有理解,调试了一个晚上,希望大家不要犯我这样的错误),然后再是EJB bean的路径,
以下是引用片段: this.computerBean = computerBean; } catch (NamingException e) { e.printStackTrace(); } } |