EJB(Enterprise JavaBean)企业级JavaBean,J2EE规范把EJB分为三类:会话Bean(SessionBean),实体Bean(EntityBean),消息驱动Bean(MessageDrivingBean)。
我们以最简单的会话Bean来认识下EJB。
会话Bean分为:无状态会话Bean和有状态的会话Bean,用通俗的话理解就是:不记录状态的Bean对所有访问用户都进行相同操作的Bean叫做无状态,而要记录下操作状态一个用户一个bean的叫有状态。
无状态Bean:
服务器端:一个简单的操作也要求我们写两个接口一个类,外加一个配置XML。下面我们来看下:
接口一:
public interface HomeBean extends EJBHome{
public RemoteBean create() throws CreateException,RemoteException;
}
该接口继承于EJBHome,并且必须要实现一个create方法,注意该方法不带参数,并抛出CreateException,RemoteException。
接口二:
public interface RemoteBean extends EJBObject{
public String result(String name) throws RemoteException;
}
该接口继承于EJBObject,该接口中的方法为我们自己的业务方法,抛出RemoteException。
类:
public class SessionBean implements javax.ejb.SessionBean {
private SessionContext context;
public SessionBean() {
// TODO Auto-generated constructor stub
}
public void ejbCreate() throws CreateException {
// TODO Add ejbCreate method implementation
}
@Override
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
@Override
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public String result(String name) throws RemoteException{
String s = name+"爱上了ZM";
return s;
注意该类必须写上public void ejbCreate() throws CreateException 方法,最后一个方法为接口二中定义的业务方法的实现。
下面就是配置XML,该文件写在META-INF下,文件名必须为ejb-jar.xml:
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>test52showlove</ejb-name> //取的别名
<home>com.lei.bean.HomeBean</home> //接口一路径
<remote>com.lei.bean.RemoteBean</remote> //接口二路径
<ejb-class>com.lei.bean.SessionBean</ejb-class> //类路径
<session-type>Stateless</session-type> //Stateless表示无状态
<transaction-type>Container</transaction-type>
</session>
</ejb-jar>
写完了以上内容后我们需要把该工程打包成JAR文件以供我们的客户端工程导入,具体步骤就不详谈了
客户端:
客户端除了要导入服务器端JAR包外还需要导入jbossall-client.jar。下面是客户端的一个具体实现。
public class TestMain {
public static void main(String[] args) throws Exception{
//配置上下文环境
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES, "jboss.nameing:org.jnp.interfaces");
p.put(Context.PROVIDER_URL, "127.0.0.1:1099");
// 根据Properties对象对上下文环境进行设置
Context jndiContext = new InitialContext(p);
// 根据EJB的名称寻找服务
Object ref = jndiContext.lookup("test52showlove");
HomeBean home =(HomeBean)PortableRemoteObject.narrow(ref,
HomeBean.class);
RemoteBean remote = home.create();
String result = remote.result("春哥");
System.out.println(result);
remote.remove();
}
有状态会话Bean其实和无状态的差不多,只不过在接口一中定义上了一个有参数的create方法,比如加上一个参数int age,然后在类中设置该属性int age,并多写一个有参数的ejbCreate方法,参数就为int age,并写上this.age=age。在配置上只需要把无状态Stateless换成有状态的Stateful就好了```