Spring整合struts2
public class StrutsPerpareAndExecuterFilter{
public void init(FilterConfig filterConfig){
//获取了初始化的各种配置文件
default.properties
struts-default.xml
struts-plugin.xml
struts.xml
Despatercher dispatcher = init.initDispatcher(config);
//静态输入,初始化配置文件中的Bean
init.initStaticContentLoader(config,dispatcher);
}
}
在tomcat启动的时候,干了两件事情,
* 加载了各种配置文件
* 静态注入一些bean
请求URL:personAction_savePerson.action
步骤,
先找struts的配置文件,会找根据struts2的相关配置文件查找action的创建方式。
会去常量strts.objectFactory查找到底是由哪个类创建了action
会去struts-default.xml,struts-plugin.xml,struts.xml文件去找strts.objectFactory
哪个配置文件加载在最后,哪个决定。
最后在struts和spring整合的包中找到了struts-plugin.xml文件
<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.objectFactory" value="spring" />
由上述的内容可以知道,action是由StrutsSpringObjectFactory创建的。而该类继承了SpringObjectFactory,实际上是由该类创建
public Object buildBean(String beanName,Map<String,Object>extra...)
{
Object o = null;
try{
o = appContext.getBean(beanName);
}catch (NoSuchBeanDefinitionException e){
Class beanClazz = getClassInstance(beanName);
o = buildBean(beanClazz,extraContext);
}
if(injectInternal){
injectInernalBeans(o);
}
return o;
}
该源代码中beanName就是struts2配置文件中的action元素的class属性的值,这就意味着class属性的值要和spring容重的action所在的bean指定的id值要一致。
没有事务环境
当应用程序用完Person person = (Person) this.getHibernateTemplate().load(Person.class,1L);
session直接就关闭了,那么所在的dao方法session不存在了.
所以说Dao层是没有事务的,如果调用的事service层的方法,such as
public void testService(){
PersonService personService = (personService)context.getBean("personService");
personService.getPersonById(1l);
}
如果是这样写的话,那么直到service层的personService调用的getPersonById(1l)完毕后,session才会关闭。
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
这个过滤器的作用就是将session提前开启放缓关闭,这样解决了懒加载的异常。而且这个过滤器必须放置在StrutsPerpareAndExecuteFilter前面。
缺点:因为session的关闭被延后了,而hibernate的一级缓存在session中,所以会导致大量的缓存中的数据被长时间的停留在内存中。
创建ActionContext做的工作
* 在actionContext中存在一个Map<String, Object>
* ValueStack stack = dispatcher.getContainer().getInstance(ValueStackFactory.class).createValueStack();
通过静态注入创建ValueStack的实现类:OgnlValueStack,也就意味着在创建actionContext的时候,值栈就被创建了
* ValueStack中的map栈和ActionContext中的Map是一样的
* 通过ActionContext.setContext(ctx);就把actionContext放入到ThreadLocal中,这样数据就安全了
ActionProxy的创建
* ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);
* 在createActionProxy的时候
ActionInvocation inv = new DefaultActionInvocation(extraContext, true);
创建了DefaultActionInvocation
在创建ActionProxy的时候,就已经执行invocation的init方法
invocation的init方法做的事情:
action的创建和所有的拦截器的创建
执行invocation中的inovke方法
* 执行了所有的拦截器
* 执行了当前请求的action
* 执行了结果
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。