关于Web工程路径问题的探讨
程序员文章站
2024-01-11 16:50:52
...
Web工程路径问题基础理论
1. 路径的构成
路径由两部分构成:资源路径与资源名称。即路径 = 资源路径 + 资源名称
资源路径与资源名称的分水岭为:路径中的最后一个斜杠。斜杠的前面部分称为资源路径,后面部分称为资源名称。
例如:
- 请求路径:http://localhost:8080/xxx/test/index
- 资源路径:http://localhost:8080/xxx/test
- 资源名称:index
2. 路径的分类
根据是否可以唯一的定位一个资源,可以将路径划分为两类:绝对路径与相对路径。
- 绝对路径:可以唯一的定位一个资源的路径。在 Web 应用中,一般使用 URL 形式表示。
- 相对路径:仅依赖此路径无法唯一定位资源,但若为其指定一个参数路径,则可以将其转换为一个绝对路径,这样的路径称为相对路径。在 Web 应用中,一般使用 URI 形式表示。
- 转换关系: 绝对路径 = 参照路径 + 相对路径
3. 绝对路径分类
根据路径作用的不同,可以将绝对路径分为:资源定义路径,与资源请求路径。
- 资源定义路径:用于表示资源位置的路径。
- 资源请求路径:客户端所发出的对指定资源的请求路径。
4. 相对路径分类
根据相对路径是否以斜杠开头,可以划分为两类:斜杠路径,与非杠路径。
- 斜杠路径:以斜杠开头的相对路径。
- 非杠路径:不以斜杠开头的相对路径。
5. 斜杠路径分类
对于斜杠路径,根据其出现的位置的不同,可以划分为:前台路径与后台路径。
- 前台路径:出现在 HTML、JS、CSS,及 JSP 文件的静态部分的斜杠路径。(简单来说就是这个路径是在前端浏览器上显示的路径)
例如:<img src=””/>、<a href=””/>、backgroud:img(“”) 、window.location.href=””。 - 后台路径:出现在 Java 代码、JSP 文件的动态部分(Java 代码块、JSP 动作等)、XML、properties 等配置文件中的斜杠路径。(后台路径其实就是后端使用的路径)
6. 路径解析器
相对路径,最终都会经过路径解析器,将其转换为绝对路径,以定义或定位一个资源。不同的相对路径,其路径解析器也是不同的。
- 前台路径:路径解析器为浏览器。
- 后台路径:路径解析器为服务器。
- 非杠路径:若非杠路径出现在前台路径位置,其路径解析器为浏览器;若非杠路径出现在后台路径位置,其路径解析器为服务器。
7. 解析规则
不同的路径解析器,对同一个相对路径的解析结果是不同的。所谓解析结果,指的是将相对路径所转换为的绝对路径。由于 绝对路径 = 参照路径 + 相对路径 ,所以,不同的解析器,会为相对路径匹配不同的参照路径
。换句话说就是,我们学习的重点是,浏览器、服务器对于不同的相对路径所匹配的参照路径到底是谁
。
(1) 一般规则
- 前台路径:其参照路径为当前 web 服务器的根。
- 后台路径:其参照路径为当前 web 应用的根。
- 非杠路径:其参照路径为当前请求路径的资源路径。
例如,
- 请求路径: http://localhost:8080/xxx/test/index
- 当前 web 服务器的根: http://localhost:8080
- 当前 web 应用的根: http://localhost:8080/xxx
- 资源路径: http://localhost:8080/xxx/test
(2) 规则特例
- 在代码中使用 HttpServletResponse 的 sendRedirect()方法使用斜杠路径进行重定向时,其参照路径按照之前规则,应该是当前 web 应用的根,但实际情况是,当前 web 服务器的根。
8. 演示
一般规则演示:
xxx是Web应用项目路径,请求的Controller路径是/test/count
-
demo1:
-
demo2:
解决方案(th:href是Thymeleaf语法):
特例规则演示:
假如我们希望通过重定向跳转到http://localhost:8080/xxx/html/welcome.html页面:
@GetMapping("/abc")
public void abcHandle(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 方式1:
// response.sendRedirect("/html/welcome.html");
// 这是一个后台路径,后台路径的参照路径是 当前web应用的根 http://localhost:8080/xxx
// 根据 绝对路径 = 参照路径 + 相对路径
// 路径解析器解析的绝对路径是 http://localhost:8080/xxx/html/welcome.html
// 这个绝对路径是一个 资源请求路径
// 而演示的效果最终浏览器跳转的URL是 http://localhost:8080/html/welcome.html
//方式2:
// response.sendRedirect("html/welcome.html");
// 这是一个非杠路径,非杠路径的参照路径是 当前请求路径的资源路径 http://localhost:8080/xxx/test
// 根据 绝对路径 = 参照路径 + 相对路径
// 路径解析器解析的绝对路径是 http://localhost:8080/xxx/test/html/welcome.html
// 这里直接就看出不行
// 上面两种都是有问题,解决方案如下:
response.sendRedirect(request.getContextPath() + "/html/welcome.html");
}
下一篇: 关于 Session 的深入探讨
推荐阅读
-
关于Web工程路径问题的探讨
-
关于静态网页的缓存问题_html/css_WEB-ITnose
-
关于在dos 下 command php 跟 在web的环境下 斜线跟反斜杠的问题
-
关于iframe自定义高度的问题_html/css_WEB-ITnose
-
100分!关于链接的问题!_html/css_WEB-ITnose
-
求教,关于Rewrite中的路径有关问题
-
关于光标位置的问题_html/css_WEB-ITnose
-
有关于拖拽插件dragsort的兼容性问题_html/css_WEB-ITnose
-
求教,关于网站设计的问题_html/css_WEB-ITnose
-
早上好,请问关于php绝对路径的问题