zoukankan      html  css  js  c++  java
  • 关于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,在配置这个家伙的同时通过<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文件内容乱码的问题,也是通过源码才搞清楚,遇到一些很刁钻的问题阅读源码就显得就重要了,自己在阅读源码方面的能力也需要加强。

  • 相关阅读:
    mssql sqlserver 验证整型函数分享
    SQL存储过程解密
    MSSQL sqlserver系统函数教程分享
    union的使用
    select子句
    软件测试用例设计方法
    软件测试模型与测试过程
    selenium定位元素方法
    kali渗透综合靶机(六)--FristiLeaks靶机
    kali渗透综合靶机(五)--zico2靶机
  • 原文地址:https://www.cnblogs.com/lz2017/p/8601783.html
Copyright © 2011-2022 走看看