S2SHJ 整合(1)——Struts2+Spring

本文分为如下几个部分:
1. Struts2 和 Spring整合
2. Hibernate 和 Spring整合
3. Jbpm 和 Spring 整合

一、Struts2和Spring整合

1. Struts2 方面

Step 1 导入jar包

导入Struts2整合所需的Jar文件,都在Struts2发行包下面的lib目录中,包括:
commons-logging-{version}.jar
freemarker-{version}.jar
ognl-{version}.jar
struts2-core-{version}.jar
xwork-{version}.jar
struts2-spring-plugin-{version}.jar

最后一个粗红的jar包是关键!

Step 2 修改struts.xml配置文件


这一步改动的不是别处,就是其中action的配置,将原来的class属性由全程类名改动为在spring配置文件中的bean的ID名。假设,struts.xml文件中原来有如下的配置:
<action name="start" class="com.yourname.action.StartAction">
<result>index.jsp</result>
</action>

则现在将其改为:
<action name="start" class="startAction">
<result>index.jsp</result>
</action>

而在spring的配置中必须有对应的bean配置:
<bean id="startAction" class="com.yourname.action.StartAction"/>

Step 3 修改struts.properties配置文件

首先,这个文件里面的所有内容,都可以写在struts.xml(当做contant元素)或者web.xml(当做context-param元素)中,但是个人还是习惯单写,毕竟是struts自己的东西,集中管理好控制。粗字的是必须的!文件内容如下:
# 指定struts所用的locale和语言编码
struts.locale=zh_CN
struts.i18n.encoding=GBK
# 配置struts所用的对象工厂,这里使用速记符号就是spring
# 同时指定了spring注入bean时候是通过属性名字注入

struts.objectFactory=spring
struts.objectFactory.spring.autoWire=name
# 设置开发者模式和当配置文件变动时重新载入的机制
struts.devMode=true
struts.configuration.xml.reload=true
# 配置struts的action扩展名,这里为action,
# 则上例中名字为start的action,必须使用start.action调用

struts.action.extension=action
# 设置文件上传的解析器、保存路径和最大尺寸
struts.multipart.parser=org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest
struts.multipart.saveDir=../temp
struts.multipart.maxSize=1004857600

上面这些内容如果还有不明白的,可以参看我前面翻译的另外一篇文章,是官方对struts.properties的解释。

其中,struts.objectFactory=spring中,spring是org.apache.struts2.spring.StrutsSpringObjectFactory的缩写。

另外struts.objectFactory.spring.autoWire=name,如果不指明,则必须在spring配置文件中的beans元素中指明其default-autowire属性为name,或者autodetect。说会来,在struts.properties中,这个属性的值可选的有:
name:按照action的属性的名字和spring配置bean的id找,相同就自动装配。此为缺省
type:按照action的属性的类型,在spring注册bean中招,相同,则自动装配。需要spring中注册一个此类型的bean
auto:spring自动侦测找到最好的方法来装配你的action
constructor:根据bean的构造参数参数进行装配

最后,如果需要使用spring自身的缓存机制,则添加:
struts.objectFactory.spring.useClassCache=true

2. Web.xml 方面


Step 1 给Spring添加监听器

在其中加入如下代码:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

这样,在Spring启动的时候,可以监听web容器,并且获取到自己所需的配置参数等。

Step 2 添加Spring的配置

在其中加入如下代码:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml
</param-value>
</context-param>

各位一看就知道了,其实是可以为多个Spring进行配置的,因为我们只需要一个,所以可以param-value中的值替换为:/WEB-INF/applicationContext.xml

3. Spring方面

Step 1 导入Jar包

这里,因为暂时只考虑与Struts2的集成,所以spring要用的jar包比较少,就两个:
spring.jar
commons-logging.jar

后面那个还被struts2前面导入过了,所以实际上,只需要spring.jar一个就够了。

Step 2 Bean配置

其实这一步,就是配置struts2中action所需的类,请参照struts2方面的step 2。不过注意,在分布式多线程的情况下,各位开发者要好好考虑每个bean的scope属性,看看到底是singleton还是prototype!

4. 整合原理

本质上讲,就是Spring的IoC注入。

首先,Struts2使用Spring到Struts2的插件,使得Spring可以为Struts2创建Action、拦截器和Result。

其次,通过对struts中action的class的修改,使得Struts2在收到请求后无需自己创建action的实例,而是由spring创建好,直接装配过去的。我们的例子中是通过名字来完成的。

最后,通过整合,action所需的依赖对象可以由spring自动注入,例如DAO等等,大大简化了开发的维护,减少了不少手写代码。

需要补充的是,我们的spring配置文件中可能会有很多bean,而struts的配置文件中可能因功能的逻辑不通会有很多在不同的package或者namespace下的action。所以如何正确的划分配置文件也是一门学问。也别忘了,既然有了配置的划分,也一样要考虑多个配置的文件的包含,特别是他们的顺序!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值