欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于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:
    关于Web工程路径问题的探讨
    关于Web工程路径问题的探讨

  • demo2:
    关于Web工程路径问题的探讨
    关于Web工程路径问题的探讨
    解决方案(th:href是Thymeleaf语法):
    关于Web工程路径问题的探讨

特例规则演示:

假如我们希望通过重定向跳转到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");
}