【你不知道的】相对路径和绝对路径的秘密

在过去,你以为

绝对路径和相对路径不过就是全路径和相对当前路径的路径。
大学老师说,/开头的就是绝对路径,相对路径就是能写短一点的路径(错误理解)。然而我们并不知道为什么,就这样死记硬背了。

路径重要性

在做项目时,路径资源莫名显示不出来(比如图片莫名丢失)却不知道为什么,就说明没弄懂绝对路径和相对路径。

正确理解

1. 绝对路径:不可改变的路径。

例如:我在北京市海淀区XX街道XX小区2号楼一单元704,那么如果你在上海,你一定能通过地址准确地找到我(除非地震或者炸了这种特殊情况,否则你一定能通过地址找到我)。
在计算机内存中也是如此,它存在于计算机内存某个地址(也就是某个明确位置的文件夹)中。

1) 绝对路径的分类

绝对路径分为两种
1. 本地路径:一般以盘符开头
2. 网络路径:一般以协议,ip,和端口号开头,http://www.baidu.com/test/test.jsp

2. 相对路径:可以改变的路径。一定存在一个基准路径作为参考,开始查找其他的资源。

比如:我在你左前方50米,但是我的位置是参考你的位置来确定的。比如你在上海,那么我肯定在上海,同理,你在北京,那么我一定在北京。我的位置,是相对于你的位置来确定的。
基准路径:以资源的访问路径为基准(浏览器地址栏出现的路径为基准)

1) 如果一个路径以 / 开头,是相对路径

① 前台路径(a,form,img等):即浏览器解析资源文件的路径。如果前台路径以斜杠开头,表示以服务器根路径(http://localhost:8080/)为基准。
② 后台路径(转发,配置文件):即服务器解析资源文件的路径。如果后台路径以斜杠开头,表示以web应用根路径(http://localhost:8080/webapp)为基准。

注意

重定向分两种情况:
1) 直接response.sendRedirect(“/”) 会走前台路径
2) 使用SpingMVC时在Controller中方法返回值写return “redirect:/index”; 则会走后台路径 .

  • 原因:SpringMVC整合框架的时候它会做出特殊处理,会在/index 前加东西,使其前面加上项目名。

你熟悉的

平常我们喜欢在页面内的资源路径名前加上${pageContext.request.contextPath}/,以为获取了项目的绝对路径,实际上这个表示带应用名称的 后台路径 ,然而名称太长我们打错怎么办?
(属性名打错成 pagecontext.request.contextPath/ {pageContext.request.contextpath}/,直接报错500方法不存在)针对这个问题,有以下解决方式

解决

  • 将其作为变量放在application域对象中共享,给它一个简洁的名字,然后以用EL表达式访问。
    1. 在项目中建一个监听器,在服务器启动的时候就获取该路径。
package com.wu.atcrowfunding.web.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ServerStartupListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        // 1.获取ServletContext
        ServletContext application = sce.getServletContext();
        // 2.获取路径
        String path = application.getContextPath();
        // 3.将路径放到域中
        application.setAttribute("APP_PATH", path);

    }

    public void contextDestroyed(ServletContextEvent sce) {
        // TODO Auto-generated method stub
    }

}
  1. 在web.xml中配置监听器,重新启动服务器(该监听器应该在Spring配置的监听器下面)
     <listener>
        <listener-class>com.wu.atcrowfunding.web.listener.ServerStartupListener</listener-class>
    </listener>

3.页面测试

<%@ page pageEncoding="UTF-8"%>
<img src="${APP_PATH}/img/carousel-2.jpg"/>

测试成功页面:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_32106647/article/details/79118750