因为代码比较多,这里只是列出了针对SSH整合而言新的东西,这里附源码下载,如果对SSH整合不清楚,可以看SSH2框架搭建。
刚开始使用EJB做项目,如果有问题欢迎和我交流,共同进步。
这是比较流行的经典J2EE架构,它从物理上和逻辑上把EJB和web组件区分开了,因为可以运行在不同的JVM或者机器上。
唠叨
高校项目紧张的进行着,合作开发分配了任务,有了任务的驱动,平时偶尔的困倦也消失了,学习效率也提高了。平时的学习,也在进行任务驱动,不过缺乏这种强烈完成任务的压力。
这两天我们在搭建环境,顺便来说说spring,struts,ejb的整合
原理
这个整合由两个项目组成,EJB项目和Web项目。这点有点出乎意料,刚开始还在想在一个项目中如何整合的问题。
EJB项目
通过Session Bean对数据的CRUD操作,相当于完成Dao层的操作;通过Entity Bean实现OR映射。
最终将服务发布到JNDI
Web项目
在spring和struts集成的基础上,通过spring管理EJB的JNDI。
业务逻辑放在这个项目中了,这里提到一下,后面会说说这样做的不足。
步骤
大概说一下整合的过程
下面说说,针对SSH整合而言,SSE整合新的东西
spring管理EJB的JNDI
<!-- 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项目中的Module和Interface打包,放在Web项目中。而我在打包EJB项目时,把persistence.xml也打进去了,也就存在两份相同的persistence.unit:unitName
思考整合过程中的不足
完成之后,回过来头看看,觉得业务逻辑应该放在EJB中,由Session Bean去完成。因为Dao层的粒度肯定大于Service层,如果把Service放在Web项目中,Web项目会和EJB项目进行更多的通信,尽管他们都是在同一个JBoss中,如果数据量大的话,就会产生明显的性能问题。