随笔-193  评论-715  文章-1  trackbacks-0

SSH流行很久了,一直看到官方文档和网上都在讲如何整合SSH,讨论各种整合的优缺点。今天我比较闲,也用我的一些想法来试着整合这三个最流行的框架。

本次所用版本为:Struts 1.3.9   Spring 2.5   Hiberante 3.2
开发工具和环境为:Eclipse 3.3+MyEclipse 6.0+JBoss 4.2+Tomcat

用SSH时,我们的架构自然就会分成三层,即表现层,逻辑层和持久层,按照Martin Flower的指导思想,耦合越少越好,下层为上层提供服务,这也是Rod开发Spring的指导思想之一,所以我首先想到的就是如何减少到最低的耦合。
根据Spring 2.0官方文档中推荐的做法,Spring与Struts1.x集成,有采用代理类的方式,也有用ActionSupport的方式,但是我认为这两种方式无疑都有很强的侵入性和依赖性,这与Spring的思想有些矛盾。
我采用AutowiringRequestProcessor来做,这个类会自动为你装载你所需要的Service,根据其Java Doc的提示,其默认是byType匹配的,当然你也可以用byName的方式,我认为以Type的方式就OK了。来看看两个配置文件吧,先来看看Struts的配置文件struts-config.xml:

 1 <? xml version="1.0" encoding="UTF-8" ?>
 2 <! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd" >
 3
 4 < struts-config >
 5      < form-beans >
 6          < form-bean  name ="loginForm"  type ="com.***.ssh.view.login.LoginForm"   />
 7      </ form-beans >
 8
 9      < global-exceptions  />
10      < global-forwards  />
11      < action-mappings >
12          < action  name ="loginForm"  path ="/login"  scope ="request"
13             type ="com.***.ssh.view.login.LoginAction"  validate ="false"   />
14      </ action-mappings >
15     
16      < controller
17          processorClass ="org.springframework.web.struts.AutowiringRequestProcessor"   />
18
19      < message-resources  parameter ="ApplicationResources"   />
20 </ struts-config >
21
22

这个文件中可以发现,跟没有与Spring集成时就一点不一样,多了一行:
 <controller  processorClass="org.springframework.web.struts.AutowiringRequestProcessor" />

再来看看Spring的配置文件applicationContext.xml:

 1 <? xml version="1.0" encoding="UTF-8" ?>
 2 <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
 3
 4 < beans >
 5
 6      < bean  id ="SSHSessionFactory"
 7         class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
 8          < property  name ="configLocation" >
 9              < value > classpath:hibernate.cfg.xml </ value >
10          </ property >
11      </ bean >
12     
13      < bean  name ="LoginService"
14         class ="com.***.ssh.biz.login.LoginService"  singleton ="false" >
15          < property  name ="dao" >
16              < ref  bean ="UsersDao"   />
17          </ property >
18      </ bean >
19
20      < bean  id ="UsersDao"  class ="com.***.ssh.persistence.UserDao" >
21          < property  name ="sessionFactory" >
22              < ref  bean ="SSHSessionFactory"   />
23          </ property >
24      </ bean >
25 </ beans >
26

这里面也没有多余的内容,不会出现代理方式时,多份XML同时配置的问题,减少了维护量。
同时,你会发现,我并没有把Hibernate的具体配置放在这里面,而是用Hibernate自身的配置来管理。

这样的话,我们三层之间的依赖性会降到较低,两头可以任意换到其中的某一层。

顺便要说的是,常见的书籍上面发现往往不会有如此深入的探讨,难道是怕初学者看不懂吗?
另外,对于一个架构来说,要解决的问题决不是指这些,通常我们可以采用RUP的4+1视图的方法去考虑架构的方方面面。我们也可以从以下一些方面来各个击破:安全性,数据输入输出的校验与转换,国际化,LOG,异常处理,异构系统整合,后台运行程序等等。如果是多个数据库,我们还需要更多的考虑事务控制。

我想我后面会去完善这个整合,并实现一个Demo,作为小的简单的项目快速开发的基础。



整合时遇到过如下问题:
问题1:启动时出现 “严重: Error listenerStart ”
这个问题,网上有很多解决办法:
有一种最简单的解决办法是把用Listener初始化Spring改为用Servlet初始化Spring,但这样的方法不太好,一是没有找到根源,二是可能会带来新的问题。
比较好的一种解决办法是,加上Log4J的相关配置,然后再启动时,就会出现各类详细信息,这样可根据具体信息再来解决,一般可能是DataSource配置,或环境配置有问题。
参考网址:http://hi.baidu.com/xht314/blog/item/808ecf13c1dd1820dd5401af.html

问题2:遇到“Required extension qdox not found”这样的提示
网上也有解答,我用的方法是直接把commons-attributes-compiler.jar这个包去掉。当然如果你要用到这个包的话,可以参考下面这个地址:
http://hi.baidu.com/sky_lei/blog/item/77ee17085543b232e8248824.html

问题3:Struts包与Spring包冲突的问题
我遇到包有冲突,换成Struts需要的优先就OK了,现在的JAR档越来越麻烦了,很多项目的JAR档都被开发人员搞得乱七八糟,看来Maven是个好东西,至少思想是好的,可能下一步需要研究一下。

posted on 2007-11-28 19:17 Robin's Programming World 阅读(3038) 评论(9)  编辑  收藏 所属分类: Java

评论:
# re: 搭建SSH时的思考和遇到的几个问题 2008-03-18 17:21 | jetty_xiang
这个方法看来很好,我以前没有用过,以前一直用的整合方法是你前面介绍的两种,不过我想问你问题,你的这个< controller
processorClass="org.springframework.web.struts.AutowiringRequestProcessor" /> 跟< controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />好象是同有个道理,  回复  更多评论
  
# re: 搭建SSH时的思考和遇到的几个问题 2008-03-19 14:31 | Robin's Java World
@jetty_xiang
对,你说得没错,原理是一样,实现的方式不一样而已。  回复  更多评论
  
# re: 搭建SSH时的思考和遇到的几个问题 2008-04-06 13:29 | xx
用AutowiringRequestProcessor是不是就不用写beans.xml了?
自动给action里面的xxxService赋值?  回复  更多评论
  
# re: 搭建SSH时的思考和遇到的几个问题 2008-04-10 02:25 | Robin's Java World
@xx
不太清楚你的beans.xml里面写的些什么,所以不好回答。
但在Action中,其***Service是自动获得实例的,不用再去做任何配置或编写代码。这点是可以肯定的。
  回复  更多评论
  
# re: 搭建SSH时的思考和遇到的几个问题 2008-04-10 17:28 | xx
我说的beans.xml就是action的真实type
我是按照IBM的一篇文章配置的,用时struts插件。
struts里面的action type写的是org.springframework.web.struts.DelegatingActionProxy。
把真实的type写在在beans.xml里。
增加一个action,就要在beans.xml里面多写一个。
用了你的方法就少些一步了。  回复  更多评论
  
# re: 搭建SSH时的思考和遇到的几个问题 2008-04-11 00:05 | Robin's Java World
@xx
明白了,就是我说的第一种用代理的方式。
这样做我觉得不仅是配置文件多一个的问题,而且与Struts也绑死了。  回复  更多评论
  
# re: 搭建SSH时的思考和遇到的几个问题 2008-06-05 16:42 | 欧小雷
不知你是javaeye网站的那个robin吗?你那个想法,在Spring in aciton中有描述,与< controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />是一个道理,不过可以问你问题吗?ssh整合中声明式事务的代码我理解,可是在eclipse中能自动添加吗?能否给我一个文档,里面有详细操作,谢谢.我的邮箱:ouxiaolei_niu@tom.com  回复  更多评论
  
# re: 搭建SSH时的思考和遇到的几个问题 2008-06-06 17:41 | Robin's Java World
@欧小雷
javaeye的那个牛人是robbin,我是Robin。
DelegatingRequestProcessor和AutowiringRequestProcessor还是有些区别的。
声明式的事务管理就是在XML配置文件中进行一些配置,所以不需要自动添加什么代码,目前也没有什么工具可以自动加什么配置,所以也没有什么文档可以发给你,不好意思啦。  回复  更多评论
  
# 我有个SSH的怪问题, 2008-12-31 22:13 | 式样
我总共有5张表,其中 一张表,能册能增加能修改,就是不能查询啊,
其它表增册查改都正常?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: