Struts2提供了灵活的插件机制来与其他框架进行整合,开发者通过提供Struts2扩展点的特殊实现并注册,来具体实现这种整合。
每一个Struts2的插件就是一个包含了扩展类和struts-plugin.xml配置文件的jar包,当启动一个Struts2的应用时,配置文件的加载顺序是struts-default.xml、struts-plugin.xml、struts.xml。多个插件包之间不应该有依赖关系,因为Struts2不保证各个插件包的加载顺序。
(1)Struts2提供的重要扩展点如下:
com.opensymphony.xwork2.ObjectFactory:它主要用于创建Struts2中的Action、Result、Interceptor等实例。通过struts.objectFactory常量来注册。
com.opensymphony.xwork2.ActionProxyFactory:它主要用于创建ActionProxy实例。通过struts.actionProxyFactory常量来注册。
com.opensymphony.xwork2.util.ObjectTypeDeterminer:它主要用于检测Map中的key和value,以及集合中元素的类型。通过struts.objectTypeDeterminer常量来注册。
org.apache.Struts2.dispatcher.mapper.ActionMapper:它用来完成请求映射,包括用户请求映射到Action,Action处理结果映射到指定视图资源。通过struts.mapper.class常量来注册。
org.apache.Struts2.dispatcher.multipart.MultiPartRequest:它主要用来处理enctype="multipart/form-data"的请求,如文件上传操作。通过struts.multipart.parser常量来注册。
org.apache.struts2.views.freemarker.FreemarkerManager:它主要用来处理FreeMarker模板。通过struts.freemarker.manager.class常量来注册。
(2)通过常量具体如何来注册扩展点呢,可以通过在struts.xml文件、或者struts-plugin.xml文件中添加如下配置来完成注册:
<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.objectFactory" value="spring" />
下面具体介绍一下struts2-spring-plugin.jar插件包来实现Struts2和Spring整合的情况。
在struts2-spring-plugin.jar包中,其实只有一个扩展类org.apache.struts2.spring.StrutsSpringObjectFactory,它继承了com.opensymphony.xwork2.spring.SpringObjectFactory类,在StrutsSpringObjectFactory类的构造函数中,它从servletContext中取得spring的ApplicationContext实例(即Spring的容器实例),并调用父类的setApplicationContext方法注入该ApplicationContext实例。
父类SpringObjectFactory类重写了com.opensymphony.xwork2.ObjectFactory扩展点的buildBean方法,在buildBean方法中,通过Spring的ApplicationContext对象来取得Spring容器管理的bean。
至此,也就完成了Struts2和Spring整合最重要的部分,即让Struts2中Action、Result、Intercetpor等对象都来自与Spring容器中。