架构学习(二):经典J2EE架构之 SSE(spring3 struts2 ejb3的整合)


    因为代码比较多,这里只是列出了针对SSH整合而言新的东西,这里附源码下载,如果对SSH整合不清楚,可以看SSH2框架搭建

    刚开始使用EJB做项目,如果有问题欢迎和我交流,共同进步。

     

    这是比较流行的经典J2EE架构,它从物理上和逻辑上把EJB和web组件区分开了,因为可以运行在不同的JVM或者机器上。

     

    唠叨

    高校项目紧张的进行着,合作开发分配了任务,有了任务的驱动,平时偶尔的困倦也消失了,学习效率也提高了。平时的学习,也在进行任务驱动,不过缺乏这种强烈完成任务的压力。

     

    这两天我们在搭建环境,顺便来说说springstrutsejb的整合

     

    原理

    这个整合由两个项目组成,EJB项目和Web项目。这点有点出乎意料,刚开始还在想在一个项目中如何整合的问题。

     

    EJB项目

    通过Session Bean对数据的CRUD操作,相当于完成Dao层的操作;通过Entity Bean实现OR映射。

    最终将服务发布到JNDI

     

    Web项目

    springstruts集成的基础上,通过spring管理EJBJNDI

    业务逻辑放在这个项目中了,这里提到一下,后面会说说这样做的不足。

     

     

    步骤

    大概说一下整合的过程

    1. 编写EJB项目,将服务发布到JNDI
    1. 编写Web项目
      1. 通过spring管理JNDI
      2. 打包接口。将EJB项目的接口、实体打包,因为客户端只需要EJB的接口和实体,并把这个jar包加入到客户端项目的类路径中
      3. 通过spring加载jndi.properties

     

    下面说说,针对SSH整合而言,SSE整合新的东西

    spring管理EJBJNDI

    <!-- Loads a Properties instance -->
    <util:properties id="evn" location="/WEB-INF/jndi.properties"></util:properties>
     
    <!-- Exposes an object reference via a JNDI lookup.-->
    <jee:jndi-lookup jndi-name="UserDaoImpBean/remote" id="userDaoImpBean"
    lookup-on-startup="true" cache="true" proxy-interface="com.dao.UserDao"
    environment-ref="evn">
    </jee:jndi-lookup>

     

    jndi-name是JNDI Object的标识,UserDaoImpBean/remote就是EJB发布的JNDI Object的标识。

    proxy-interface是JNDI Object的代理接口,当jndi-lookup为lazy情况下,需要这个代理接口,所以这里应该使用的是JDK的动态代理(

    The proxy interface to use for the JNDI object. Needs to be specified because the actual JNDI

     object type is not known in advance in case of a lazy lookup. Typically used in conjunction with

     "lookupOnStartup"=false and/or "cache"=false.)。

     

     

    spring管理Services

      

     <bean id="userServices" class="com.services.impl.UserServicesImpl" scope="prototype">
           <property name="userDao" ref="userDaoImpBean"></property>
       </bean>

     

    userDaoImpBean标识指定的JNDI Object,在上面的配置中即可看到。

     

    整合时遇到的错误

    提示:persistence.unit:unitName=#SpringStrutsEjb is already installed

     

    这个错误在网上有好多不同解决方法,因为这个很多原因都会导致这个问题。解决了很久,还是自己静下心来使劲的想想之后,发现问题所在了。

     

    因为需要把EJB项目中的ModuleInterface打包,放在Web项目中。而我在打包EJB项目时,把persistence.xml也打进去了,也就存在两份相同的persistence.unit:unitName

     

    思考整合过程中的不足

    完成之后,回过来头看看,觉得业务逻辑应该放在EJB中,由Session Bean去完成。因为Dao层的粒度肯定大于Service层,如果把Service放在Web项目中,Web项目会和EJB项目进行更多的通信,尽管他们都是在同一个JBoss中,如果数据量大的话,就会产生明显的性能问题。

     

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