绝对路径和相对路径

1). 为什么要解决相对路径的问题

在有一个 Servlet 转发页面的情况下会导致相对路径的混乱

 比如:  -WebContent(当前WEB应用的名称)

                -a.jsp

                -test

                    -b.jsp

                    -c.jsp

 

                     超链接                    转发            超链接

希望的是从a.jsp-----> HelloServlet------->b.jsp----->与b.jsp同一路径的c.jsp。

                                                  (此时的地址栏为/HelloServlet,而不是/test/b.jsp)

a.jsp: <a href="helloServlet">To B PAGE</a>

HelloServlet: request.getRequestDispatcher("/test/b.jsp").forward(request, response);

b.jsp: <a href="c.jsp">TO C Page</a>. 

 

注意运行a.jsp后,点击 To B PAGE 超链接后的浏览器的地址栏的值http://localhost:8989/day_36/HelloServlet, 虽然页面上显示的是test 路径下的 b.jsp

 b.jsp 页面有一个超链接默认情况下, href="c.jsp"是相对地址, c.jsp 应该和 b.jsp 在同一路径下

此时点击TO C Page超链接后的浏览器地址栏显示: http://localhost:8989/day_36/c.jsp。因为 href="c.jsp"是相对路径,由于上一页面的浏览器地址为http://localhost:8989/day_36/HelloServlet,于是相对于HelloServlet 路径而言,href="c.jsp"的地址应该是 http://localhost:8989/day_36/c.jsp

但在根目录下并没有 c.jsp所以会出现路径混乱的问题

 

 

 

2). 使用绝对路径会解决以上的问题:

绝对路径相对于当前 站点 根目录的路径

http://localhost:8989/day_36/c.jsp: 其中,http://localhost:8989/ 是当前 站点的根目录, /day_36 是 contextPath当前WEB应用的根目录,

/c.jsp 是相对于当前 WEB 应用的一个文件路径。 写绝对路径时,我们在需要当前 WEB 应用的路径下添加contextPath.

比如

<a href="helloServlet">To B Page</a> 

分析:href="ToBServlet"没有/是相对路径,默认是相对于当前WEB应用的的路径。如果要写绝对路径,那么需要把当前WEB应用的路径添加上去,用ContextPath来表示。

需改为<a href="<%= request.getContextPath() %>/helloServlet">To B Page</a>

response.sendRedirect("a.jsp");

分析:sendRedirect("a.jsp")没有/是相对路径,默认是相对于当前WEB应用的的路径。如果要写绝对路径,那么需要把当前WEB应用的路径添加上去,用ContextPath来表示。

 需改为response.sendRedirect(request.getContextPath() + "/a.jsp");

 

<form action="AddServlet"></form> 

分析:action="AddServlet"没有/是相对路径,默认是相对于当前WEB应用的的路径。如果要写绝对路径,有时候需要把当前WEB应用的路径添加上去,用ContextPath来表示。

需改为<form action="<%= request.getContextPath() %>/AddServlet"></form>

 

3). 在 JavaWEB 应用中 代表的是: 

    有时代表当前 WEB 应用的根目录有时代表的是站点的根目录。

    问题在于:写绝对路径时,什么时候不用加ContextPath?以及什么时候不用加/?

     1>/ 代表的是当前 WEB 应用的根路径

    若没有/是相对路径,只要相对路径正确可以不用管。若有 / 要写绝对路径。/ 所在的命令或方法需被 WEB 服务器解析而不是直接打给浏览器则 代表 WEB 应用的根路径

    此时编写绝对路径就不需要添加 contextPath ,因为/本身就代表当前WEB 应用的根路径。

       ①请求转发: 

         request.getRequestDispatcher("/test/b.jsp").forward(request, response);

         或<jsp:forward page="/test/b.jsp"></jsp:forward>

     ②在 web.xml 文件中做 Serlvet 映射路径时,  <url-pattern>/helloServlet</url-pattern>里的/代表当前WEB应用根目录

      <servlet>
              <servlet-name>HelloServlet</servlet-name>
              <servlet-class>com.tt.javaweb.HelloServlet</servlet-class>
      </servlet>
      <servlet-mapping>
             <servlet-name>HelloServlet</servlet-name>
             <url-pattern>/helloServlet</url-pattern>
      </servlet-mapping>

     2>/ 代表的是站点的根目录

       若没有/是相对路径,只要相对路径正确可以不用管。若有 / 要写绝对路径。/直接交由浏览器解析代表的就是站点的根路径,。

       为了让路径完整需要把当前WEB应用的路径添加上去,此时必须加上 contextPath。

      ①请求重定向:

          response.sendRedirect("/a.jsp");

          分析:看到有/代表要写绝对路径。因为/代表当前站点,这样的路径不完整。

          修改成:response.sendRedirect("<%= request.getContextPath() %>/a.jsp");

      ②超链接:

       <a href="/helloServlet">To B Page</a>

        分析:看到有/代表要写绝对路径。因为/代表当前站点,这样的路径不完整。

        修改成: <a href="<%= request.getContextPath() %>/helloServlet">To B Page</a>

      ③表单中的action:      

      <form action="/helloServlet"></form>

       分析:看到有/代表要写绝对路径。因为/代表当前站点,这样的路径不完整。

       修改成: <form action="<%= request.getContextPath() %>/helloServlet"></form>

 

4). 如何获取 contextPath: 

ServletContext getContextPath()

HttpServletRequest: getContextPath()

 

 5)几个路径的获取

//http://localhost:8080/20161024/login/b.jsp
String requestUrl = request.getRequestURL().toString();


///20161024/login/b.jsp
String requestUri = request.getRequestURI();


//获取请求的servletPath:servlet的映射路径:/login/b.jsp
String servletPath = request.getServletPath();

  

原文地址:https://www.cnblogs.com/TTTTT/p/6003105.html