开发只存在Remote接口的无状态的BEAN
一、要定义一个会话BEAN,首先要定义一个包含他所有业务方法的接口。这个接口不需要任何注释,和普通的java接口一样定义。调用EJB的客户端通过使用这个接口引用从EJB窗口得到的会话Bean对象stub。
接口定义如下:
HelloWorld.java
packeage clchun.ejb3;
public interface HelloWorld{
public String Say(String name);
}
二、实现上面的接口并加入两个注释@Stateless和@Remote,@Stateless注释定义这是一个无状态的会话Bean,@Remote指明这个无状态Bean的Remote接口。
注意:
在使用这两个注释需要使用一些EJB的类包,这些类包都可以在jboss安装目录的client,/server/all/deploy/jboss-aop-jdk50.deployer,/server/all/deploy/ejb3.deployer,/lib/endorsed等文件来下找到。
下面是HelloWorld会话Bean的实现代码。
HelloWorldBean.java
注意:实现类的命名规则是:接口名+Bean
package clchun.ejb3.impl;
import clchun.ejb3.HelloWorld;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote({HelloWorld.class})
public class HelloWorldBean implements HelloWorld{
public String Say(String name){
return name+"说:Hello World!这是我的第一个无状态的EJB3!";
}
}
这个会话BEAN开发完成。现在把这个接口及BEAN编译并打包成JAR,打包好后,把这个包拷贝到[jboss安装目录]/server/all/deploy/目录下。
HelloWorld会话Bean发布完成后,现在就是客户端来调用他:
当一个无状态会话Bean发布到EJB容器是,容器就会为它创建一个对象Stub,并把注册进容器的JNDI目录,客户端代码使用它的JNDI名从容器获得他的Stub。通过这个Stub,客户端可以调用他的业务方法,代码如下:
Test.jsp
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="clchun.ejb3.HelloWorld,javax.naming.*,java.util.Properties"%>
<%
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;
try{
ctx=new InitialContext(props);
HelloWorld helloWorld=(HelloWorld) ctx.lookup("HelloWorldBean/remote");
out.println(helloWorld.Say("我");
}
catch(NamingException e)
{
out.println(e.getMessage());
}
%>
其中:ctx = new InitialContext(props);
是设置JNDI 访问的环境在这里我要重点说明一下EJB JNDI 名称默认的命名规则,命名规则如下:
1> 如果EJB 应用打包成后缀为*.ear 的发布文件,默认的JNDI 名称是
访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
访问远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
例:如果HelloWorld应用打包成HelloWorld.ear 文件,访问她远程接口的JNDI 名是:
HelloWorld/HelloWorldBean/remote
2> 如果EJB 应用打包成后缀为*.jar 的发布文件, 默认的JNDI 名称是
访问本地接口:EJB-CLASS-NAME/local
访问远程接口:EJB-CLASS-NAME/remote
例: HelloWorld应用打包成HelloWorld.jar 文件,访问她远程接口的JNDI名称是:HelloWorldBean/remote
我们把上面的客户端应用打成war 文件。然后把她拷贝到“[jboss 安装目录]/server/all/deploy”目录下。如
果war 文件的文件名为 EJBTest.war ,我们可以通过http://localhost:8080/EJBTest/Test.jsp访问客户端