昨天发贴问了,发现对问题的原因理解错了,经过研究后重新发帖问一下。1:问题描述:我曾经所有做的小例子项目在我现在的机器的环境下都不能正常运行了,以前都是好使的。
我现在做了个简单的例子项目index.jsp-MyServlet-result.jsp来演示问题。
下面是我的项目目录结构
把这个项目WebRoot布置在TOMCAT的webapps下或者用weblogic8.1布置这个项目通过
http://localhost:8080/WebRoot或http://localhost:7001/WebRoot访问都会出以下问题,基本排除了服务器的问题。
我的首页index.jsp只有个提交,跳转到MyServlet。  <body>
    <form action="/MyServlet" method="post">
     <input type="submit" value="go"/>
    </form>
  </body>
对应的web.xml代码  <servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>servlet.MyServlet</servlet-class>
  </servlet>  <servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/MyServlet</url-pattern>
  </servlet-mapping>
点击index.jsp页面的提交,出错,如下。
HTTP Status 404 - /MyServlet--------------------------------------------------------------------------------type Status reportmessage /MyServletdescription The requested resource (/MyServlet) is not available.
--------------------------------------------------------------------------------Apache Tomcat/5.0.28
如果我把index.jsp页面里的form action="/MyServlet"改成form action="MyServlet"就OK.
同样MyServlet里面RequestDispatcher rd=request.getRequestDispatcher("/jsp/result.jsp");会报错
而RequestDispatcher rd=request.getRequestDispatcher("jsp/result.jsp");没问题。
这也是我以前所有项目都报错的原因,因为我以前都是/MyServlet,/jsp/result.jsp这样写法的,而且都没问题。
以前要是MyServlet,jsp/result.jsp这样写会报错。等于把我以前的做法彻底颠覆了。2,当我在现在的环境下这样配置TOMCAT的server.xml时候,我以前那种写法就又OK了。
<Host name="sina" debug="0" appBase="D:\WorkPlace\Test\WebRoot"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">      
       
        <Logger className="org.apache.catalina.logger.FileLogger"
                 directory="logs"  prefix="localhost_shusshi_log." suffix=".txt"
            timestamp="true"/>
             <Context path="" docBase="." debug="0" crosscontext="false" reloadable="true">
昨天老紫竹说可能是因为我的虚拟目录配置的问题。我查了些资料,但是我对
所谓的虚拟目录一无所闻。请各位大侠帮帮忙,问题的原因在哪?怎么解决?百分伺候。 

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zidane1983】截止到2008-08-01 19:32:27的历史汇总数据(不包括此帖):
    发帖的总数量:31                       发帖的总分数:784                      每贴平均分数:25                       
    回帖的总数量:489                      得分贴总数量:240                      回帖的得分率:49%                      
    结贴的总数量:31                       结贴的总分数:784                      
    无满意结贴数:11                       无满意结贴分:430                      
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:35.48 %               无满意结分率:54.85 %                  
    敬礼!

    取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=zidane1983
      

  2.   

    检查一下你的servlet,有没有package,这也是有说头的。
      

  3.   

    印象中,/servlet  本来是可以的,不过后来发现/servlet 指向的是应用程序的同级,所以,你要么用jstl形式的  <c:url .... ,要么在前面加上  /<%=request.getServletContext()%>
      

  4.   

    我没明白LZ到底想问什么问题。。思路很乱。。如果仅仅只是 web.xml配置 和 jsp里的action 的 话问题就很简单,,1.
      <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>servlet.MyServlet</servlet-class>
      </servlet>  <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
      </servlet-mapping>
    2.对应的jsp  action  : MyServlet 或../MyServlet(这两个只会有一个对)
                             要想无敌的话就用这个 <%=basePath%>MyServlet (不要问我basePath是什么,用过Eclipse就知道了)
      

  5.   


    能告诉我,为什么以前/MyServlet这么写行,现在又不行了,是什么原因么?
    还有您说的方法 <%=request.getServletContext()%>能解决,jsp跳servlet的问题,
    但是servlet跳jsp的话,怎么实现RequestDispatcher rd=request.getRequestDispatcher("/jsp/result.jsp")
    这种写法也能过去?
      

  6.   


    我就是想问为什么对应的jsp  action  : MyServlet 或../MyServlet只有一个对?
    什么原因呢? 以前我用我的台式机编码都是/MyServlet这样是对的,现在我用笔记本/MyServlet这样不对了,只能MyServlet
    这样才对。如果要想跳我演示项目的result.jsp,以前是/jsp/result.jsp可以,想在不行了只能
    用jsp.result.jsp。  是不是哪里有个路径设置?
      

  7.   


    我的welcome   <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
      

  8.   

    你的MyServlet就是跟目录
    一个意思
    当然不行
      

  9.   


    /MyServlet这样写以前行,现在不行。
    Myservlet这样写现在行。
      

  10.   

    <Host name="sina" debug="0" appBase="D:\WorkPlace\Test\WebRoot"
    <Context path="" docBase="."这里有2个路径,他们有什么作用呢?我们先看第二个,他代表最实际的路径,也就是我们真实的虚拟路径的位置。
    比如
    <Context path="" docBase="D:\WorkPlace\Test\WebRoot"
    在这个目录下,我们预计的目录如下
    D:\WorkPlace\Test\WebRoot
    D:\WorkPlace\Test\WebRoot\WEB-INF
    D:\WorkPlace\Test\WebRoot\WEB-INF\classes所以,只要这个配置正确,我们就基本可以正确了。
    为何是基本呢?那就是你的 host里面的path千万别配置错了。
    这个是干什么用的呢?
    他是设置虚拟主机的主目录,这个目录下面的每个子目录都是一个虚拟目录,我们看一下tomcat的默认配置
    webapps他代表
    X:\tomcat\webapps这个目录下面都有啥呢?
    X:\tomcat\webapps\ROOT 根据tomcat的约定,ROOT代表根目录,也就是默认的主页
    X:\tomcat\webapps\admin 这个目录自动部署为 http://localhost/admin 虚拟目录,注意不是普通的目录,因为
    X:\tomcat\webapps\admin\WEB-INF
    X:\tomcat\webapps\admin\WEB-INF\classes他是一个完整的项目。
    总结:
    如果我们手工指定主目录,也就是 <Context path="" 这样的,那么 host里面的目录无关紧要,但千万不要设置为和<context 里面的相同哦,否则会出现自己嵌套自己的问题。最好就用默认的"webapps"好了。呵呵。
    如果我们不想自己配置每个虚拟目录,则可以在host的目录下面自己建立文件夹,每个都是独立的项目,有自己的WEB-INF和 web.xml
      

  11.   

    事实上.做J2EE项目的时候如果不是子项目.最好配置虚拟路径.且虚拟路径的path为空.
    你form的/xxx是访问的相对于服务器的根路径下的servlet.  
    你改成xxx之后就是访问当前服务器该web项目(webroot)同等目录下的servlet
    RequestDispatcher rd=request.getRequestDispatcher("/jsp/result.jsp");会报错
    而RequestDispatcher rd=request.getRequestDispatcher("jsp/result.jsp")而这个错误也是同样的原因.有/和没有/概念上是完全不一样的./的访问相对于服务器
    没有/的访问相对于当前web项目.
      

  12.   

    加上“/”会被从服务器根目录,
    比如http://127.0.0.1/WebRoot里面的/MyException,会被指引到
    http://127.0.0.1/MyException 而不是 http://127.0.0.1/WebRoot/MyException
      

  13.   

    RequestDispatcher rd=request.getRequestDispatcher("/jsp/result.jsp");会报错
    而RequestDispatcher rd=request.getRequestDispatcher("jsp/result.jsp");没问题。 
    你这里是路径解析的问题吧
    按第一种方式的话,那么你写成这样看看
    RequestDispatcher rd=request.getRequestDispatcher("/工程名/jsp/result.jsp");
    这样解析路径时就不会有错了
      

  14.   

    去掉下划线,改成这个?
    <body>
        <form action="MyServlet" method="post">
            <input type="submit" value="go"/>
        </form>
      </body>