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中,因此會致使大量的緩存中的數據被長時間的停留在內存中。spring

建立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
             *  執行告終果apache

相關文章
相關標籤/搜索