路径问题:相对路径与绝对路径

1、提出问题

① 创建 Web 应用 Path,目录结构如图所示
在这里插入图片描述

② 在 a.html 中有超链接<a href="b.html">To b.html</a>
③ 如果先直接访问 a.html,再通过超链接转到 b.html 没有问题。
④ 如果先通过 TestServlet 转发到 a.html,则浏览器地址栏会变成:
http://localhost:8989/Path/TestServlet
此时再点击超链接 <a href="b.html">To b.html</a> 就会发生问题,找不到 b.html。
⑤ 原因是超链接 <a href="b.html">To b.html</a> 使用的是相对路径,浏览器进行解析时,只能以当前浏览器地址栏里的路径为基准。例如,当前浏览器地址栏里的内容是:
http://localhost:8989/Path/TestServlet
那么经过浏览器解析后 b.html 的访问地址就成了:http://localhost:8989/Path/TestServlet
b.html 这显然无法访问到 b.html。

2、完整的 url 构成

在这里插入图片描述

3、相对路径和绝对路径

3.1 相对路径

虚拟路径如果不以 “/ ”开始,就是相对路径,浏览器会以当前资源所在的虚拟路径为基准对相对路径进行解析,从而生成最终的访问路径。此时如果通过转发进入其他目录,再使用相对路径访问资源就会出错。

3.2 绝对路径

虚拟路径以“/”开始,就是绝对路径

1)在服务器端:虚拟路径最开始的 “/” 表示当前 Web 应用的根目录。

例如:服务器端虚拟路径 “/TestServlet” 使用浏览器访问时,地址为http://localhost:8989/Path
所以由服务器解析的路径,以”/”开头的都是以当前 web 路径为基准的。
由服务器解析的路径
 web.xml 文件中 url-pattern 中配置的 URL,以“/”开头的
 转发操作:request.getRequestDispatcher("/xxx").forward(request,response);
 Jsp 动作标签:<jsp:forward page="/xxx">
这些最后的访问路径都是:http://localhost:8989/Path/xxx

2)在浏览器端:虚拟路径最开始的“/”表示当前主机地址。

例如:链接地址 “/ Path/ dir/ b.html” 经过浏览器解析后为:
相当于 http://localhost:8989/ Path/ dir/ b.html
所以由浏览器解析的路径,以“/”开头的都是以当前的主机地址为基准的
由浏览器解析的路径
 重定向操作:response.sendRedirect("/xxx")
 所有 HTML 标签:<a href="/xxx">;<form action="/xxx">
这些最后的访问路径都是
http://localhost:8989/xxx
所以我们可以看出,如果是浏览器解析的路径,我们必须加上项目名称才可以正确的指向
资源。http://localhost:8989/Path/xxx

3.3 jsp 页面中获取项目名

在由浏览器解析的地址中动态添加当前 web 应用根目录路径

1)JSP 表达式 <%= request.getContextPath() %> = /LessonPractice040
例:<a href="<%= request.getContextPath() %>/target.jsp">Target Page</a>

扫描二维码关注公众号,回复: 11626674 查看本文章

2)EL 表达式 ${pageContext.request.contextPath } = /LessonPractice040
例: <a href="${pageContext.request.contextPath }/target.jsp">Target Page</a>

猜你喜欢

转载自blog.csdn.net/weixin_45606067/article/details/108409474