临时搭建需要什么手续SSH时的思考和遇到的几个问题的解决方法

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
搭建SSH时的思考和遇到的几个问题的解决方法
摘要:SSH流行很久了,一直看到官方文档和网上都在讲如何整合SSH,讨论各种整合的优缺点。今天我比较闲,也用我的一些想法来试着整合这三个最流行的框架。本次所用版本为:Struts1.3.9Spring2.5Hiberante3.2开发工具和环境为:Eclipse3.3+MyEclipse6.0+JBoss4.2+Tomcat用SSH时,我们的架构自然就会分成三层,即表现层,逻辑层和持久层,按照MartinFlower的指导思想,耦合越少越好,下层为上层提供服务,这也是Rod开发Sp
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& &
4 & struts-config &
5 & form-beans &
6 & form-bean name =&loginForm& type =&com.***.ssh.view.login.LoginForm& /&
7 &/ form-beans &
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 &
16 & controller
17 processorClass =&org.springframework.web.struts.AutowiringRequestProcessor& /&
19 & message-resources parameter =&ApplicationResources& /&
20 &/ struts-config &
这个文件中可以发现,跟没有与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& &
4 & beans &
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 &
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 &
20 & bean id =&UsersDao& class =&com.***.ssh.persistence.UserDao& &
21 & property name =&sessionFactory& &
22 & ref bean =&SSHSessionFactory& /&
23 &/ property &
24 &/ bean &
25 &/ beans &
这里面也没有多余的内容,不会出现代理方式时,多份XML同时配置的问题,减少了维护量。
同时,你会发现,我并没有把Hibernate的具体配置放在这里面,而是用Hibernate自身的配置来管理。
这样的话,我们三层之间的依赖性会降到较低,两头可以任意换到其中的某一层。
顺便要说的是,常见的书籍上面发现往往不会有如此深入的探讨,难道是怕初学者看不懂吗?
另外,对于一个架构来说,要解决的问题决不是指这些,通常我们可以采用RUP的4+1视图的方法去考虑架构的方方面面。我们也可以从以下一些方面来各个击破:安全性,数据输入输出的校验与转换,国际化,LOG,异常处理,异构系统整合,后台运行程序等等。如果是多个数据库,我们还需要更多的考虑事务控制。
我想我后面会去完善这个整合,并实现一个Demo,作为小的简单的项目快速开发的基础。
整合时遇到过如下问题:
问题1:启动时出现 “严重: Error listenerStart ”
这个问题,网上有很多解决办法:
有一种最简单的解决办法是把用Listener初始化Spring改为用Servlet初始化Spring,但这样的方法不太好,一是没有找到根源,二是可能会带来新的问题。
比较好的一种解决办法是,加上Log4J的相关配置,然后再启动时,就会出现各类详细信息,这样可根据具体信息再来解决,一般可能是DataSource配置,或环境配置有问题。
参考网址:http://hi.baidu.com/xht314/blog/item/808ecf13c1ddaf.html
问题2:遇到“Required extension qdox not found”这样的提示
网上也有解答,我用的方法是直接把commons-attributes-compiler.jar这个包去掉。当然如果你要用到这个包的话,可以参考下面这个地址: http://hi.baidu.com/sky_lei/blog/item/77eee8248824.html
问题3:Struts包与Spring包冲突的问题
我遇到包有冲突,换成Struts需要的优先就OK了,现在的JAR档越来越麻烦了,很多项目的JAR档都被开发人员搞得乱七八糟,看来Maven是个好东西,至少思想是好的,可能下一步需要研究一下。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
搭建SSH时的思考和遇到的几个问题的解决方法相关信息,包括
的信息,所有搭建SSH时的思考和遇到的几个问题的解决方法相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International搭建SSH时的思考和遇到的几个问题的解决方法
搭建SSH时的思考和遇到的几个问题的解决方法
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:
&? xml version="1.0" encoding="UTF-8" ?&
&! DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd" &
& struts-config &
& form-beans &
& form-bean
name ="loginForm"
type ="com.***.ssh.view.login.LoginForm"
&/ form-beans &
& global-exceptions
& global-forwards
& action-mappings &
name ="loginForm"
path ="/login"
scope ="request"
type ="com.***.ssh.view.login.LoginAction"
validate ="false"
&/ action-mappings &
& controller 17
processorClass ="org.springframework.web.struts.AutowiringRequestProcessor"
& message-resources
parameter ="ApplicationResources"
&/ struts-config &
这个文件中可以发现,跟没有与Spring集成时就一点不一样,多了一行:
&controller
processorClass="org.springframework.web.struts.AutowiringRequestProcessor" /& 再来看看Spring的配置文件applicationContext.xml:
&? xml version="1.0" encoding="UTF-8" ?&
&! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" &
id ="SSHSessionFactory"
class ="org.springframework.orm.hibernate3.LocalSessionFactoryBean" &
& property
name ="configLocation" &
& value & classpath:hibernate.cfg.xml &/ value &
&/ property &
name ="LoginService"
class ="com.***.ssh.biz.login.LoginService"
singleton ="false" &
& property
name ="dao" &
bean ="UsersDao"
&/ property &
id ="UsersDao"
class ="com.***.ssh.persistence.UserDao" &
& property
name ="sessionFactory" &
bean ="SSHSessionFactory"
&/ property &
&/ beans &
这里面也没有多余的内容,不会出现代理方式时,多份XML同时配置的问题,减少了维护量。 同时,你会发现,我并没有把Hibernate的具体配置放在这里面,而是用Hibernate自身的配置来管理。 这样的话,我们三层之间的依赖性会降到较低,两头可以任意换到其中的某一层。 顺便要说的是,常见的书籍上面发现往往不会有如此深入的探讨,难道是怕初学者看不懂吗? 另外,对于一个架构来说,要解决的问题决不是指这些,通常我们可以采用RUP的4+1视图的方法去考虑架构的方方面面。我们也可以从以下一些方面来各个击破:安全性,数据输入输出的校验与转换,国际化,LOG,异常处理,异构系统整合,后台运行程序等等。如果是多个数据库,我们还需要更多的考虑事务控制。 我想我后面会去完善这个整合,并实现一个Demo,作为小的简单的项目快速开发的基础。 整合时遇到过如下问题: 问题1:启动时出现 “严重: Error listenerStart ” 这个问题,网上有很多解决办法: 有一种最简单的解决办法是把用Listener初始化Spring改为用Servlet初始化Spring,但这样的方法不太好,一是没有找到根源,二是可能会带来新的问题。 比较好的一种解决办法是,加上Log4J的相关配置,然后再启动时,就会出现各类详细信息,这样可根据具体信息再来解决,一般可能是DataSource配置,或环境配置有问题。 参考网址:http://hi.baidu.com/xht314/blog/item/808ecf13c1ddaf.html 问题2:遇到“Required extension qdox not found”这样的提示 网上也有解答,我用的方法是直接把commons-attributes-compiler.jar这个包去掉。当然如果你要用到这个包的话,可以参考下面这个地址: http://hi.baidu.com/sky_lei/blog/item/77eee8248824.html 问题3:Struts包与Spring包冲突的问题 我遇到包有冲突,换成Struts需要的优先就OK了,现在的JAR档越来越麻烦了,很多项目的JAR档都被开发人员搞得乱七八糟,看来Maven是个好东西,至少思想是好的,可能下一步需要研究一下。
Copyright & 2016 phpStudy本人现开发一个以SSH为基础框架搭建的项目,遇到一些问题,希望找有经验的Java工程师解决,并付以酬劳,酬劳依据解决问题是否符合要求而定。 - ITeye问答
本系统是以B/S结构进行构建,以本人开发的客户端访问Java服务器进行数据访问和处理。服务器端采用SSH架构进行开发,服务器端系统的基本框架已搭建好了,使用Struts作为控制层,Spring集成Hibernate进行Bean对象管理。
工作内容主要有如下几个方面:
1、 希望对当前搭建好的SSH部分配置提出一些优化方面稳定性和性能方面的建议。
2、 本系统使用时希望在Spring加载数据库配置时,如果出现任何无法连接数据库的问题时,该部分的配置将被以某种方式忽略掉或模拟一个假数据库源让加载过程顺利完成。(这是主要部分)
3、 检查部分主体流程代码提供一些代码优化的策略(这一部分可不作)。
有能力解决者请提供联系我:。
问题补充:本系统使用时希望在Spring加载数据库配置时,如果出现任何无法连接数据库的问题时,该部分的配置将被以某种方式忽略掉或模拟一个假数据库源让其它Spring配置文件内容能正确加载过程顺利完成。这样作的目的是在某些情况下我们系统会连接多个其它系统的数据库来采集数据,但可能这些数据库没有打开或无法连接,这时候我们想要这些不能正确连接的数据库的Spring配置文件部分在Spring加载时一旦发现无法连接则被忽略掉,这样就不会影响其它已配置和要用到的Bean的加载过程,之后我们系统在要连接那些没有正确加载的数据库时,如果发现没有正确连接或无法连接这些数据库时就可通过程序来处理这些异常,这样我们就可以在一开始就配置多个可能要用到的数据变回 连接,数据库连接配置部分如下:(这是主要部分)
&?xml version="1.0" encoding="UTF-8"?&
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"&
&bean id="baseDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"&
&property name="driver" value="${base.driver}"/&
&property name="driverUrl" value="${base.url}"/&
&property name="user" value="${base.user}"/&
&property name="password" value="${base.password}"/&
&property name="alias" value="${base.alias}"/&
&property name="maximumConnectionCount" value="${base.maximumConnectionCount}"/&
&property name="minimumConnectionCount" value="${base.minimumConnectionCount}"/&
&property name="delegateProperties" value="characterEncoding=${base.characterEncoding}"/&
&property name="simultaneousBuildThrottle" value="${base.simultaneousBuildThrottle}"/&
&bean id="baseSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&
&property name="dataSource" ref="baseDataSource" /&
&property name="mappingResources"&
&value&com/sunshine/business/sc/data/SqlUserdefinedCol.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/SqlUserdefinedSet.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/SqlUserdefinedTab.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxUsers.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxHospital.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxFuncTree.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxDeptTree.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxDept.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/Phonetic.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/LockType.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/LockGrant.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/Form.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/DictType.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/DictItem.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxFuncTab.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxFuncTreeTitle.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxUploadFile.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxStorageConfig.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/FormAutoSave.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/SystemConfigInfo.hbm.xml&/value&&
&&&&&&& &value&com/sunshine/business/sc/data/QxUserKeypair.hbm.xml&/value&
&value&com/sunshine/business/sc/data/QxSource.hbm.xml&/value&
&/property&
&property name="hibernateProperties"&
&prop key="hibernate.dialect"&${base.hibernate.dialect}&/prop&
&prop key="hibernate.show_sql"&true&/prop&
&!-- &prop key="hibernate.hbm2ddl.auto"&create,update&/prop&--&
&prop key="hibernate.jdbc.fetch_size"&20&/prop&
&prop key="hibernate.jdbc.batch_size"&20&/prop&
&/property&
&bean id="baseTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"&
&property name="sessionFactory" ref="baseSessionFactory"&&/property&
&bean id="baseTransactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"&
&property name="transactionManager" ref="baseTransactionManager" /&
&property name="transactionAttributes"&
&prop key="get*"&PROPAGATION_REQUIRED,readOnly&/prop&
&prop key="*"&PROPAGATION_REQUIRED&/prop&
&/property&
&/beans&
您说的那种方式只需忽略Spring容器加载时抛出的错误但不能正确加载其它正确配置的数据库连接信息和其它Bean信息,我们的要求其它简单点就是Spring中配置的任何错误配置在加载时都应忽略,且不会影响其它正确配置的内容。[
问题补充:Rambing 写道引用
这样作的目的是在某些情况下我们系统会连接多个其它系统的数据库来采集数据
这个是不是说你们有多个数据源。
一个主数据源,这个你们会保证其正确性。
另外是多个辅助数据源,这些不一定正确,无法保证。所以当这些辅助数据源出错的时候可以不影响主数据源的正常工作是吧。
看当前贴出来的发现只有一个datasource的配置。
个人认为应该用多datasource, 多个SessionFactory实现。
对于主数据库的所有操作按照正常的处理逻辑来实现。而对于那些辅助的datasource则进行代理实现,如果可用那么就保持其原有的运行路径,如果不可用生成一个代理的Connection。 接下来时重写Spring的TransactionInterceptor类,再代理对象最开始的时候进行Connection对象的判定,如果是代理对象直接跳过,不做任何处理,应该就可以避开了。
不过这里处理到了多数据源,那么在正常情况下,还需要考虑多数据源的事务处理了。 也需要改用Spring的JTA来进行相应的事务控制。
以上只是提供个人的一些思路, 希望对楼主有帮助。
可以说是您据说的情况,我给出的连接配置文件只是一个,我们存在多个这样的文件,也配置了多个sessionFactory,要求主数据源外的其它数据源在出错时能保证主数据源正常使用,按您说的数据源的代理实现是什么意思呢?如果可以可以电话联系您吗,对于这个问题如果您能给出一个我们要求的解决方法,我们愿意给一定的酬劳,如果可以请加我的QQ号:Rambing 写道引用
这样作的目的是在某些情况下我们系统会连接多个其它系统的数据库来采集数据
这个是不是说你们有多个数据源。
一个主数据源,这个你们会保证其正确性。
另外是多个辅助数据源,这些不一定正确,无法保证。所以当这些辅助数据源出错的时候可以不影响主数据源的正常工作是吧。
看当前贴出来的发现只有一个datasource的配置。
个人认为应该用多datasource, 多个SessionFactory实现。
对于主数据库的所有操作按照正常的处理逻辑来实现。而对于那些辅助的datasource则进行代理实现,如果可用那么就保持其原有的运行路径,如果不可用生成一个代理的Connection。 接下来时重写Spring的TransactionInterceptor类,再代理对象最开始的时候进行Connection对象的判定,如果是代理对象直接跳过,不做任何处理,应该就可以避开了。
不过这里处理到了多数据源,那么在正常情况下,还需要考虑多数据源的事务处理了。 也需要改用Spring的JTA来进行相应的事务控制。
以上只是提供个人的一些思路, 希望对楼主有帮助。
问题补充:Rambing 写道引用
这样作的目的是在某些情况下我们系统会连接多个其它系统的数据库来采集数据
这个是不是说你们有多个数据源。
一个主数据源,这个你们会保证其正确性。
另外是多个辅助数据源,这些不一定正确,无法保证。所以当这些辅助数据源出错的时候可以不影响主数据源的正常工作是吧。
看当前贴出来的发现只有一个datasource的配置。
个人认为应该用多datasource, 多个SessionFactory实现。
对于主数据库的所有操作按照正常的处理逻辑来实现。而对于那些辅助的datasource则进行代理实现,如果可用那么就保持其原有的运行路径,如果不可用生成一个代理的Connection。 接下来时重写Spring的TransactionInterceptor类,再代理对象最开始的时候进行Connection对象的判定,如果是代理对象直接跳过,不做任何处理,应该就可以避开了。
不过这里处理到了多数据源,那么在正常情况下,还需要考虑多数据源的事务处理了。 也需要改用Spring的JTA来进行相应的事务控制。
以上只是提供个人的一些思路, 希望对楼主有帮助。
不过在此衷心感谢Rambing的无私帮助!
引用
这样作的目的是在某些情况下我们系统会连接多个其它系统的数据库来采集数据
这个是不是说你们有多个数据源。
一个主数据源,这个你们会保证其正确性。
另外是多个辅助数据源,这些不一定正确,无法保证。所以当这些辅助数据源出错的时候可以不影响主数据源的正常工作是吧。
看当前贴出来的发现只有一个datasource的配置。
个人认为应该用多datasource, 多个SessionFactory实现。
对于主数据库的所有操作按照正常的处理逻辑来实现。而对于那些辅助的datasource则进行代理实现,如果可用那么就保持其原有的运行路径,如果不可用生成一个代理的Connection。 接下来时重写Spring的TransactionInterceptor类,再代理对象最开始的时候进行Connection对象的判定,如果是代理对象直接跳过,不做任何处理,应该就可以避开了。
不过这里处理到了多数据源,那么在正常情况下,还需要考虑多数据源的事务处理了。 也需要改用Spring的JTA来进行相应的事务控制。
以上只是提供个人的一些思路, 希望对楼主有帮助。
引用
1、 希望对当前搭建好的SSH部分配置提出一些优化方面稳定性和性能方面的建议。
3、 检查部分主体流程代码提供一些代码优化的策略(这一部分可不作)。
可否把详细的文件拿出来看看。
引用
2、 本系统使用时希望在Spring加载数据库配置时,如果出现任何无法连接数据库的问题时,该部分的配置将被以某种方式忽略掉或模拟一个假数据库源让加载过程顺利完成。(这是主要部分)
不知道这样做的目的是什么。
为了测试吗?
还是为了友好性,不让用户看到爆掉的页面?还是其他的目的。
不同的目的实现方式可以完全不同。
最简单的
重写Spring的加载Listener,捕获异常到Spring不加载,直接忽略。
再写个Filter,然后测试下连接是否可用,如果不可用忽略所有的请求。
那么这也在某种程度达到了楼主的要求了。
已解决问题
未解决问题搭建SSH时的思考和遇到的几个问题的解决方法
转载 &更新时间:日 21:33:17 & 作者:
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/808ecf13c1ddaf.html 问题2:遇到“Required&extension&qdox&not&found”这样的提示 网上也有解答,我用的方法是直接把commons-attributes-compiler.jar这个包去掉。当然如果你要用到这个包的话,可以参考下面这个地址: http://hi.baidu.com/sky_lei/blog/item/77eee8248824.html 问题3:Struts包与Spring包冲突的问题 我遇到包有冲突,换成Struts需要的优先就OK了,现在的JAR档越来越麻烦了,很多项目的JAR档都被开发人员搞得乱七八糟,看来Maven是个好东西,至少思想是好的,可能下一步需要研究一下。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 微课平台搭建几个步骤 的文章

 

随机推荐