详细分析spring与struts2的整合原理

时间:2022-04-06 15:55:08

spring与struts2如何整合:

  • 1). 整合目标 ? 使 IOC 容器来管理 Struts2 的 Action!
  • 2). 如何进行整合 ?

1. 正常导入入 Struts2与spring包之后 还需要一个额外的包:

struts2-spring-plugin-2.3.3.jar

2 .在 Spring 的 IOC 容器中配置 Struts2 的 Action.即在 IOC 容器中配置 Struts2 的 Action。

这时注意一个问题:spring IOC容器中的bean默认是单例的,而如果struts2的Action是多例的,在装配Action时注意设置scope。
修改web.xml为:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:Spring/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

这样在声明Action实例时只需要指向在IOC容器中的id即可。
如上就是Spring与Struts2的整合,非常简单。现在我们来分析原理。

spring与struts2整合原理:

通过添加 struts2-spring-plugin-2.3.15.3.jar 以后, Struts2 会先从 IOC 容器中获取 Action 的实例.

首先从struts入手,了解struts的插件机制。

Struts-plugin.xml
说明:
Struts-plugin.xml文件是在tomcat服务器启动的时候加载的
该配置文件在classpath的根目录下
在每一个含有plugin字母的jar包的根目录下有一个struts-plugin.xml文件 (例如 刚刚我们导入的struts2-spring-plugin)
当tomcat启动的时候,就把所有的含有plungin的jar包的该配置文件就加载了。

研究struts2的静态注入:

1、 在struts2的配置文件struts-default中写的bean:

详细分析spring与struts2的整合原理

在tomcat启动的时候,会执行OgnlValueStackFactory的createValueStack方法

详细分析spring与struts2的整合原理

从上图可以看出,在tomcat启动的时候就决定了ValueStack的实现类.

2、 改变静态注入的方式

可以在struts.xml文件中对struts-default.xml文件中的bean进行配置和覆盖,这样就可以按照覆盖掉的执行。在struts.xml文件中,做如下的配置:

详细分析spring与struts2的整合原理

这个时候,当tomcat启动的时候,将会报错。

详细分析spring与struts2的整合原理

了解了struts2的静态注入后,我们来改变action的产生方式。

struts有一个类:ObjectFactory

详细分析spring与struts2的整合原理

说明:
Struts2容器就是利用ObjectFactory的上面的几个方法产生的action,result,interceptor.

struts2的配置文件struts-default.xml中:

详细分析spring与struts2的整合原理

在struts2容器中,对象工厂是由StrutsObjectFactory来产生的。

详细分析spring与struts2的整合原理

从上图中可以看出,StrutsObjectFactory继承了ObjectFacotry,但是没有覆盖buildAction方法,说明struts2的action的产生还是调用了ObjectFactory中的buildAction方法。

写一个对象工厂:

public class Itheima09ObjectFactory extends ObjectFactory{
@Override
public Object buildAction(String actionName, String namespace, ActionConfig config,
Map<String, Object> extraContext) throws Exception {
// TODO Auto-generated method stub
System.out.println("create Action");
return "66";
}
}

该类重写了buildAction方法。
配置文件:

详细分析spring与struts2的整合原理

说明:
当在浏览器提交一个请求,请求某一个action的时候,在创建action的时候,就会进入到Itheima09ObjectFactory中执行buildAction方法。

现在我们回过头看spring与struts的整合使用的jar包:

详细分析spring与struts2的整合原理

Struts-plugin.xml:

详细分析spring与struts2的整合原理

说明:对象工厂为spring:StrutsSpringObjectFactory。

总结

当tomcat启动的时候,加载了很多个struts-plugin.xml文件,在该文件中可以配置
Bean
Package
Interceptor
Action
Result
这些元素就被加载到了struts2容器中。
如果不想要某一些内容,只要把这些内容所在的struts-plugin.xml的jar包去掉就可以了。
插件的主要体现形式是jar包。