问题是这样的:
小弟配置了struts模块
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>    <init-param>
      <param-name>config/tzz</param-name>
      <param-value>/WEB-INF/struts-config-tzz.xml</param-value>
    </init-param>
开始的调试环境是tomcat5.0.28,jdk1.5,没有做虚拟域名的配置,调试地址如:http://localhost:8080/aa/tzz/admin.do,一切正常,aa为一个web应用的名字
<content path="/aa" />(简写了)
完成后,配置了虚拟域名
      <Host name="test.aaa.com" appBase="/usr/workspace/aaa"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="." path="" reloadable="true"/>
      </Host>结果发现,没有配置模块的那些Action都能正常使用,配置了模块tzz的都不能使用了
即http://test.aaa.com/aaa.do 正常使用
  http://test.aaa.com/tzz/bbb.do 找不到了几经周折最后发现,我把虚拟主机的路径加上,如下
<Context docBase="." path="/t" reloadable="true"/> 就能正常工作了,一切OK即http://test.aaa.com/t/aaa.do  http://test.aaa.com/t/tzz/bbb.do 都没有问题在我同事那里配置,他是tomcat5.5.15,<Context docBase="." path="" reloadable="true"/>,能正常使用,我重新下载了tomcat5.5.16和5.5.17在我这里测试,出现的问难都同上,模块那里只有加上个path='/aa'才能使用,不加就不能使用不知道大家有什么好的解决办法

解决方案 »

  1.   

    <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>config/xxx</param-name>
          <param-value>/WEB-INF/xxx.xml</param-value>
        </init-param>
    这样写叫多模块,而
       <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml,/WEB-INF/xxx.xml</param-value>
        </init-param>
    就不是多模块了,如果有人建议你改成这样,千万别信,呵呵。为什么这么说,因为多模块的根本作用是让servlet容器(比如TOMCAT)给你的多个模块每个模块一个ServletContext,也就是说相当于你的程序是多个同时在运行。而第二种写法其实还是只有一个config。说的明白点,你有几个Struts config,就相当于有几个模块同时运行,而这样,方面不同的用户快速访问不同的模块。在来说为什么使用第一种写法后,你会出现各种个样的问题,比如转发出错。现在解决大家的疑问,首先/xxx跟xxx是一样的效果。都表示当前目录。
    有的时候,你会发现这样写链接使正常的,而有的时候又不是正常的,比如:
    有的时候这样要写<html:link action="xxx.do....,
    而有的时候要这样<html:link action="yyy/xxx.do....
    这是因为你的请求所在的路径发生了变法。比如你现点击<html:link action="yyy/xxx.do....
    ,进入了一个页面,然后你在点<html:link action="yyy/xxx.do....就会报错,因为此时你的页面上下文不一样了。此时你已经进入了yyy,所以你只需要点<html:link action="xxx.do....,就可以了。如果上述仍不能解决你的问题,你可能还要该你的struts 配置文件,在你的forword里加上contextRelative="true",如下:
     <forward
            name="updateDept"
            path="/src_department/updateDept.jsp"
            contextRelative="true" />设为true表示在路径属性中指定的资源,在路径以"/"字符起始情况下,应该被解释为与web应用程序相关。多试试吧,我也是试了一个通宵才搞定的。
      

  2.   

    纠正:
    -------------------------------
    因为多模块的根本作用是让servlet容器(比如TOMCAT)给你的多个模块每个模块一个ServletContext,也就是说相当于你的程序是多个同时在运行。而第二种写法其实还是只有一个config,也就是说只有servlet容器只给了一个ServletContext给你的应用程序。说的明白点,你有几个Struts config,就相当于有几个模块同时运行,而这样,方面不同的用户快速访问不同的模块。
    ----------------------------------
    兄弟,我说错了,杀了我吧。
    纠正如下,ServletContext是只有一个的,但会创建多个ApplicationConfig对象。每个ApplicationConfig负责处理对应的模块,而且默认的配置文件对应的ApplicationConfig对象是最先被创建的,并不是我之前说的所有config对象同时被创建,
    对不起啊,本人刚接触JAVA,接触J2EE刚1个多月,说错了,请大家与原谅。
    现在把Sturt初始化过程说一下,是书上的原话,大家可以参考《jakarta struts编程》,Struts创始人推荐的书。
    ----------------------------------------
    Sturts初始化过程取决于在web.xml文件中配置的初始化参数,servlet容器在首次启动或servlet的第一次请求到达时加载Struts ActionServlet。在这两种情况下,要保证init()方法被调用,并且必须在servlet处理任何请求之前完成。当init()被调用时,Struts框架包执行所有必要的初始化工作。,其步骤如下:1.初始化框架包的内部消息绑定。这些消息用来把信息,警告,和出错消息输出到日志文件。org.apache.struts.action.ActionResources绑定用来获得内部消息。 
    2.从web.xml文件加载控制ActionServlet类不同行为的初始化参数。这些参数包括config、debug、detail、convertNull。 
    3.从web.xml文件加载、初始化servlet名称和servlet映射信息。这些值将在提交HTML表单时,用于框架包输出正确的URL地址。在初始化过程中,框架包所使用的DTD会被注册。在下一步中DTD将用来验证配置文件。 
    4.加载、初始化默认应用程序的Struts配置数据,这些数据是配置初始化参数指定的。默认的Struts配置文件被解析,一个ApplicationConfig对象被创建并存储在ServletContext中。默认应用程序的ApplicationConfig对象和一个org.apche.struts.action.APPLICATION的值被存储在ServletContext中。 
    5.根据每个消息资源元素中指定的键属性,每个在默认应用程序的Struts配置文件中指定的消息源都将被加载、初始化并存储在ServletContext的适当位置。如果没有键被指定,消息源将存储在键值org.apche.struts.action.MESSAGE中。仅有一个消息源能当作默认值存储因为键值必须是唯一的。 
    6.在Struts配置文件中声明的每个数据源被加载和初始化。如果没有指定datasource元素,这一步将直接跳过。 
    7.加载并初始化在Struts配置文件中指定的每个插件。每个指定的插件都将调用init()方法。 
    8.一旦默认的应用程序正确的初始化,servlet init()方法将确定是否有应用程序模块被指定,如果有则对每一个模块重复第4歩到第7歩的步骤。
      

  3.   

    如果你使用单个Struts配置文件,将只会有单个应用程序,这就是默认的应用程序。为了使默认的应用程序和应用程序模块的处理请求简单,一致,默认的应用程序被视为另一个应用程序模块。所以,任何不包含应用程序后缀的请求都被默认应用程序传递和处理。------------------------------------------------------------------------------
    我正在深入学习Struts,不是学怎么用,而是学习它的内部机制,有共同兴趣的朋友可访问我的博客:http://www.blog.163.com/xiaoqulai/
    大家一起探讨。我每天都会更新,希望大家给出意见。
      

  4.   

    http://community.csdn.net/Expert/TopicView3.asp?id=4764017
      

  5.   

    我来顶xiaoqulai(肖曲来) ,仰慕~~~高手
      

  6.   

    tomcat5.0和5.5差别很大,不是可以轻易移植的同样一个在conf/Catalina/localhost/xxx.xml里配置DataSource,一个要写成param name & value,一个得写成attribute的形式。