JBoss EJB3(Stateful Session Beans)备忘记

很多书对 Entity Beans , Stateful 及 Stateless Session Beans 有非常详细的说明,
小弟愚昧, 当初看 Mastering EJB 时, 看完了还是一头问号, 现在亦了解不深.
由于这编只是以简洁实作为主的备忘记, 故以最简单的表示方法作简介.

Session Beans 的主要作用是访问 Entity Beans, Sesseion Beans 可看作 domain story,
它描述几个 Beans 之间的工作流程, 所以 Session Beans 主要包含 business logic 的流程.
Entity Beans 主要是作为 OR Mapping 的 business model 对像, 与资料库储存对应的 model.
有了 Entity Beans 的 ORM(Object Relational Mapping), 开发员就不用关心关联式资料库的资料关系,
交由 EntityManager service 帮忙管理, 开发员把重心放在 objects model (Entity Beans) 间关系,
简单的说, 开发员在操作 Entity Beans 时可看作操作虚拟的 Objects Database.

Session Beans 分为 Stateless 及 Stateful Session Beans, 即 无状态 及 有状态 Session Beans.
无状态 Session Beans 主要是执行基於单个 request 的动作, 如产生报告 及 验证 credit cards等.
有状态 Session Beans 可记录 client 多个 request 间动作, 典型的例子是记录 client 已点选的购物车商品.

开始备忘记:
这次备忘记主题是 Stateful Session Beans, 当然是以 Shopping Cart 作为例子.
[1] Eclipse 启动 JBoss Server
[2] Eclipse 建立第一个 Stateful Session Beans Project
[3] 建立 Shopping cart Stateful Beans
[4] 建立客户端测试程式
[5] 使用 ANT 建立 EJB-JAR 并执行 ShoppingCartClient 程式

[1] Eclipse 启动 JBoss Server:
Eclipse: Windows -> Show View -> Other
  -->> JBoss-IDE -> Server Configuration 就会显示 JBoss Server Configuration console
  然后 right client 它按 start , JBoss 就会启动, 如下图所示:


[2] Eclipse 建立第一个 Stateful Session Beans Project:
Eclipse: File -> New -> Other -> EJB 3.0 -> EJB 3.0 Project
Project Name: StatefullEJB3 -> Next
选择上一编已建立的 JBoss 4.0.x: jboss_configuration [default](not running)
打开后右键点选 JBoss 4.0.x -> new
然后按 Finish. StatefullEJB3 project 就建立了

[3] 建立 Shopping cart Stateful Beans:
/*----------------------- ShoppingCart.java ---------------------*/
package ejb3.joeyta.sessions;
import java.util.HashMap;
import javax.ejb.Remove;
public interface ShoppingCart     // 建立 interface
{
   void buy(String product, int quantity);   // 建立 Shopping Cart buy method
   HashMap<String, Integer> getCartContents();  // 取回 Shopping Cart HashMap
   @Remove void checkout();    // 结帐, 这里加入 @Remove 的意思是当呼叫它, 就会清除这个 Instance
}
/*----------------------- ShoppingCart.java ---------------------*/

/*----------------------- ShoppingCartBean.java -----------------*/
package ejb3.joeyta.sessions;
import java.io.Serializable;
import java.util.HashMap;
import javax.ejb.Remote;
import javax.ejb.Remove;
import javax.ejb.Stateful;

@SuppressWarnings("serial")  
@Stateful                 // @Stateful 表示这是 Statefull Session Beans
@Remote(ShoppingCart.class)
public class ShoppingCartBean implements ShoppingCart, Serializable {
 private HashMap<String, Integer> cart = new HashMap<String, Integer>();
   // 建主 HashMap cart 储存购买的 product
 public void buy(String product, int quantity) {
  if (cart.containsKey(product)) {  // 判断是否曾经选购此 product
   int currq = cart.get(product);
   currq += quantity;
   cart.put(product, currq);  // 将欲选购的 product 加入 HashMap cart 里
  } else {
   cart.put(product, quantity);
  }
 }
 
 public HashMap<String, Integer> getCartContents() {
  return cart;
 }
 
 @Remove
 public void checkout() {
   System.out.println("Print cart list on server:"); // 结帐时在Server打印选购清单
  HashMap<String, Integer> fullCart = getCartContents(); 
  for(String product : fullCart.keySet()){
   System.out.println(fullCart.get(product) + "   " + product);
  }
  System.out.println("Checked Out");
 }
}
/*----------------------- ShoppingCartBean.java -----------------*/


[4] 建立客户端测试程式:
/*----------------------- ShoppingCartClient.java ---------------*/
package ejb3.joeyta.clients;
import java.util.HashMap;
import javax.naming.InitialContext;
import ejb3.joeyta.sessions.ShoppingCart;
public class ShoppingCartClient
{
   public static void main(String[] args) throws Exception
   {
      InitialContext ctx = new InitialContext();
      ShoppingCart cart = (ShoppingCart) ctx.lookup("ShoppingCartBean/remote");

      System.out.println("Buying 1st Cake");
      cart.buy("Cake", 1);  // 买第一个 Cake

      System.out.println("Buying 2nd Cake");
      cart.buy("Cake", 1);  // 买第二个 Cake
     
      System.out.println("Buying 1st Bread");
      cart.buy("Bread", 1); // 买第一个 Bread

      System.out.println("Print cart list on client:"); // 打印选购清单
      HashMap<String, Integer> fullCart = cart.getCartContents();
      for (String product : fullCart.keySet())
      {
         System.out.println(fullCart.get(product) + "     " + product);
      }

      System.out.println("Checkout");
      cart.checkout();  // 结帐, 还记得吗, 呼叫此 method 会清除此 instance

      System.out.println("Should throw an object not found exception by invoking on cart after @Remove method");
      try
      {
         cart.getCartContents();  // 由于己清除此instance, 这里再测试是否己清除
      }
      catch (javax.ejb.EJBNoSuchObjectException e)
      {
         System.out.println("Successfully caught no such object exception.");
      }
   }
}
/*----------------------- ShoppingCartClient.java ---------------*/

项目结构如下所示:

[5] 使用 ANT 建立 EJB-JAR 并执行 ShoppingCartClient 程式:
在 HelloWorldEJB3 project 下建立 build.xml [ ANT build File ]
内容如下:
<!------------------------- build.xml ------------------------------->
<?xml version="1.0"?>
<project name="JBoss" default="run.ShoppingCartClient" basedir=".">
 <property environment="env" />
 <property name="jboss.home" value="${env.JBOSS_HOME}" />
 <property name="classes.dir" value="bin" />

 <path id="classpath">
  <fileset dir="${jboss.home}/client">
   <include name="**/*.jar" />
  </fileset>
  <pathelement location="${classes.dir}" />
 </path>
 
 <target name="clean">
  <delete file="${basedir}/ShoppingCart.jar" />
  <delete file="${jboss.home}/server/default/deploy/ShoppingCart.jar" />
 </target>
  
 <target name="ejbjar" depends="clean">
  <jar jarfile="ShoppingCart.jar">
   <fileset dir="${classes.dir}">
    <include name="ejb3/joeyta/sessions/*.class" />
   </fileset>
  </jar>
  <copy file="ShoppingCart.jar" todir="${jboss.home}/server/default/deploy" />
 </target>

 <target name="run.ShoppingCartClient" depends="ejbjar">
  <java classname="ejb3.joeyta.clients.ShoppingCartClient" fork="yes" dir=".">
   <classpath refid="classpath" />
  </java>
 </target>
</project>
<!------------------------- build.xml ------------------------------->

build.xml 项目:
classpath 描述所需的 libraries 及 classes 的位置.
clean 清除项目所产生的 ShoppingCart.jar 及 JBoss deploy 里的 ShoppingCart.jar
ejbjar 产生 ShoppingCart.jar
run.ShoppingCartClient 执行 Client 测试程式 ShoppingCartClient

点选 build -> Run As -> 2. Ant Build
Eclipse Console 输出为
     [java] Buying 1st Cake
     [java] Buying 2nd Cake
     [java] Buying 1st Bread
     [java] Print cart list on client:
     [java] 1     Bread
     [java] 2     Cake
     [java] Checkout
     [java] Should throw an object not found exception by invoking on cart after @Remove method
     [java] Successfully caught no such object exception.
如下图所示:

JBoss Console  输出为
18:09:03,714 INFO  [STDOUT] Print cart list on server:
18:09:03,714 INFO  [STDOUT] 1   Bread
18:09:03,714 INFO  [STDOUT] 2   Cake
18:09:03,714 INFO  [STDOUT] Checked Out
如下图所示:
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章