關於Struts2配置文件名修改的問題

突發奇想的想知道Struts2的配置文件名是否可以修改,自己最早使用Struts2的時候,只是單純的將配置文件命名爲“struts.xml”,這是Strut2默認的配置文件名,我一直也沒有去修改它的命名。

先來回顧一下Spring,SpringMVC,Hibernate,MyBatis的配置文件名是在哪裏進行配置的:

1.記得最初我學習Spring的時候,經常將配置文件命名爲 applicationContext.xml ,這個名字挺符合Spring的作用的,即使現在,如果沒有特殊的要求,我一般也會將它如此命名。Spring是在web.xml中配置一個ContextLoaderListener來啓動的,同樣Spring也是在web.xml中配置context-param這個全局參數來進行配置文件命名的,它指定了一個contextConfigLocation的參數,並通過它的值來指定Spring配置文件的命名及位置。

<!--指定spring文件的位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext*.xml</param-value>
    </context-param>

2.SpringMVC作爲前端控制器,訪問的url都會被它攔截處理,我們使用是在web.xml中配置了DispatcherServlet,在配置這個傢伙的同時通過標籤給Servlet搞一個同樣名爲contextConfigLocation初始化參數,這是參數的value指明瞭SpringMVC配置文件的命名及位置。

  <!--配置前端控制器  -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--指定springmvc配置文件位置  -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

當然可以不用配這個初始化的參數,那麼就是使用默認名了,SpringMVC默認配置文件名爲"servlet-name"-servlet.xml(servlet-name就是配置DispatcherServlet時取的名字),並放在WEB-INF下。

3.Hibernate作爲一款持久層框架,自然需要與數據庫打交道,使用Hibernate訪問數據庫是需要拿到Session的,在純Java項目中,我們需要先通過Configuration對象得到SessionFactory,再通過工廠去得到Session,Hibernate配置文件的配置正是在Configuration對象初始化的時候指定:

  @Before
    public void initSession() {
        Configuration cfg=new Configuration().configure("hibernate-config.xml");
        SessionFactory sf = cfg.buildSessionFactory();
        session=sf.openSession();
        tx=session.beginTransaction();
    }

當然,調用 configure() 方法時可以不指定配置文件名,默認配置文件名爲hibernate.cfg.xml

但Hibernate與Spring進行整合之後,Hibernate的SessionFactory就由Spring去管理了,所以會在Spring配置文件配置SessionFactory時指定:

    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
      <property name="dataSource" ref="dataSource"></property>
      <property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
    </bean>

通過 configLocations 來指定配置文件名

4.MyBatis也作爲持久層框架,它在沒有使用Spring的時候,也是需要先通過SqlSessionFactoryBuilder的build方法指定配置文件,build方法需要通過InputStream來得到配置文件的輸入流,我們正是在獲得這個InputStream的時候指明瞭配置文件:

複製代碼

/**
     * 構建SQLSessionFactory
     */
    public static SqlSessionFactory initSqlSessionFactory() {
        //MyBatis配置文件
        String resource="mybatis/mybatis-config.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
        return sqlSessionFactory;
    }

通過 SqlSessionFactory 得到SqlSession去操作數據庫就好了。MyBatis和Spring整合之後,SqlSessionFactory也是由Spring管理:

      <!--1. 配置sqlSessionFactory -->
       <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"></property>
         <property name="dataSource" ref="dataSource"></property>
         <!-- 指定mybatis,mapper文件的位置 -->
         <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
       </bean>

同樣是通過 configLocation 來指明配置文件。

OK,既然Spring,SpringMVC,Hibernate,MyBatis的配置文件名都可以修改,那麼Struts2的配置文件是不是也可以修改呢?

類似於SpringMVC,我們點開Struts2的前端控制器StrutsPrepareAndExecuteFilter(在Struts2的某些早期的版本使用的是DispatcherFilter,我這裏使用的是2.3版本),這是一個Filter,所以它一定是實現Filter接口,果然:在這裏插入圖片描述

1.熟悉的三個Filter方法。我們先從init方法開始看吧:
在這裏插入圖片描述
2.繼續進入InitOperations類的initDispatcher方法:
在這裏插入圖片描述
3.先來看看createDispatcher( HostConfig filterConfig ),這個方法需要HostConfig的參數,而之前已經將FilterConfig包成一個FilterHostConfig,這個FilterHostConfig實現了HostConfig接口
在這裏插入圖片描述

這一處說明所有配置的Filter初始化參數都被放入一個Map中,然後將這個Map作爲參數給Dispatcher的構造器,在這個構造器中賦值給Diapather的名爲initParams的Map成員變量。
在這裏插入圖片描述

先記住這個名爲initParams的Map,接下來會用到。

4.然後回到InitOperations類的initDispatcher方法,再來看Dispatcher類的init方法:
在這裏插入圖片描述

5.進入Dispatcher的init_TraditionalXmlConfigurations()方法:
在這裏插入圖片描述

到此爲止,我們知道了需要在Filter中配置一個名爲config的初始化參數,如果有多個配置文件使用逗號分隔:

 <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>struts-default.xml,struts-plugin.xml,struts.xml</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

找這個東西我也是花了一定的時間才理清楚,在之前我使用SpringMVC配合hibernate-validator進行驗證出現解析properties文件內容亂碼的問題,也是通過源碼才搞清楚,遇到一些很刁鑽的問題閱讀源碼就顯得就重要了,自己在閱讀源碼方面的能力也需要加強。

文章轉載自:http://www.cnblogs.com/lz2017/p/8601783.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章