本文分为如下几个部分:
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。所以如何正确的划分配置文件也是一门学问。也别忘了,既然有了配置的划分,也一样要考虑多个配置的文件的包含,特别是他们的顺序!
S2SHJ 整合(1)——Struts2+Spring
最新推荐文章于 2024-09-20 15:44:47 发布