在webapps目录下,部署了一个web 工程 :ttest
ttest的目录结构如下图:
ttest
   WEB-INF
      classes
      lib
      struts-config.xml
      struts-html.tld
      struts-bean.tld
      struts-html.tld
      struts-logic.tld
      web.xml
   xhtmlmp
      login.jsp
      *****.jsp
   login.jsp
   *****.jsp
 
问题描述:
工程采用jsp+struts 来实现。 在ttest 的目录下有一部分jsp文件,同时在其子目录xhtmlmp目录下也有一部分jsp文件。
把ttest部署到tomcat 的webapps目录下以后,
如果以ip地址的形式 来访问这两部分jsp文件,请求的action ,可以进行处理
例如:
     192.168.22.228:8080/ttest/login.jsp 请求loginAction ,可以请求action 没问题。
     192.168.22.228:8080/ttest/xhtmlmp/login.jsp 请求mobileLoginAction ,也没问题。现在的问题是 通过配置虚拟站点,来进行访问这两部分jsp 就有问题了。
ttest下的jsp文件可以 请求对应的action,但是子目录里的xhtmlmp中的jsp 文件 就无法请求到 action,页面会报出404错误!
例如:
    http://mmvd.ttest.com/ttest/login.jsp   这个地址可以请求到action
    http://mmvd.ttest.com/xhtmlmp/login.jsp 这个地址就 无法请求action !我在tomcat的 conf目录中的server.xml 中 配置了 一个Host 元素:
   <Host name="mmvd.ttest.com" appBase="/usr/local/tomcat/webapps/ttest/"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">
        <Context path="" docBase="/usr/local/tomcat/webapps/ttest" debug="0" reloadable="true" />
        <Context path="/wml" docBase="/usr/local/tomcat/webapps/wml">
        </Context>
       <Context path="/xhtmlmp" docBase="/usr/local/tomcat/webapps/ttest/xhtmlmp"/>
        <Context path="/mmsFile" docBase="/usr/local/mmvd/mmsFile">
        </Context>
    </Host>  
另外 在ttest工程下的WEB-INF目录里,strtuts-config.xml的部分信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"><struts-config>
  <form-beans>
    <form-bean name="loginActionForm" type="com.ttest.pc.LoginActionForm" />
    <form-bean name="mobileLoginActionForm" type="com.ttest.mobile.MobileLoginActionForm" />
  <action-mappings>
  <!-- ****************************** ttest *********************************** -->
    <action input="/login.jsp" name="loginActionForm" path="/loginAction" scope="session" type="com.ttest.pc.LoginAction" validate="false">
      <forward name="retrieve" path="/retrieve.jsp" redirect="false" />
      <forward name="login" path="/login.jsp" redirect="true" />
    </action>
    <action name="mobileLoginActionForm" path="/xhtmlmp/mobileLoginAction" scope="request" type="com.ttest.mobile.MobileLoginAction" validate="false">
      <forward name="retrieve" path="/xhtmlmp/retrieve.jsp" redirect="false" />
      <forward name="login" path="/xhtmlmp/login.jsp" redirect="true" />
    </action>
</action-mappings>
  <message-resources parameter="ApplicationResources" />
</struts-config>

解决方案 »

  1.   

    个人在私下做了几个尝试,如果想让虚拟站点下,子目录里jsp文件 能够请求到对应的action,
    页面输入的url必须包含ttest 才可以。
    例如:
    我修改了tomcat下conf目录里的 server.xml 文件:
        <Host name="mmvd.ttest.com" appBase="/usr/local/tomcat/webapps/" 
          unpackWARs="true" autoDeploy="true" 
          xmlValidation="false" xmlNamespaceAware="false"> 
            <Context path="" docBase="/usr/local/tomcat/webapps/ttest" debug="0" reloadable="true" /> 
            <Context path="/wml" docBase="/usr/local/tomcat/webapps/wml"> 
            </Context> 
          <Context path="/xhtmlmp" docBase="/usr/local/tomcat/webapps/ttest/xhtmlmp"/> 
            <Context path="/mmsFile" docBase="/usr/local/mmvd/mmsFile"> 
            </Context> 
        </Host>  
    我去掉了webapps/ 后面的ttest, 这时如果在访问xhtmlmp的jsp文件,请求action是可以识别的  
    例如: mmvd.ttest.com/ttest/xhtmlmp/login.jsp   可以请求到 mobileLoginAction
    觉得问题的原因是 如果以虚拟站点的形式来实现页面间的action请求,页面地址栏的url必须包含项目本身名称。但是我目前的业务要求,必须按照这个路径来访问实现:
    http://mmvd.ttest.com/xhtmlmp/login.jsp 
    也就是说在server.xml里,host的配置必须是这个样子:
    <Host name="mmvd.ttest.com" appBase="/usr/local/tomcat/webapps/ttest/" 
    mmvd.ttest.com 指向的路径是tomcat中webapps目录里的ttest 
    而不是webapps目录!哪位高手能给解决下。。不胜感激。。
      

  2.   

    兄弟呀 你的那个目录上面没有web的基础机构你说他可以访问不?
      

  3.   

    你说的什么意思,不明白。。我就是想 说明现在的问题是 这四个 链接 请求action的状况:
    Ip形式访问
        192.168.22.228:8080/ttest/login.jsp 请求loginAction ,可以请求action 没问题。 
        192.168.22.228:8080/ttest/xhtmlmp/login.jsp 请求mobileLoginAction ,也没问题。
    通过配置host,以虚拟站点形式访问:
         http://mmvd.ttest.com/ttest/login.jsp  这个地址可以请求到action 
        http://mmvd.ttest.com/xhtmlmp/login.jsp 这个地址就 无法请求action !host的配置就是这个样子,而且要求不能改变:
    <Host name="mmvd.ttest.com" appBase="/usr/local/tomcat/webapps/ttest/" 
          unpackWARs="true" autoDeploy="true" 
          xmlValidation="false" xmlNamespaceAware="false"> 
            <Context path="" docBase="/usr/local/tomcat/webapps/ttest" debug="0" reloadable="true" /> 
            <Context path="/wml" docBase="/usr/local/tomcat/webapps/wml"> 
            </Context> 
          <Context path="/xhtmlmp" docBase="/usr/local/tomcat/webapps/ttest/xhtmlmp"/> 
            <Context path="/mmsFile" docBase="/usr/local/mmvd/mmsFile"> 
            </Context> 
        </Host> 
      

  4.   

    在两个  login.jsp 测试一下
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
    + request.getServerName() + ":" + request.getServerPort()
    + path + "/";
    %>
    在页面里输出 <% =basePath %>配置虚拟路径后 请求时显示的有什么差别
      

  5.   

    <Context path="" docBase="/usr/local/tomcat/webapps/ttest" debug="0" reloadable="true" />
            <Context path="/wml" docBase="/usr/local/tomcat/webapps/wml">
            </Context>
          <Context path="/xhtmlmp" docBase="/usr/local/tomcat/webapps/ttest/xhtmlmp"/>
            <Context path="/mmsFile" docBase="/usr/local/mmvd/mmsFile">
            </Context> 
    有问题!
      

  6.   

    6楼的,我确定我的配置没问题。 你要觉得有问题,就说出原因。不好意思 我有个路径 打错了 ,应该是这个样子:
    Ip形式访问 
        192.168.22.228:8080/ttest/login.jsp 请求loginAction ,可以请求action 没问题。 
        192.168.22.228:8080/ttest/xhtmlmp/login.jsp 请求mobileLoginAction ,也没问题。 
    通过配置host,以虚拟站点形式访问: 
        http://mmvd.ttest.com/login.jsp  这个地址可以请求到loginAction (这个url 没有ttest
        http://mmvd.ttest.com/xhtmlmp/login.jsp 这个地址就 无法请求mobileLoginAction ! 
      

  7.   

    http://mmvd.ttest.com/xhtmlmp/login.jsp  这登录页面在请求 mobileLoginAction 时, 
    会报一个404的错误: 
    The requested resource (/xhtmlmp/mobileLoginAction.do) is not available. 事实上,我请求的路径,解析之后是对的。 可是因为走了虚拟站点这一层,就无法请求到action了。 
      

  8.   

    <% 
    String path = request.getContextPath(); 
    String basePath = request.getScheme() + "://" 
    + request.getServerName() + ":" + request.getServerPort() 
    + path + "/"; 
    %> 
    在页面里输出 <% =basePath %> 使用这样的请求路径试试   <%=basePath%>mobileLoginAction.do
      

  9.   

    你的struts-config.xml里面,就没配置mobileLoginAction这个action,我只看到mobileLoginActionForm这个action,我想你可能是想访问mobileLoginAction这个action吧,如果是这样的话,就将struts-config.xml里面,的
    <action name="mobileLoginActionForm" path="/xhtmlmp/mobileLoginAction" scope="request" type="com.ttest.mobile.MobileLoginAction" validate="false"> 改成:
    <action name="mobileLoginAction" path="/xhtmlmp/mobileLoginAction" scope="request" type="com.ttest.mobile.MobileLoginAction" validate="false">