前两天开始学习EJB,想学的很久了,一直总认为自己的水平学起来会很困难,其实不过是给自己找了一个接口罢了,无论怎么样,终于开始学习了,昨天开始写Hello,根据精通EJB书上所说的例子,写好了代码需要如何编译,编译完了又怎么样,可惜书上面说的不是很清楚,有好多的细节多给省略了,所以只有自己取google了啊。
最后还是部署成功了,过程如下:
一, 编写EJB组件代码
1 远程接口
远程接口支持EJB组件暴露的所有业务方法,当客户同EJB对象交互时,需要使用这一接口,容器厂商会实现这一接口,而相应的实现对象就是EJB对象
package examples;
public interfact Hello extends javax.ejb.EJBObject{ // 继承于EJBObject,容器生成的EJB对象实现了远程接口
public String hello() throws java.rmi.RemoteException;// 仅实现了单个业务方法,Bean类需要实现hello方法,由于该接口是RMI-IIOP类型的远程接口(间接继承javarmi Remote)因此必须抛出远程异常,远程异常表明了网络问题或其他致命问题
}
2 本地接口 为访问EJB组件的业务方法,本地客户应该使用本地接口,而不是远程接口,本次接口是远程接口的效率提升,当本地客户同EJB本地对象交互时,需要使用这接口,相应的实现对象就是EJB本地对象,EJB本地对象会将客户请求委派给实际的EJB BEAN 类,本地接口继承于EJBLocalObject接口,不需要抛出RemoteException
package examples;
public interface HelloLocal extends javax.ejb.EJBLocalObject{
public String hello();
}
3 Home接口,为创建和销毁EJB对象,开发者需要使用Home接口,Home接口的实现是Home对象,而Home对象有EJB服务器提供的工具生成, 该接口存在create()方法,它对应于HelloBean中的ejbCreate()方法,Home对象充当了创建EJB对象的工厂
package examples;
public interface HelloHome extends javax.ejb.EJBHome{
Hello create() throws java.rmi.RemoteException,javax.ejb.CreateException;// 创建EJB对象
}
为获得EJB对象的引用,客户需要使用create方法,create方法还能完成EJB组件的初始化工作,该接口继承于EJBHome
4 本地Home接口,本地Home接口是Home接口的高性能版本
package examples;
public interface HelloLocalHome extends javax.ejb.EJBLocalHome{ //继承于LocalHome
HelloLocal create() throws javax.ejb.CreateException;
}
5 Bean类 HelloBean实现了javax ejb SessionBean接口,供实现会话Bean使用,HelloBean的ejbCreate方法和Home对象的create方法一致,当个业务方法hello 返回HELLO EJB,无状态会话bean不会使用到ejbActivate和ejbPassivate方法ejbRemove 当销毁HelloWorld ejb实例时,不需要清楚任何资源
package examples;
import javax.ejb.SessionContext;
public class HelloBean implements javax.ejb.SessionBean
{
private SessionContext ctx;
// EJB 规范定义的方法
public void ejbCreate()
{
System.out.println("ejbCreate()");
}
public void ejbRemove()
{
System.out.println("ejbRemove");
}
public void ejbActivate()
{
System.out.println("ejbActivate");
}
public void ejbPassivate()
{
System.out.println("ejbPassivate()");
}
public void setSessionContext(javax.ejb.SessionContext ctx)
{
this.ctx=ctx;
}
//业务方法
public String hello()
{
System.out.println("hello()");
return "Hello World";
}
}
6 部署描述符
这个地方有点不是太好理解了啊,或许因为本人对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 version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:msi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">-->
<ejb-jar>
<description>Hello Ejb</description>
<display-name>Hello</display-name>
<enterprise-beans>
<session>
<ejb-name>Hello</ejb-name>
<home>examples.HelloHome</home>
<remote>examples.Hello</remote>
<local-home>examples.HelloLocalHome</local-home>
<local>examples.HelloLocal</local>
<ejb-class>examples.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
就是上面的去掉doctype那段,加上下面那段的,可是部署的时候却一直错,后来查了查资料改过来的,一会还要研究下,
7编译java文件
编译java文件首先要取得java文件中用到的外部包,好像这个包可以从JBOSS中获得吧,我是从eclipse里面拷出来的,本来的从网上down的j2ee。jar没有用,将编译好的class文件进行打包
jar cvf hello.jar examples META-INF
其中examples目录底下是刚才编译的类了,META-INF下面放的是ejb-jar.xml,打包的时候会生成一个MANIFEST.MF在META-INF下面,打包完成
8部署HELLO.JAR
我用的服务器是JBOSS3.2.6,感觉版本问题不是很大吧,cmd到jboss的bin下面,然后run -c all 启动服务器,把hello.jar 拷到all下面的deploy,jboss就会给出消息了啊,如果成功的话会出现如下信息
[EJBModule] Deploying hello
[EJBDeployer]deployed :file xxxxxx.xxxx/xxx/hello.jar
这样就部署成功了,呵呵!坚持学习。下面准备客户端调用去