突發奇想的想知道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,在配置這個家伙的同時通過<init-param>標簽給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文件內容亂碼的問題,也是通過源碼才搞清楚,遇到一些很刁鑽的問題閱讀源碼就顯得就重要了,自己在閱讀源碼方面的能力也需要加強。