zoukankan      html  css  js  c++  java
  • 绝对路径和相对路径

    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();

      

  • 相关阅读:
    字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
    字节码编程,Javassist篇三《使用Javassist在运行时重新加载类「替换原方法输出不一样的结果」》
    字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
    字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
    CPU瞒着内存竟干出这种事
    可怕!CPU竟成了黑客的帮凶!
    完了!CPU一味求快出事儿了!
    如果平行宇宙也有编程语言
    你离黑客的距离,就差这20个神器了
    哈希表哪家强?几大编程语言吵起来了!
  • 原文地址:https://www.cnblogs.com/TTTTT/p/6003105.html
Copyright © 2011-2022 走看看