相对路径和绝对路径(带例子,详解)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44296929/article/details/102543956

一、路径问题:

在SpringMVC中可能涉及路径问题的地方:链接、表单提交、重定向和转发

<a href=""></a>
<form action=""></form>
response.sendRedirect("")
request.getRequestDispatcher("")

链接、表单提交、重定向和转发如何填写相应的路径:

(1):什么是相对路径? 部分概念出处

不以"/"开头的路径。
./表示当前路径,即:action="./handler_login.do" 和 action="handler_login.do"都表示当前路径。
../表示当前路径的父级路径。

相对于 当前资源 所在的路径。
相对路径是相对于:http://主机地址:端口号/项目名/资源路径/
注:由于转发的存在(转发时url地址不变),所以相对路径会经常发生变化,会导致我们的路径错误,所以在开发中不推荐使用相对路径。

(2):什么是绝对路径?

"/"开头的路径。

绝对路径分为两种:
a.浏览器解析的绝对路径," / " 代表的是服务器的根目录:http://主机地址:端口号/
(如果是服务器解析的绝对路径[后台路径]:斜杠开头表示当前应用程序的上下文路径。)
注:由浏览器解析的路径只能到服务器的根目录,所以我们需要我们自己加上项目名。

b.服务器解析的绝对路径," / "代表的是项目的根目录:http://主机地址:端口号/项目名/
(如果是浏览器解析的绝对路径[前台路径]:斜杠开头表示 服务器的根目录。)
注:由服务器解析的路径,不需要我们自己加项目名。(因为本身的根目录就给我们带了项目名)

(3):如何写绝对路径?

链接、表单提交、重定向从应用名开始写,转发从应用名之后开始写。

注:不要将应用名直接写在路径里面,应该使用一下方法来获得实际部署时的应用名:String request.getCOntextPath(); 在实际开发中应尽量使用绝对路径。

下面来解释一下上面的一些定义: 点击了解:转发和重定向
1、问: 为什么其它路径的是从应用名开始写,而转发(不用写应用名)是从应用名之后开始写呢?
答: 因为转发在是一次请求内,一个web组件未完成交给另一个web组件来继续完成请求的过程,转发过程中请求的路径不变,转发的过程就是由服务器本身解析的,都是在同一个web项目中,所以后面无需加上项目名称(根目录已经带有项目路径了)。

2、转发的解析过程: request.getRequestDispatcher("/xxx/yyy").forward(requst,response);
解释: 转发是服务器解析的过程,后台路径资源的查找是在服务器内进行查找的,后台路径以斜杠" / "开头表示从当前应用的根进行查找。

3、重定向的解析过程: response.sendRedirect("/xxx.jsp");
response.sendRedirect(request.getContextPath()+"/xxx.jsp");
解释: 重定向就是典型的浏览器解析的过程,重定向是由客户端发起一次请求,然后服务器处理一部分然后告诉客户端重定向到另一个网站或项目来继续处理该请求,重定向的过程是由客户端发起请求,由服务器端加载返回文件内容。前台路径以斜杠" / "开头表示从服务器的根进行查找。

二、例子:
下面是几个jsp的目录结构:
在这里插入图片描述
例1: 测试 超链接相对路径<a href=""></a>
在index.jsp页面中添加一个超链接:使用相对路径,点击后跳转user_info.jsp

<a href="../user/info.do">User_Info.Jsp页面</a>

根据上面的文件目录结构可以知道,我们当前所在的是index.jsp页面,其中完整的访问路径为:http://localhost:8080/SPRINGMVC-02-USER/WEB-INF/index.jsp,如果我们想使用相对路径跳转,跳转后的路径应为:http://localhost:8080/SPRINGMVC-02-USER/user/info.do,所以我当前的目录为http://localhost:8080/SPRINGMVC-02-USER/WEB-INF/通过../跳到父级目录http://localhost:8080/SPRINGMVC-02-USER/然后再加上user/info.do就是正确路径啦。

例2: 测试 超链接绝对路径<a href=""></a>
在index.jsp页面中添加两个超链接:测试使用绝对路径,点击后跳转user_info.jsp

<a href="/user/info.do">不带项目名称:User_Info.Jsp页面</a><br>
<a href="/SPRINGMVC-02-USER/user/info.do">带项目名称:User_Info.Jsp页面</a>

部署tomcat以后index.jsp页面展示:
在这里插入图片描述
点击第一个以后:出现了404,路径为:http://localhost:8080/user/info.do
在这里插入图片描述
点击第二个:正常跳转到了 user_info.jsp页面
在这里插入图片描述
由此可见,超链接 中添加绝对路径 是浏览器解析过程,如果不加项目名称,是访问不到我们想访问的资源的。

例3: 测试表单提交相对路径:<form action=""></form>
在login.jsp中我们添加一个表单,让用户提交用户名和密码:

<form action="./handler_login.do" method="post">
	<fieldset>
		<legend>登录页面</legend>
		用户名:<input name="username"><br>
		密码:<input type="password" name="password"><br>
		<input type="submit" value="确定">
	</fieldset>
</form>

./表示当前路径下:action="./handler_login.do"action="handler_login.do"效果相同。
在这里插入图片描述
在这里插入图片描述
登陆页面:填写信息点击提交后的路径:http://localhost:8080/SPRINGMVC-02-USER/user/handler_login.do
在这里插入图片描述
因为处理登录请求的路径是http://localhost:8080/SPRINGMVC-02-USER/user/login.do,然后进入login.jsp页面,所以当前目录是http://localhost:8080/SPRINGMVC-02-USER/user/,所以只需在action中添加handler_login.do即可。

例4: 测试 表单提交 绝对路径:<form action=""></form>
将表单的代码改为绝对路径:

<form action="/SPRINGMVC-02-USER/user/handler_login.do" method="post"></form>

提交后的路径为:http://localhost:8080/SPRINGMVC-02-USER/user/handler_login.do,为正确的路径,这种情况下使用相对路径比较好一下,因为是项目内部的处理。
(错误的路径我就不演示了,因为表单提交也是浏览器解析,所以前面不加项目名也会出现404)。

例5: 测试 重定向路径问题:response.sendRedirect("")
先看一下目录结构:
在这里插入图片描述
a、 我们先使用 相对路径:
我们在拦截器中添加对登录的拦截,拦截器的路径为:http://localhost:8080/SPRINGMVC-02-USER/cn.tedu.spring.interceptor/LoginInterceptor,所以我们如果想重定向到登录页面的话,我们要先使用../进入上级目录也就是根目录,然后在跳转到登录页,所以相对路径应为:response.sendRedirect("../user/login.do");

b、 使用 绝对路径:
因为重定向也是浏览器解析,所以要加上项目名称,即:绝对路径:response.sendRedirect("SPRINGMVC-02-USER/user/login.do");

例6: 测试 转发 路径问题:request.getRequestDispatcher("")
假设我们的拦截器拦截以后使用转发:

a、 使用 相对路径为:request.getRequestDispatcher("…/user/login.do")
b、 使用 绝对路径为:request.getRequestDispatcher("/user/login.do")

其实例子都是大同小异的,只要理解上面的定义就行了,重点是绝对路径的那两种解析方式。

上面就是所有路径相关的内容,如果文章对你有帮助,别忘了点个赞哦!

猜你喜欢

转载自blog.csdn.net/weixin_44296929/article/details/102543956