struts再一次包装了spring的webapplicationcontext(webapplication本源都是从servletcontext获取)
servletcontext这里有配置文件的参数等信息,还有bean之间的关联关系,并且把这种关联关系封装成map
核心结合jar包
struts2-spring-plugin-2.1.6.jar
struts-plugin.xml:
<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<package name="spring-default">
<interceptors>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
</interceptors>
</package>
这个拦截器包装了action的context和webapplicationcontext
(一)
struts中注入webaoolicationcontext
StrutsSpringObjectFactory 实现了implements ApplicationContextAware
@Inject静态注入
从servletcontext获取webapplicationcontext
@Inject
public StrutsSpringObjectFactory(
@Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE,required=false) String autoWire,
@Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE_ALWAYS_RESPECT,required=false) String alwaysAutoWire,
@Inject(value=StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_USE_CLASS_CACHE,required=false) String useClassCacheStr,
@Inject ServletContext servletContext) {
super();
boolean useClassCache = "true".equals(useClassCacheStr);
LOG.info("Initializing Struts-Spring integration...");
ApplicationContext appContext = (ApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
if (appContext == null) {
// uh oh! looks like the lifecycle listener wasn't installed. Let's inform the user
String message = "********** FATAL ERROR STARTING UP STRUTS-SPRING INTEGRATION **********\n" +
"Looks like the Spring listener was not configured for your web app! \n" +
"Nothing will work until WebApplicationContextUtils returns a valid ApplicationContext.\n" +
"You might need to add the following to web.xml: \n" +
" <listener>\n" +
" <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>\n" +
" </listener>";
LOG.fatal(message);
return;
}
this.setApplicationContext(appContext);
int type = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME; // default
if ("name".equals(autoWire)) {
type = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
} else if ("type".equals(autoWire)) {
type = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
} else if ("auto".equals(autoWire)) {
type = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;
} else if ("constructor".equals(autoWire)) {
type = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
}
this.setAutowireStrategy(type);
this.setUseClassCache(useClassCache);
this.setAlwaysRespectAutowireStrategy("true".equalsIgnoreCase(alwaysAutoWire));
LOG.info("... initialized Struts-Spring integration successfully");
}
(二)
拦截器中(使用webapplicationcontext):
利用spring的context封装成struts自己的context
ActionAutowiringInterceptor (StrutsSpringObjectFactory中@Inject静态注入了webapplicationcontext)
public String intercept(ActionInvocation invocation)
throws Exception
{
if (!this.initialized)
{
ApplicationContext applicationContext = (ApplicationContext)ActionContext.getContext().getApplication().get(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
if (applicationContext == null)
{
if (LOG.isWarnEnabled()) {
LOG.warn("ApplicationContext could not be found. Action classes will not be autowired.", new String[0]);
}
}
else
{
setApplicationContext(applicationContext);
this.factory = new SpringObjectFactory();
this.factory.setApplicationContext(getApplicationContext());
if (this.autowireStrategy != null) {
this.factory.setAutowireStrategy(this.autowireStrategy.intValue());
}
}
this.initialized = true;
}
if (this.factory != null)
{
Object bean = invocation.getAction();
this.factory.autoWireBean(bean);
ActionContext.getContext().put("com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor.applicationContext", this.context);
}
return invocation.invoke();
}
相关推荐
1. **使用Spring的ActionSupport**:Action类直接继承自Spring的ActionSupport,通过`super.getWebApplicationContext()`获取Spring上下文,然后通过`ApplicationContext.getBean()`获取bean。这种方式简单,但...
同时,配置Spring的ApplicationContext,使Struts和Spring能共享同一个上下文。 4. **配置Hibernate**:创建Hibernate的配置文件(hibernate.cfg.xml),定义实体类和映射文件,然后在Spring配置文件中定义...
2. **配置Spring**:引入Spring的JAR包,包括Spring的核心、AOP、上下文、ORM等模块。在applicationContext.xml中配置bean,包括DAO、Service层组件,以及数据源、事务管理器等。 3. **配置Hibernate**:添加...
在SSH中,Spring主要负责整个应用的上下文管理,包括对Struts和Hibernate的集成。 Hibernate 是一个对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表进行映射,通过对象模型处理数据。开发者...
2. **Spring作为Struts2的Action上下文**:在Struts2中,Action是处理请求的核心组件。通过Spring管理Action,我们可以利用Spring容器初始化Action,这样Action的实例化和依赖关系的建立都由Spring负责。 3. **配置...
Spring框架则提供了更广泛的上下文管理和依赖注入功能。它可以管理Bean的生命周期,允许开发者通过接口编程而不是硬编码实现类。Spring的AOP(面向切面编程)允许在不修改代码的情况下插入日志、事务管理等关注点。...
这种方式允许你集中管理所有的Spring上下文文件,对于使用如StrutsTestCase这样的测试工具尤其有用。因为StrutsTestCase的MockStrutsTestCase不会在启动时初始化监听器,所以将所有上下文文件放置在插件中是一种变通...
1. **配置Spring**:首先,你需要在`web.xml`中添加`ContextLoaderListener`监听器,用于启动Spring上下文。在`context-param`标签中指定Spring配置文件的位置,例如`applicationContext.xml`。 ```xml ...
- 在 Struts 的配置文件 `struts-config.xml` 中,我们需要配置 Struts 插件来加载 Spring 上下文。 - 将 Struts 的 Action 映射配置改为使用 Spring 管理的 Bean,通常会配置一个 `<action>` 节点,指定对应的 ...
3. **配置FilterDispatcher**:在web.xml中,配置Struts的`FilterDispatcher`,并添加Spring的`ContextLoaderListener`监听器,以便在应用启动时加载Spring上下文。 4. **处理Action与Service的交互**:在Action类...
- 使用Spring的WebApplicationContextLoaderListener监听器启动Spring上下文。 - 在struts-config.xml中配置ActionForm,指定其对应的Spring Bean ID。 - 通过Spring提供的ActionServletWrapper或...
2. **配置Spring监听器**:在`web.xml`文件中,需要配置一个Spring的上下文监听器`ContextLoaderListener`,该监听器负责初始化Spring的ApplicationContext。具体配置如下所示: ```xml <listener-class>org....
标题和描述中指出的文档《Struts+Spring+Hibernate开发实例.pdf》包含了关于这三个流行的Java开源框架结合使用的示例代码和相关知识点。Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责...
将Spring的jar包(如spring.jar)放入项目的WEB-INF/lib目录,并在web.xml中配置Spring的上下文参数,例如指定log4j配置文件的位置。 iBatis是一个持久层框架,它简化了SQL操作,允许开发者直接编写SQL语句并与Java...
例如,Struts的`ActionServlet`配置,Spring的`ContextLoaderListener`用于初始化Spring应用上下文,以及Hibernate的`ContextLoaderListener`用于初始化Hibernate SessionFactory。 在应用逻辑层面,用户登录和注册...
- **配置Spring监听器**:在`web.xml`中添加Spring的ContextLoaderListener,以便启动时加载Spring上下文。 - **使用Struts 2 Spring插件**:添加`struts2-spring-plugin-2.0.12.jar`,这样Struts 2可以自动识别和...
4. **依赖Servlet容器**:Struts中的Action类依赖于Servlet容器提供的上下文环境,这在一定程度上限制了它的可移植性。 5. **线程安全问题**:默认情况下,Struts的Action是线程不安全的,这可能引发并发访问时的...
4. **整合步骤**: 在web.xml中配置Spring的ContextLoaderListener和Struts的ActionServlet,确保在Web应用启动时加载Spring上下文,并在处理请求时使用Struts的控制器。 5. **测试应用**: 创建JSP页面作为视图,...