虽然整合方式有好几种,但是整合的最终思路是一样的
1>spring负责action类的创建和管理
2>将spring容器(WebApplicationContext)事先加载到ServletContext中
getServletContext().setAttribute(attrName, wac);
3>struts需要action的时候,从ServletContext中get到WebApplicationContext,然后再getBean,取到action对象
sc.getAttribute(attrName).getBean(beanName, Action.class)
所以ServletContext充当了struts和spring的桥梁或者纽带
WebApplicationContext加载方式
1>以servlet的方式进行加载
web.xml
SpringContextServlet org.springframework.web.context.ContextLoaderServlet 0
ContextLoaderServlet.java
核心代码就一句
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
2>以listener的方式进行加载
web.xml
org.springframework.web.context.ContextLoaderListener
ContextLoaderListener.java
核心代码也是一句
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
3>以struts plugin的方式加载
struts的plugin是以module为单位进行配置的,所以WebApplicationContext可以分module进行设置,如果当前module没有设置的话,那么使用default module配置的WebApplicationContext
struts-config.xml
ContextLoaderPlugIn.java
public static final String SERVLET_CONTEXT_PREFIX = ContextLoaderPlugIn.class.getName() + ".CONTEXT."; public final String getModulePrefix() { return this.moduleConfig.getPrefix(); } public String getServletContextAttributeName() { return SERVLET_CONTEXT_PREFIX + getModulePrefix(); } String attrName = getServletContextAttributeName(); getServletContext().setAttribute(attrName, wac);