提示:两次调用时,根本就不是一个bean,而是两个不同的bean。你最好用用一个序列化的类包装你这个stateful session,并且增加一个属性javax.ejb.Handle,通过这个javax.ejb.Handle来获取这个session.具体实现方法我就不说了!!!

解决方案 »

  1.   

    zmj1977(浪子) 
    ------------
    很可能不是同一个bean实例,但是却不该丢失会话的状态信息啊,ejbPassivate()和ejbActivate()不就是干这个的吗?
      

  2.   

    要保证两次调用使用的是同一个stateful session bean,你就需要把stateful session bean的handle保存下来,比如保存到session里面,然后下次使用的时候用这个handle得到SSB的remote接口.
    以你的例子为例:
    Handle handle = mycart.getHandle();
    session.setAttribute("cart",handle);
    取出来的时候就是:
    Handle handle = (Handle)session.getAttribute("cart");
    Object obj = handle.getRemoteObject();
    mycart = PortableRemoteObject.narrow(obj,mycart.class);
      

  3.   

    zmj1977(浪子):西 兄的:“提示:两次调用时,根本就不是一个bean,而是两个不同的bean。你最好用用一个序列化的类包装你这个stateful session”??????如何用一个序列化的类包装这个stateful session呢??????
        能否给个例子,分不够可以在发帖!
        谢谢!
        谢谢各位!!!!!
      

  4.   

    如定义一个Helper类包装stateful session://使用Local与LocalHome接口
    public class MyCartClientHelper implements java.io.Serializable {    private mycart cart = null;    public MyCartClientHelper () {
          try {
            InitialContext ic = new InitialContext();
            Object o = ic.lookup("mycart");
            mycartHome home =(mycartHome)o;
            cart = home.create();
         } catch (javax.ejb.CreateException cx) {
             throw new RuntimeException("Failed to Create CartClientHelper: caught " + cx);
         } catch (javax.naming.NamingException nx) {
             throw new RuntimeException("Failed to Create CartClientHelper: caught " + nx);
         }
        }   /**
        * Return a collection of CartItems
       */
       public Collection getItems() {
           return cart.getItems(java.util.Locale.getDefault());
       }    public HashMap getDetails() {
            return cart.getDetails();
        }    public void deleteItem(String itemId) {
            cart.deleteItem(itemId);
        }    public void addItem(String itemId) {
            cart.addItem(itemId);
        }    public void addItem(String itemId, int quantity) {
            cart.addItem(itemId, quantity);
        }    public void empty() {
            cart.empty();
        }
    }
      

  5.   

    用statefull session bean有没有考虑过性能?如果你的网站同时有几千个上万个用户在访问的话,考虑过吗?建议还是将客户信息存放在session中,调用stateless session bean。随意说说,如果不对,请不必在意。
      

  6.   

    同上,用个ArrayList相似的类包装一下,放入session。这样很简单就完成购物车的操作了。
      

  7.   

    如客户在图书点击加入“购物蓝”,就先判断
    是否存在session,如无则建立,有加入新增
    if(session.getAttribute("cart")==null){//不存在
        MyCartClientHelper my=new MyCartClientHelper();
        my.addItem(itemId);
        session.setAttribute("cart",my);
    }else{//存在
        my=(MyCartClientHelper)session.getAttribute("cart");
        my.addItem(itemId);
        session.setAttribute("cart",my);
    }