java web相对路径和绝对路径总结
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相对路径和绝对路径总结的更多相关文章
- 【转】Java Web 项目获取运行时路径 classpath
Java Web 项目获取运行时路径 classpath 假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么ja ...
- java web项目中 获取resource路径下的文件路径
public GetResource{ String path = GetResource.class.getClassLoader().getResource("xx/xx.txt&quo ...
- Java Web 前端资源文件的路径问题
WEB-INF是Java Web应用的安全目录,在部署时用于存放class文件.项目用到的库(jar包).Java Web应用的配置文件web.xml. 浏览器不能访问此目录下的资源,比如在WEB-I ...
- Java Web 项目获取运行时路径 classpath
假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么java文件夹和resources文件夹在运行时就是class ...
- java web开发时的绝对路径与相对路径
相对路径 不以/开头的路径为相对路径,使用相对路径时的路径为当前访问的文件的父目录,即如果现在访问文件的路径为http://localhost:8080/项目名/目录/文件,那么使用相对路径时路径前缀 ...
- day10(java web之request&respone&访问路径&编码问题)
day10 请求响应流程图 response response概述 response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletR ...
- Java Web中资源的访问路径
在web应用中,以“/”开头的是绝对路径,不以“/”开头的是相对路径. 在服务器端,通常都使用绝对路径.例如web.xml.struts.xml.servlet等的访问路径都是以“/”开始. 服务 ...
- java web项目中 读取properties 路径的问题
可以先获取项目的classPath String classPath = this.getClass().getResource("/").getPath();//获取classP ...
- Java Web项目开发中常见路径获取方法
项目绝对路径 String serverPath = request.getSession().getServletContext().getRealPath("/"); E:\J ...
- java web项目启动时浏览器路径不用输入项目名称方法
http://blog.csdn.net/qq542045215/article/details/44923851
随机推荐
- Nginx+Tomcat在Windows下做负载均衡
一. 为什么需要对Tomcat服务器做负载均衡 Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果有超过500的并发数便会出现Tomcat不能响应新的请求的情况,严重影响网站的 ...
- 阿里云上到底能运行SAP哪些产品?
本文主要内容大部分来源于SAP已经发布的note: 2552731 - SAP Applications on Alibaba Cloud: Supported Products and IaaS ...
- linux下vi的一些简单的操作
前言 在嵌入式linux开发中,进行需要修改一下配置文件之类的,必须使用vi,因此,熟悉 vi 的一些基本操作,有助于提高工作效率. 一,模式 vi编辑器有3种模式:命令模式.输入模式.末行模式.掌握 ...
- bzoj3816 矩阵变换
Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N. 矩阵中每个数都是 [0,N] 中的自然数. 每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每 ...
- SPOJ8093【JZPGYZ - Sevenk Love Oimaster】
怎么全是广义后缀自动机,我\(AC\)自动机不服 这道题可以使用的算法很多,\(SA\)或者\(SAM\)应该都可以 但是我都不会 但是这毕竟是一个多串匹配问题,\(AC\)自动机还是可以刚一刚的 我 ...
- 【bzoj2563】 阿狸和桃子的游戏
题目 非常妙的题目,一看到就以为是一道博弈,之后就不会做了 正解非常巧妙,由于我们只需要求出最后两个人得分的差值,所以对于每一条边我们将其的权值拆成两边,分给其连接的两个点 如果这两个点被同一个人选择 ...
- spring boot 三种入参
先来讲述下最简单的使用get请求用户信息的实现方式,代码如下,写好后直接在Application类点击右键有个RunAs,点击后会自动运行,运行成功后可以使用http发包工具进行测试,这里推荐使用ch ...
- PHP设计模式——责任链模式
<?php /** * 责任链模式 * 组织一个对象链处理一个请求,每个处理对象知道自己能处理哪些请求,并把自己不能处理的请求交下一个处理对象 * * 适用场景: * 1.有多个对象可以处理同一 ...
- 2018.12.30 Intellij IDEA设置main方法自动补全
Eclipse与 Intellij IDEA设置方法自动补全 1.首先,点击File-->Settings-->Editor-->Live Templates 设置你想输出的模板 右 ...
- activeMQ消息队列的使用
ActiveMQ解决问题: 1.解决服务之间的耦合 2.增加系统并发处理量. 它使用的是标准生产者和消费者模型.有两种数据结构:Queue/Topic 1.Queue队列,生产者生产一个消息,只能由 ...