java web 开发过程中很多地方涉及url路径的问题,比如jsp页面、servlet之间的跳转。其实,可以将url中的/xxx看成一级目录,然后像看待目录层级之间的关系那样去看待url路径。接下来用大量示例对各种情况进行详细阐述,最后按个人理解总结出普适性的规律。

  先放一张图,举例要用到的一个项目testProject

  

一、jsp页面到jsp页面的跳转

  用链接进行跳转

  相对路径的方式:a.jsp向b.jsp跳转:<a href="b.jsp">转向b</a>

          a.jsp向c.jsp跳转:<a href="jsp/c.jsp">转向c</a>

          c.jsp向a.jsp跳转<a href="../a.jsp">转向a</a>

          相对路径是根据当前页面的位置去定位目标的位置

  绝对路径的方式:a.jsp向b.jsp跳转:<a hre="${pageContext.request.contextPath}/b.jsp">绝对转向b</a>

          a.jsp向c.jsp跳转:<a hre="${pageContext.request.contextPath}/jsp/c.jsp">绝对转向c</a>

          c.jsp向a.jsp跳转:<a hre="${pageContext.request.contextPath}/a.jsp">绝对转向a</a>

  打印一下${pageContext.request.contextPath}的值:/testProject    其中“/”表示的是容器的根目录,例如Tomcat的webapps目录。所以后面拼接上jsp页面在项目中的路径就可以被浏览器访问到了,这就是绝对路径。如果相对路径写成这样<a href="/b.jsp>转向b</a>。 url=“http://localhost:8080/b.jsp”,而正确的url="http://localhost:8080/testProject/b.jsp,所以不能被访问到。

二、jsp页面到servlet

  实际上和jsp到jsp一样,只是把jsp文件名xxx.jsp换成xxx/yyy这样的url-pattern而已

  url-pattern配置为/servlet/TestServlet和/servlet/TestServlet2

  相对路径的方式:a.jsp向TestServlet跳转: <a href="servlet/TestServlet">转向TestServlet</a>

          c.jsp向TestServlet跳转:<a href="../servlet/TestServlet">转向TestServlet</a>

  绝对路径的方式:a.jsp向TestServlet跳转:  <a href="${pageContext.request.contextPath}/servlet/TestServlet">

          c.jsp向TestServlet跳转:<a href="${pageContext.request.contextPath}/servletTestServlet">

三、servlet发出的跳转

 假设现在在TestServelt中 url = “http://localhost:8080/testProject/servlet/testServlet

  请求转发到a.jsp :

      1.request.getRequestDispatcher("../a.jsp").forword(request,response);     ../相对于退出一级(servlet这一级),回到 “http://localhost:8080/testProject这里 ,拼接上a.jsp即得到正确路径        url=“http://localhost:8080/testProject/a.jsp ,这是用的相对路径.

    2.request.getRequestDispatcher("/a.jsp").forword(request,response);  这也可以实现正确跳转,因为这里的"/"表示项目根目录,rurl=http://localhost:8080/testProject

  请求转发到Testservlet2:

    1.request.getRequestDispatcher("testServlet2").forward(request,response);  TestServlet和TestServlet2在同一层级,这里用的是相对路径。

    2.request.getRequestDispatcher("/servlet/testServlet2").forward(request,response);  这里就是绝对路径了,"/”表示项目根目录

  重定向到a.jsp :

    1.response.sendRedirect(request.getContextPath() + "/a.jsp");   request.getContextPath() 获取项目根路径

    2.response.sendRedirect("/a.jsp");   而这种写法是错误的 地址栏可见url=http://localhost:8080/a.jsp  因为这里的"/"表示的是web容器根目录

总结:

  jsp、servlet本质一样,四种跳转其实就是一种。下面给出通用的结论。

  如果用相对路径,那么不是以"/"开头的。相对路径一定是根据当前资源的位置,再根据自己写的路径去找对应的资源。像/xxx/yyy这种servlet的路径,可以直接把/xxx看做一个层级的目录。只要搞清楚资源之间的相对位置,那就没什么问题了。

  如果用绝对路径,那么必须给出完整的路径。

     如果该路径是给浏览器使用的,例如重定向,链接,表单的提交等。那么,以"/"开头,此"/"表示容器根路径,如tomcat的webapps

     如果该路径是用于服务器内部跳转的,例如请求转发,那么,以"/"开头,此“/”表示的此项目的根路径,如本文中的/testProject

    根据上述两条原则,可以很清晰的拼接出完整的正确的url。无论在什么情况下,都可以使用${pageContext.request.contextPath}或者request.getContextPath()获取项目根路   径,然后根据资源在项目中的位置拼接出url。

   最后,不管用相对路径还是绝对路径,只要查看一下地址栏的url是否是预期的那样,根据url进行修改即可。

         本文个人编写,水平有限,如有错误,恳请指出,欢迎讨论分享。

java web相对路径和绝对路径总结的更多相关文章

  1. 【转】Java Web 项目获取运行时路径 classpath

    Java Web 项目获取运行时路径 classpath 假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么ja ...

  2. java web项目中 获取resource路径下的文件路径

    public GetResource{ String path = GetResource.class.getClassLoader().getResource("xx/xx.txt&quo ...

  3. Java Web 前端资源文件的路径问题

    WEB-INF是Java Web应用的安全目录,在部署时用于存放class文件.项目用到的库(jar包).Java Web应用的配置文件web.xml. 浏览器不能访问此目录下的资源,比如在WEB-I ...

  4. Java Web 项目获取运行时路径 classpath

    假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么java文件夹和resources文件夹在运行时就是class ...

  5. java web开发时的绝对路径与相对路径

    相对路径 不以/开头的路径为相对路径,使用相对路径时的路径为当前访问的文件的父目录,即如果现在访问文件的路径为http://localhost:8080/项目名/目录/文件,那么使用相对路径时路径前缀 ...

  6. day10(java web之request&respone&访问路径&编码问题)

    day10 请求响应流程图 response response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletR ...

  7. Java Web中资源的访问路径

    在web应用中,以“/”开头的是绝对路径,不以“/”开头的是相对路径.   在服务器端,通常都使用绝对路径.例如web.xml.struts.xml.servlet等的访问路径都是以“/”开始. 服务 ...

  8. java web项目中 读取properties 路径的问题

    可以先获取项目的classPath String classPath = this.getClass().getResource("/").getPath();//获取classP ...

  9. Java Web项目开发中常见路径获取方法

    项目绝对路径 String serverPath = request.getSession().getServletContext().getRealPath("/"); E:\J ...

  10. java web项目启动时浏览器路径不用输入项目名称方法

    http://blog.csdn.net/qq542045215/article/details/44923851

随机推荐

  1. 猿创|有赞的zan framework安装与使用

    1.准备工作 1.1 一台腾讯云服务器2核CPU+2G内存的Linux CentOS 7.2(谢谢小杨同学@erchoc) 1.2 预装lnmp一键安装包环境,官方地址:lnmp一键安装包 (如不会使 ...

  2. jdk是什么?jdk1.8安装配置方法

    jdk是什么呢?jdk的是java development kit的缩写,意思是java程序开发的工具包.也可以说jdk是java的sdk. 目前的JDK大致分三个大版本:Java SE:Java P ...

  3. KMP算法的工作流程介绍

    最近又想起了KMP算法,原来一直没搞明白工作原理,现在总算是开点窍了,推荐大家看这篇文章,写的很简单易懂 推荐理由:简单明了,是我看过介绍KMP算法流程的所有文章中,最易懂的一篇(这篇文章仅仅是介绍了 ...

  4. IOS ASI 请求服务器 总结

    一.发送请求的2个对象 1.发送GET请求:ASIHttpRequest 2.发送POST请求:ASIFormDataRequest* 设置参数// 同一个key只对应1个参数值,适用于普通“单值参数 ...

  5. asp.net反射的运用

    反射的用途:    (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例.     (2)使用Module了解包含模块的程序集以及模块中的 ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 A.Hard to prepare 【规律递推】

    任意门:https://nanti.jisuanke.com/t/31453 A.Hard to prepare After Incident, a feast is usually held in ...

  7. 有趣的npx

    在更新 npm 5.2.0 的时候发现会买一送一,自动安装了 npx. npx 会帮你执行依赖包里的二进制文件,也就是说 npx 会自动查找当前依赖包中的可执行文件, 如果找不到,就会去 PATH 里 ...

  8. 二、IntelliJ IDEA 安装目录的核心文件讲解

    首先,咱们回顾一下前两篇关于 IntelliJ IDEA 的博文的内容: 在“在 Windows 系统下安装 IntelliJ IDEA 的方法”中,咱们知道了在 Windows 系统下如何下载并安装 ...

  9. JavaEE权限管理系统的搭建(八)--------角色的增删改

    如下图所示,添加角色的同时,要给角色分配权限菜单,关于权限数的显示,我实现了两种方式,普通方式和Ztree方式, 普通方式展示树: 主要代码部分: /** * 进入角色添加页面 * @param mo ...

  10. mac install PyQt5

    1. install brew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...