搭建SSH时的思考和遇到的几个问题的解决方法
程序员文章站
2024-02-21 10:58:16
ssh流行很久了,一直看到官方文档和网上都在讲如何整合ssh,讨论各种整合的优缺点。今天我比较闲,也用我的一些想法来试着整合这三个最流行的框架。 本次所用版本为:strut...
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是个好东西,至少思想是好的,可能下一步需要研究一下。
本次所用版本为: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是个好东西,至少思想是好的,可能下一步需要研究一下。