第一次接触EJB2.0 ,本不想学习,因为EJB2.0的繁琐和复杂已经 有了EJB3.0的替换, 实属项目(http://www.qianxk.com/forum.php?mod=viewthread&tid=1111)需要。
不了解原理,先按照编程惯例,跑个HelloWord试试:
一、环境:
jboss5.0、 myeclipse
二、
代码如下:
//定义远程接口
public interface HelloWorldRemote extends EJBObject{
String sayHello()throws RemoteException;
}
//定义本地接口 这里有点疑问,是否是叫做本地接口还是提供远程接口
public interface HelloWorldHome extends EJBHome{
HelloWorldRemote create() throws RemoteException, CreateException;
}
ublic class HelloWorldBean implements SessionBean{
/**
*
*/
private static final long serialVersionUID = 1L;
//这个方法必备,没有的话,在服务器加载的时候 报错:Verification of Enterprise Beans failed, see above for error messages. 就是这个错,害的我现在还没睡,哇哇,为什么既然一定要,不写到sessionBean中间去呢,这不害人吗
public void ejbCreate() {
System.out.println("HelloBean: ejbCreate() is called!");
}
@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
}
@Override
public void setSessionContext(SessionContext arg0) throws EJBException,
RemoteException {
// TODO Auto-generated method stub
}
public String sayHello() throws RemoteException
{
return "Welecome to ejb2.0,HXL";
}
}
定义好这些,还需要配置两个文件.ejb-jar.xml 和 jboss.xml然后将其打包成jar文件
ejb-jar.xml文件如下:
<?xml version="1.0" encoding="gb2312"?>
<!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>
<description>ejb</description>
<display-name>myEJBTest</display-name>
<enterprise-beans>
<session>
<display-name>helloEJB</display-name>
<ejb-name>helloEJB</ejb-name>
<home>com.time.ejb.bean.HelloWorldHome</home>
<remote>
com.time.ejb.bean.HelloWorldRemote
</remote>
<ejb-class>
com.time.ejb.bean.HelloWorldBean
</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
jboss.xml文件:
<?xml version="1.0" encoding="gb2312"?>
<jboss>
<enterprise-beans>
<session>
<ejb-name>helloEJB</ejb-name>
<jndi-name>ejb/helloEJB</jndi-name>
</session>
</enterprise-beans>
</jboss>
然后写出测试例子,调用EJB:
public static void main(String[] args)
{
System.out.println("===========================================================");
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");
try
{
InitialContext ctx = new InitialContext(props);
Object objRef = ctx.lookup("ejb/helloEJB");
HelloWorldHome home = (HelloWorldHome) PortableRemoteObject.narrow(objRef, HelloWorldHome.class);
HelloWorldRemote remote = home.create();
System.out.println(remote.sayHello());
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
由于上面的错误,发现后在谷歌里寻求解决方案,有说EJB配置文件错误、有说Jar包错误,几经折腾,错误还是存在,后来,还是决定自己研究错误提示,找到了错误的根源,看了,有的时候还是要相信自己,别太依赖谷哥这位大神。
谈谈大概自己对EJB的理解,对于需要提供远程访问服务的,首先需要提供一个对外远程访问的接口(EJBHome),然后定义远程访问对象(EJBOject)接口,最后定义SessionBean实现类,这里进行业务逻辑处理。将对应的对象配置到ejb-jar.xml配置文件中, 当然这个其中实现也就交个EJB容器来进行处理,可用通过代理或者注入 实现,具体内容还得继续深究,努力