路径问题

路径问题

相对路径

  • 不以/ 开头
  • ./ 表示当前资源的路经
  • ../ 表示当前资源的上一层路经

缺点:目标资源路径受到当前资源路径的影响,不同的位置,相对路径的写法不同


目标资源的请求全过程

当前资源请求路径:http://localhost:8080/demo/index.html

当前资源是:index.html

当前资源的所在路径:http://localhost:8080/demo

目标资源的相对路径:static/img/logo.png

当页面加载到有相对路径的目标资源时,会将当前资源所在路经与目标资源的相对路径拼接,然后发送请求找目标资源

目标资源的完整路径:http://localhost:8080/demo/static/img/logo.png


请求转发的问题

在进行请求转发时,浏览器中URL不变

在获取相对路径的资源时,还是会把原URL的路经作i为当前资源路经与相对进行路经拼接

因此,资源文件的加载,是针对客户端而言,针对URL而言的,单纯的看服务端的目录结构来写相对路径是不对的😮


绝对路经

  • 以/ 开头

  • 不同的项目中,固定的路径出发点可能不一样,可以先测试一下

以Tomcat10为例,绝对路径的出发点是http://localhost:8080/,**不包含上下文路径**

如果要写绝对路径,应该写成:

<img src="/demo05/static/img/logo.png">

优点:目标资源路径的写法不会受到当前资源路径的影响,不同的位置,绝对路径的写法一致

缺点:绝对路径要补充项目的上下文,而上下文是经常改变的


base标签的妙用(不完美)

通过 head>base>href属性,定义相对路径公共前缀,通过公共前缀把一个相对路径转换为绝对路径

<base href="/demo/">

在定义此标签后,所有没有前缀的相对路径前都会加上此上下文路径(/demo/)

这样就能把一个相对路径转换为一个带有上下文的绝对路径访问

当上下文路径发生变化时,可以将base标签的href属性更改即可😊


后端资源的路径问题

相对路径

在进行请求转发或响应重定向时,也会出现路径问题,并且与资源获取的路径问题大致相同

响应重定向的路经

在响应重定向使用绝对路经时,和前端一样,需要加拼接上下文路经(访问路经)

resp.sendRedirect("/demo/ServletB");

但是,这样也会出先与前端相同的问题:当我们修改上下文路经时,后端代码需要同步修改

为了解决这个问题,我们应该动态获取上下文路径,再与重定向路经进行拼接

String contextPath = req.getContextPath();
resp.sendRedirect(contextPath + "/ServletB");

请求转发的路经

与响应重定向不同,请求转发的路经时不需要拼接上下文路经的!!!

req.getRequestDispatcher("/ServletB").forward(req, resp);

在请求转发时,资源路径的地址是:http://localhost:8080/demo/

与前面的绝对路经都不相同,所以我们在请求转发到绝对路径时,是不需要拼接上下文路径的


路经问题的最终解决方法*

为了解决前端后端的所有路径问题,我们最终采用的方案就是——不设置上下文路经!!!😝

是的你没听错,前面的全部白学!!!

路径问题-后端资源的路径问题.png

当上下文路经设置为/ 时,我们所有资源的访问路经都可以设置为绝对路径的方式,并且忽略上下文路经,这也是实战开发中所采取的方式