太长了,我没仔细看完,不过我想你还是没有理解透EJB
首先,所有的调用如你要调用session bean 或是实体bean,必须通过jndi查找。
实体bean只处理与数据库相关操用。
session bean一般处理逻辑。cmp,当一个实体bean被客户端引用,并执行一个业务方法后,容器会自动的读取bean中的实例字段,然后通过容器与数据库发生关系,保存改变的数据,执行完后,bean被钝化了,并调用ejbPassviate()方法通知bean, 当过一段时间,客户又调用这个bean的某个方法时, 被钝化的bean又被激活。但并不是马上执行这个业务方法,而是由EJB对像首先调用ejbActivate()方法通知bean, bean的实例要激活,然后从数据库中取数据,并自动将数组映射到bean的实例上,然后调用ejbLoad()方法,实例被在一次初始化,最后才执行要执行的业务方法。servlet当然可以通过jndi 去查找主接口的对像 
web层首先用户请求可以通过表单发送给服务器,服务器servlet 接收,并能过jndi查找相应主接口,并交由session bean或是Entity bean处理,不过大多数情况都是servlet调用session bean处理逻,需要操作数据库的时候,在通过jndi调用Entity bean

解决方案 »

  1.   

       没仔细看,但发现个问题,如果你看过<JAVA与模式>,根据"业务层与显示层分开"的原则,最好别在SERVLET中初始化EJB,自己写个辅助类EJBHELPER,在这里初始化,并用自己的方法封装EJB的方法,写个接口,
    根据超连接的不同,分别调用不同的SERVLET实现接口方法,在每个SERVLET中调用EJBHELPER中的方法,这样流程会清晰很多.   VO的使用可以优化EJB性能,但不一定每个字段都对应get/set方法,如果数据库改动频繁,那最好还是别用Entitybean了,可以用petstore模式,你看一下就知道了,就是EJB套用了JAVA的工厂模式,应对经常变化的数据很有效.
      

  2.   

    1.数据库是信息管理系统的核心,极少有表结构改了而不需要改动程序的(除非你已预先知道表结构会修改并在程序中做出了相应的处理),所谓分层只是为了减少改动和使改动的影响较小(程序结构清晰),比如你改了A表,则对应的DAO VO当然要改,但只改很少一点,同时如果web层要使用这个新增的字段,那么当然也要改(怎么可能不改??),不过只需要该相应的页面,程序以前提供的接口和调用它的程序都不会受到影响(这优点还不够么?)。
      

  3.   

    req.setAttribute("userlist",myCollection); //行1
    RequestDispatcher dispatcher=getServletContext().getRequestDispatcher("ListUser.jsp");
    dispatcher.forward(req,res);
    在ListUser.jsp中,我有一些疑惑:
    Collection myCollection=(Collection)request.getAttribute("list"); //行2
    写到这里,我不知道怎么继续了。
    在行1,放入atrribute中的集合中到底是什么东东?是UserBean的集合,还是UserBeand的主键的集合??
    在行2,我这里取得的myCollection中到底是些什么东东??
    如果是userBean或主键的集合,UserBean没有远程能力,不能这样访问吧?另外,采用SessionBean+CMP本身就是为了避免web层直接与CMP交互,这样做岂不将serlvet和bean扯上关系了?--
    如果要这样做,你应该为UserBean加上远程接口,这样存在atrribute中的就是UserBean的远程接口(实际上EJB的实现是通过主键来查找每一个记录的,不过这不由你管,你就把他看作远程接口就行了),然后调用相应的GET方法取的数据。如果要避免与CMP交互,你可以构造自己的VO(像你后面做的那样)
      

  4.   

    我很想用一个VO来代替其中的Object[],但是这个VO和CMP的bean类长得差不多,如果每个bean都来个VO,是不是纯属多余???
    ----
    大部分长的差不多:),不过你应该明白CMP是对应数据库的,VO你可以用来对应界面的业务需求,比如有个页面要显示几个表里的数据,你就可以在session bean里面组织,构造一个可用的业务VO,而且他们所处的位置是不同的,VO是在web层,ENTITY BEAN在数据层(可能还在不同的机器上呢)并且用VO,就会碰到方法一中遇到的问题,添加或减少一个字段,VO,UserManageBean ,serlvet都要做相应更改。
    -----
    上面已经说了,数据库的改动是影响最大的,不要期望不改代码