ejb3学习之HelloWorld

在weblogic中开发EJB2的HelloWorld小例子
最近在项目中需要用到EJB2,虽然以前学过EJB3,但是发现EJB2跟EJB3还是有些不同,下面写了一个HelloWorld的无状态的SessionBean,部署到webllogic10中,开发工具是Eclpise3.6。
首先看下EJB的相关知识,EJB作为JAVA EE的核心规范,其实就是一个分布式组件。简单说就是一个可以远程调用的JavaBean,它与普通的JavaBean主要有两点不同:第一是远程调用;第二是事务的处理,由EJB容器来帮我们处理。
EJB作为一种服务器端组件,有三种类型:
1.SessionBean:代表一个可处理应用中业务逻辑的完整组件,包含各种业务逻辑的实现代码
2.Entity Bean:处理数据
3.Message Driven Bean:实现消息的异步消费者
那么EJB由谁来调用呢?它是放在Server端的一个能够远程调用的JavaBean,它不仅可以被Java语言如Servlet、jsp等调用,还可以被C++语言调用。
那么这个远程调用的过程是如何的呢?Java是通过RMI协议来调用的,EJB也是基于RMI实现的,C++是通过Corba协议来调用的,Corba是公共对象请求代理服务。
分布式调用的基本过程:客户端发送一个请求给服务器,首先传给stub代理类,它发送参数给skeleton委托类,然后委托类调用实现类取得结果再原路返回,这样一个分布式处理就完成了。
下面介绍编写一个SessionBean的步骤:
1.写一个接口继承EJBObject:该接口作为远程接口
2.写一个接口继承EJBHome:该接口的create方法返回1中的接口类型
3.写一个实现类继承SessionBean:该类中实现业务方法
4.编写一个ejb-jar.xml文件:将上述三个文件联系起来
5.编写一个weblogic-ejb-jar.xml:用来连接查找资源
上面两个xml文件都需要在META-INF目录中,并且和上述的这些类文件一起打包到一个jar文件中,然后部署到Server中,至此就完成了EJB的部署。
远程接口HelloWorld
HelloWorld.java
package com.weibo.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface HelloWorld extends EJBObject{
    public String sayHello() throws RemoteException ;
}
远程home接口HelloWorldHome
HelloWorldHome.java
package com.weibo.ejb;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface HelloWorldHome extends EJBHome{
     public HelloWorld create() throws RemoteException,CreateException;
}
实现类HelloWorldBean
HelloWorldBean.java
package com.weibo.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class HelloWorldBean implements SessionBean {
   public void ejbCreate(){
       System.out.println("===ejbCreate()方法被调用===");
   }
   public void ejbActivate() {
       System.out.println("===ejbActivate()方法被调用===");
   }
   public void ejbPassivate() {
       System.out.println("===ejbPassivate()方法被调用===");
   }
   public void ejbRemove() {
       System.out.println("===ejbRemove()方法被调用===");
   }
   public void setSessionContext(SessionContext ctx) throws EJBException,RemoteException {
       System.out.println("===setSessionContext()方法被调用===");
   }
   public String sayHello()  {  
        return "hello world,"+new java.util.Date();  
    }
}
ejb-jar.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 id="ejb-jar_ID">
<enterprise-beans>
  <session id="helloWorldEJB">
   <ejb-name>HelloWorld</ejb-name>
   <home>com.weibo.ejb.HelloWorldHome</home>
   <remote>com.weibo.ejb.HelloWorld</remote>
   <ejb-class>com.weibo.ejb.HelloWorldBean</ejb-class>
   <session-type>Stateless</session-type>
   <transaction-type>Container</transaction-type>
  </session>
</enterprise-beans>
</ejb-jar>
weblogic-ejb-jar.xml
<?xml version="1.0"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN"
         "http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd">
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
  <ejb-name>HelloWorld</ejb-name>
  <jndi-name>HelloWorldName</jndi-name>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
使用ant来进行编译打包:
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="ejb" default="package" basedir="..">
<property name="app.dir" value="${basedir}/EJB2"/>
<property name="src.dir" value="${app.dir}/src"/>
<property name="weblogic.home" location="C:\BEA\wlserver_10.3"/>
<property name="build.dir" value="${app.dir}/build"/>
<property name="build.classes.dir" value="${build.dir}/classes"/>
<property name="build.classes.metainf" value="${build.classes.dir}/META-INF"/>

<path id="build.classpath">
  <fileset dir="${weblogic.home}/server/lib">
   <include name="*.jar"/>
  </fileset>
  <pathelement location="${build.classes.dir}"/>
</path>

<target name="prepare" depends="clean">
  <mkdir dir="${build.dir}"/>
  <mkdir dir="${build.classes.dir}"/>
  <mkdir dir="${build.classes.metainf}"/>
</target>

<target name="compile" depends="prepare">
  <javac srcdir="${src.dir}" destdir="${build.classes.dir}" debug="on" deprecation="on"
   optimize="off" includes="com/**">
   <classpath refid="build.classpath"/>
  </javac>
  <copy todir="${build.classes.metainf}">
   <fileset dir="${app.dir}/META-INF">
    <include name="ejb-jar.xml,weblogic-ejb-jar.xml"/>
   </fileset>
  </copy>
</target>

<target name="package" depends="compile">
  <jar jarfile="${app.dir}\helloworld.jar">
   <fileset dir="${build.classes.dir}">
    <include name="**/*.*"/>
   </fileset>
  </jar>
</target>

<target name="clean">
  <delete dir="${build.dir}"/>
</target>
</project>

将打包后的helloworld.jar部署到weblogic中,一种简易方法就是直接放入域的autodeploy目录中。本机的目录为:
C:\BEA\user_projects\domains\kacaric\autodeploy。此时ejb的部署就完成了。下面测试该EJB
下面编写客户端测试类:
HelloWorldClient.java
package com.weibo.client;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import com.weibo.ejb.HelloWorld;
import com.weibo.ejb.HelloWorldHome;
public class HelloWorldClient {
     public static void main(String[] args) throws Exception{
          Properties props = new Properties();
          props.put(Context.INITIAL_CONTEXT_FACTORY,  "weblogic.jndi.WLInitialContextFactory");  
          props.put(Context.PROVIDER_URL,  "t3://localhost:7001");  
          InitialContext context = new InitialContext(props);
          HelloWorldHome home = (HelloWorldHome)context.lookup("HelloWorldName"); 
          HelloWorld hello = home.create();
          System.out.println(hello.sayHello());
     }
}
运行结果:hello world,Sun July 17 17:07:21 CST 2011
客户端测试类中的Properties是初始化weblogic中的xml信息,t3://localhost:7001是weblogic的特殊协议指向的ip位置,然后根据weblogic-ejb-jar.xml中配置的jndi名称找到EJB组件,即HelloWorldHome接口,随即通过它的create方法得到HelloWorld实例,调用sayHello方法。

你可能感兴趣的:(weblogic,ejb)