• struts 使用多个配置文件 strutsconfig.xml


    struts 使用多个配置文件 struts-config.xml

      或许很多开发人员都面临着这样的困惑,那就是struct-config.xml文件中有很多的配置,什么action,formbean..... 我这里说的100个action那是很小的项目了,呵呵,看得眼花缭乱,不利于模块化的开发和维护;解决的方法就是把struct-config.xml分离,也就是把里面的配置分成几个文件来写,至于怎么分那 就看你自己的原则和项目的需要了,这里不过多讨论这样的问题;分离的方法也很简单 就是在你的项目里面的web.xml文件中加多一个init-param,具体写法如下(仅保留和struts相关配置,其他元素省略):

           <servlet>
            <servlet-name>action</servlet-name>
            <servlet-class>
                org.apache.struts.action.ActionServlet
            </servlet-class>
            <init-param>
                <param-name>config</param-name>
                <param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config_test.xml</param-value>
            </init-param>
            <!--
                <init-param>
                <param-name>chainConfig</param-name>
                <param-value>/WEB-INF/chain-config.xml</param-value>
                </init-param>
            -->
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>action</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>

      熟悉struct1.x版本的哥们一看就明白了,其实就是在/WEB-INF/struts-config.xml后面加多一个配置文件的路径,文件路径之间用逗号分隔就ok了,至于/WEB-INF/struts-config_test.xml的写法 和truts-config.xml是完全一样的,直接把truts-config.xml的文件头copy过来,加上自己的配置就可以了!

       

      这种方法可以很好地解决修改冲突的问题,不同的开发人员可以在不同的配置文件中设置自己的Action、ActionForm等等(当然不是说每个开发人员都需要自己的配置文件,可以按照系统的功能模块进行划分)。但是,这里还是存在一个潜在的问题,就是可能不同的配置文件之间会产生冲突,因为在 ActionServlet初始化的时候这几个文件最终还是需要合并到一起的。比如,在struts-config.xml中配置了一个名为 success的<forward>,而在struts-config-registration.xml中也配置了一个同样的< forward>,那么执行起来就会产生冲突。

      为了彻底解决这种冲突,Struts 1.1中引进了模块(Module)的概念。一个模块就是一个独立的子系统,你可以在其中进行任意所需的配置,同时又不必担心和其它的配置文件产生冲突。因为前面我们讲过,ActionServlet是将不同的模块信息保存在不同的ModuleConfig对象中的。要使用模块的功能,需要进行以下的准备工作:

      1、为每个模块准备一个配置文件

      2、配置web.xml文件,通知控制器

      决定采用多个模块以后,你需要将这些信息告诉控制器,这需要在web.xml文件进行配置。下面是一个典型的多模块配置:

    <init-param>
    <param-name>config</param-name>
    <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
    <param-name>config/customer</param-name>
    <param-value>/WEB-INF/struts-config-customer.xml</param-value>
    </init-param>
    <init-param>
    <param-name>config/order</param-name>
    <param-value>/WEB-INF/struts-config-order.xml</param-value>
    </init-param>

      要配置多个模块,你需要在原有的一个<init-param>(在Struts 1.1中将其对应的模块称为缺省模块)的基础之上,增加模块对应的<init-param>。其中<param-name>表示为config/XXX的形式,其中XXX为对应的模块名,<param-value>中还是指定模块对应的配置文件。上面这个例子说明该应用有三个模块,分别是缺省模块、customer和order,它们分别对应不同的配置文件。

      3、准备各个模块所需的ActionForm、Action和JSP等资源

      但是要注意的是,模块的出现也同时带来了一个问题,即如何在不同模块间进行转发?有两种方法可以实现模块间的转发,一种就是在< forward>(全局或者本地)中定义,另外一种就是利用org.apache.struts.actions.SwitchAction。

      下面就是一个全局的例子:

        ... 
    <struts-config>
    ...
    <global-forwards>
    <forward name="toModuleB"
    contextRelative="true"
    path="/moduleB/index.do"
    redirect="true"/>
    ...
    </global-forwards>
    ...
    </struts-config>

      可以看出,只需要在原有的path属性前加上模块名,同时将contextRelative属性置为true即可。此外,你也可以在<action>中定义一个类似的本地<forward>。

      <action-mappings>
    <!-- Action mapping for profile form -->
    <action path="/login"
    type="com.ncu.test.LoginAction"
    name="loginForm"
    scope="request"
    input="tile.userLogin"
    validate="true">
    <forward name="success" contextRelative="true" path="/moduleA/login.do"/>
    </action>
    </action-mappings>

      如果你已经处在其他模块,需要转回到缺省模块,那应该类似下面这样定义,即模块名为空。

      <forward name="success" contextRelative="true" path="/login.do"/>

      此外,你也可以使用org.apache.struts.actions.SwitchAction,例如:

        ...
    <action-mappings>
    <action path="/toModule"
    type="org.apache.struts.actions.SwitchAction"/>
    ...
    </action-mappings>
    ...
  • 相关阅读:
    Hibernate优缺点
    Struts优缺点
    Problem M
    Problem K
    Problem K
    Problem Q
    Problem Q
    Problem F
    Problem F
    哈夫曼树
  • 原文地址:https://www.cnblogs.com/pricks/p/1495919.html
Copyright © 2020-2023  润新知