servlet中的路径有关问题

servlet中的路径问题

     本人java初学者,这是在学习servlet的转发和重定向时碰到的一个关于路径的小知识点。虽然看起来似乎很简单,但是有时候就是容易在这些小问题上犯糊涂,所以想总结一下,加深印象。

     首先我创建了3个servlet,在web.xml中的配置是这样的:

<servlet-mapping>
    <servlet-name>key1</servlet-name>
    <url-pattern>/servlet1</url-pattern>
    <servlet-name>key2</servlet-name>
    <url-pattern>/servlet/servlet2</url-pattern>
    <servlet-name>/servlet/kk/key3</servlet-name>
    <url-pattern>/servlet3</url-pattern>
</servlet-mapping>

     假如我要在这3个servlet中互相转发,语法就是:

request.getRequestDispatcher("url").forward(request, response);

     那么其中的url怎么写呢?例如我要从servlet2转发到servlet1,url为"servlet1"吗?测试发现浏览器给出这样的错误信息:

      HTTP Status 404 The requested resource (/test/servlet/servlet1) is not available. (test为项目名)

     意思是请求的URL所对应的资源不可用。想想当然不可用,因为servlet1在<servlet-mapping>中对应的<url-pattern>为'servlet1',而不是'servlet/servlet1'.
     这里就涉及到路径的知识了,无论是平常所说的文件路径,还是web中的资源路径,都有绝对路径和相对路径之分。绝对路径很好理解,就是文件或资源的完整物理路径。而所谓的相对路径就是相对于某个基准目录的路径。拿例子来解释:如"servlet1"这个url是一个相对路径,那么假设"servlet/servlet2"为基准路径,那么"servlet1"这个相对路径的真实路径为"servlet/servlet1"

注意:在servlet中,"/"代表根目录,在此例中,根目录就是项目的路径即:test/

                         "./"代表当前目录,如servlet/kk/key3这个url中key3的当前目录就是servlet/kk/

                         "../"代表上一级目录,如servlet/kk/key3这个url中key3的上一级目录就是servlet/

那么开头那个问题就很好解决了,从servlet2转发到servlet1正确url格式应为:"../servlet1"或者为"/servlet1"(因为servlet2上一级目录就是根目录了)。