在名称为 Hello 的 WEB 工程下有两个页面:html 页面和jsp 页面,其中都存在这样的表单<form action="servletOne" method="post">
  <input type="text" name="username" value="HAVE">
  <input type="submit" value="GO">
</form>这两个页面都在 context 下的 test 文件夹下。当在这两个页面中提交这相同的表单时出现问题:
html 页面中的访问 URL 被编译为:http://localhost:8080/Hello/test/servletOne
jsp  页面中的访问 URL 被编译为:http://localhost:8080/Hello/servletOne
哪为朋友能告之原因,先谢了!

解决方案 »

  1.   

    你看看你的hello工程下的WEB.xml配置文件 servlet是不是给JSP文件的映射 (共同学习)
      

  2.   

    应该是这样的html被提交后会按路径寻找处理文件,而serlet程序会按web.xml中的配置文件寻找处理程序
      

  3.   

    我在 web.xml 中声明了一个 Servlet---- servletOne 已经映射,代码如下:  <servlet>
        <servlet-name>servletOne</servlet-name>
        <servlet-class>test.ServletOne</servlet-class>
      </servlet>  <servlet-mapping>
        <servlet-name>servletOne</servlet-name>
        <url-pattern>/servletOne</url-pattern>
      </servlet-mapping>
      

  4.   

    关于 2 楼朋友所说,我起初也觉得是这样,但是再给出一个现象,这样的解释就行不通了:
    如果使用 struts 
    同样这个 jsp 页面其中的表单如下<form action="login.do" method="post">
      <input type="text" name="username" value="HAVE">
      <input type="submit" value="GO">
    </form>此时的访问 URL 则又被编译成 http://localhost:8080/Hello/test/login.do
      

  5.   

    这里涉及到一个绝对路径和相对路径的问题,建议在jsp中加入一个basePath
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    form里这样写:
    <form action="<%!=basePath/servletName%>" >
    这样jsp编译后就是完整路径,使你的代码更灵活 <servlet>
        <servlet-name>servletOne</servlet-name>
        <servlet-class>test.ServletOne</servlet-class>
      </servlet>  <servlet-mapping>
        <servlet-name>servletOne</servlet-name>
                <!-- 映射路径是basePath/servletOne ,是按这个路径访问servlet 的-->
        <url-pattern>/servletOne</url-pattern>
      </servlet-mapping>
      

  6.   

    html页面是服务器的静态资源,放在test文件夹下,所以路径中肯定会有个test,jsp页面是通过jsp容器解析后生成servlet,他的本质是servlet,如果你用tomcat的话你可以在安装目录的work文件夹中找到这个servlet.不知道能不能解释你的疑惑.
      

  7.   

    使用struts? 貌似这里没有跟struts关联啊,你有用到struts的标签库么?
      

  8.   

    没有用什么标签!只是我在表单提交时提交到 Struts 中的那个 ActionServlet
    帮看下代码吧
    test 文件夹含有表单的 JSP 页面:<form action="login.do" method="post">
      <input type="text" name="username" value="HAVE">
      <input type="submit" value="GO">
    </form>
    struts-config.xml 中的配置<action path="/login" type="may.struts.controlLayer.actions.LoginAction"></action>web.xml 中关于 Struts 的 ActionServlet 的声明与映射    <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</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>3</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>  <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
    这样的条件下,我在 这个 JSP 页面中提交表单则请求 URL 为:http://localhost:8080/Hello/test/login.do
    所以表单无法正常提交到 LoginAction 。只有将表单的 action 的值改为:"../login.do" 或者将 struts 配置文件中的 <action> 标签的 path 属性的值该为 "/test/login" 才可以正常到达 LoginAction.
    可是按照先前的结论:这个 test 文件夹下的 Jsp 页面所提交的表单的 URL 应该是http://localhost:8080/Hello/login.do 才对啊!
    这里疑惑啊!
      

  9.   

    那把你原来的那个jsp里action属性改成login.do呢? 是否能正确提交
      

  10.   

    你说的是 jsp 页面中表单的 action 属性吗?
    就是写成 login.do 产生了如下疑问!
    ______________________________________________________________________________________
    这个   JSP   页面中提交表单则请求   URL   为:http://localhost:8080/Hello/test/login.do 
    所以表单无法正常提交到   LoginAction   。只有将表单的   action   的值改为:"../login.do"   或者将   struts   配置文件中的   <action>   标签的   path   属性的值该为   "/test/login"   才可以正常到达   LoginAction. 
    ______________________________________________________________________________________
      

  11.   

    你不是还有一个jsp页面么,test目录下的.一开始和html一起测试servleOne的那个,把这个jsp的action改成login.do.是否能正确跳转,你没有struts标签,那这两个jsp页面应该是一样的?怎么会出现你说的这种情况呢?
      

  12.   

    工程路径后面的login.do 符合 <url-pattern>*.do</url-pattern>设置的url模式,所以被提交到ActionServlet.这里是关键.只要这里能做好匹配就能提交.
      

  13.   

    提交到 ActionServlet 应该是没有问题的,但在 ActionServlet 中却无法找到相应的 Action.造成这样的结果的原因就在于咱们讨论的 表单中 action 的值的问题
      

  14.   

    这里应该是/test/login和path指定的/login做比较的,*应该包括工程路径后面的全部字符.我刚刚想错了:) 你四楼那个问题我不明白的是,这里并没有跟struts关联啊,就一个表单的提交路径.
      

  15.   

    是啊!表面去看,和用不用 struts 没有关系。可是事实就是有关系啊!之前的结论在不用 strtus 时成立,可用了 struts 后,同一个路径下的表单被提交后,它们的 URL 是不同的
      

  16.   

    解决了么?如果没有可以把你的工程发我一份[email protected] 
      

  17.   

    还是不太清楚具体原因,只能先记住这个结果了!
    有时间给我你 Email 过去。今天有点紧了!因为那个工程挺大的,我改天写个小的,让这个问题暴露其中,然后给你发过去!
    好了,谢了朋友!
    这贴就这样了,结了!
      

  18.   

    FORM提交的时候和服务器端无关吧.
    不管服务器端是怎么样,是JSP也好
    HTML也,用了struts也好,甚至是
    .net也好,FORM的submit的路径是和服务
    器端无关的,它只和当前URL里的地址有关,
    和本身在工程的位置也是无关的.我想LZ大概是用了struts转到那个JSP页面
    的,而且是forward的,所以实际上地址栏里
    应该是xxx.do,而不是/test/xxx.do