以下代码建立在glassfish v2基础上:
新建一个EJB模块
先写一个最简单的无状态Session Bean,首先定义一个远程接口:
用@Remote标注表明这是一个远程接口,在接口里声明一些业务方法。接着定义一个会话Bean实现该接口:
@Stateless标注表明这是一个无状态会话Bean,完成了这个简单的Demo后,打包部署到服务器上。接着我们来测试这个会话Bean,新建一个WEB模块,我们利用这个web应用来远程调用会话Bean。我们可以在web模块里新建一个Servlet:
JSP却有所不同,这里不能使用@EJB标注,要使用传统的JNDI lookup方式:
这个测试用web模块已经完成,将WEB模块打包部署后即可以运行
不过,如果我们自己指定了会话Bean的JNDI名,那么以上的测试代码将发生异常,例如:
这里我们指定了会话bean的JNDI名为"hello",更改后的EJB模块需要重新部署,还要更改相应的Servlet和Jsp中的代码:
Servlet已经更改了,只有一点点不同。
Jsp也做了小小的改动,如此更新后重新部署WEB模块,测试代码即可顺利运行
需要注意的是:
1、根据EJB容器的不同,EJB的JNDI生成规则并不一样,最好还是从各服务器的JNDI树查找
2、如果是远程调用,还需要将EJB模块jar包和服务器的客户端jar包(如weblogic10g,需要wlclient.jar、wl-j2ee-client.jar)拷贝到客户端应用的lib目录下
3、如果是远程调用,还需要指定JNDI服务器上下文环境的配置信息Context.INITIAL_CONTEXT_FACTORY和Context.PROVIDER_URL,各服务器具体配置不一样:
服务器 | Context.INITIAL_CONTEXT_FACTORY | Context.PROVIDER_URL | Context.URL_PKG_PREFIXES |
weblogic | weblogic.jndi.WLInitialContextFactory | t3://localhost:7001 | |
jboss | org.jnp.interfaces.NamingContextFactory | localhost:1099 | org.jboss.naming:org.jnp.interfaces |
glassfish | com.sun.enterprise.naming.SerialInitContextFactory | localhost:8080 |