当前位置: 首页 > 编程日记 > 正文

彻底解决web开发中遇到的路径问题(上)

  注:本文部分引用了网络上的文章,以及动力节点老师的讲解内容,感谢老师,嘻嘻。

  为了举例方便,我新建了pathTest项目:

  

  关于tomcat的配置,eclipse访问项目的路径一般是localhost:8080/projectName, 在idea,访问路径默认情况下就变成了localhost:8080,路径没有了后面的项目名。localhost:8080/projectName或者是localhost:8080就是我们平常所说的应用上下文,项目中的路径名都是相对于这个应用上下文来说的。在idea下开发的时候,有时候我们可能需要让访问路径带上项目名,但是idea默认是为每个项目单独配置tomcat的,eclipse是把项目统一放到某个配置好的tomcat中,所以默认配置的不同会导致访问路径的差别(这个要重点理解)。

 

out包含了项目中所有的文件,资源。

这也是为什么我们在写路径时,为什么不用写web这个路径的原因(一开始我以为会自动补上,其实项目发布后以out文件夹中的projectName_war_exploded为根目录,根本就没web文件夹的事)。

  测试环境弄好了,我们就可以开始理解各种路径的问题了!我在这几天看了不少资料,发现:路径问题具有相对性,要根据服务器的配置讨论,具体问题具体分析!如上面所示我是把idea的默认配置修改了,把application context由空修改为/pathTest,这是大前提哦!这样配置的话,有一层含义是一个服务器中是存在多个web项目的。

  虽然说路径具有相对性,但是还是有一些“不变的真理”的:

  1.  / 与 \ 的区别:作为目录分隔符:Windows目前用 \ 和 / 都可以,Unix只能用 / 。因为web最开始在Unix上跑,所以URL也用 / 做目录分割符。

  2.  /      表示文件根目录

      ./     表示文件目前所在的目录(写与不写等效)

     ../    表示文件的上一层目录

  3.  绝对路径 = 参考路径 + 相对路径

 +----------------------------------------------------------------------------------------------------------------------------------------------------------------+

在开始实验前,先总观路径问题:绝对路径没啥说的,主要是相对路径。

  • 以斜杠开头的相对路径
    •   前台路径:由浏览器解析执行的代码中所包含的路径(html,css,js及jsp中静态部分的路径,ajax)。前台路径的参照路径是web服务器的根路径即http://127.0.0.1:8080(http://localhost/)。将前台路径转化为绝对路径,是由浏览器自动完成的,作用是为用户提交对某种资源的请求,是要查找并定位服务器中某种资源,即查找
    •   后台路径:由服务器所执行的代码及文件中所包含的路径(java、jsp动态部分,xml等配置文件)。后台路径的参考路径是web应用的根路径,如http://127.0.0.1:8080/webAppName(项目工程名字)。将后台路径转化为绝对路径的工作由服务器完成。其作用是标识该资源在服务器中的路径,以便客户端能够按照这个设定路径来查找相应的资源,即标识
    •   特例:response.sendRedirect()。若其参数路径为以斜杠开头相对路径,那么这个后台路径是个特例。这是由sendRedirect()的本质决定的:该方法可以跳转到其它项目的资源,所以这个后台路径的参照路径为当前web服务器的根目录。(可以使用request.getContextPath()获取路径。)只有这种重定向的以斜杠开头的相对路径是特例,其它重定向遵循路径转化定理。
  • 以名称开头的相对路径(其实是省略了 ./)
    • 无论是出现在前台还是后台,其参照路径都是当前访问路径的资源路径(倒数第一个斜杠/前面的路径)。即使是response.sendRedirect()方法的参数路径,若不以斜杠开头,其也属于以路径名称开头的相对路径,参照路径为当前访问路径的资源路径。web.xml中Servlet的配置<url-pattern></ url-pattern >中的路径只能是以斜杠开头的相对路径,因为它根本不是请求,只是起标识作用,故没有资源路径。

  建议使用以斜杠开头的相对路径,这样的话参考路径固定了,会避免很多不必要的错误。上面说的不懂,没关系,下面结合例子来说:

  首先,我把pages目录下的index.html设置为欢迎页面,项目结构忘记了的看上面哦!

  

 我在index.html中插入如下标签:
  
 
启动服务器,发现第一张图片路径是无效的,剩下两张图片路径有效。点击超链接进入第二页。

  

  成功跳转,来到第二页后,点击返回首页。

  

   回到首页后,你会发现,第一张图片原本路径无效的,现在反而有效了;第三张图片原本路径有效的,现在反而无效了。之后反复切换,三张图片的状态保持不变。

   

  

  这其实就是欢迎页面在作怪!项目启动时,浏览器访问webApplication context(http://localhost/pathTest/),此时会进行请求转发,就近访问在web.xml中配置的欢迎页面。由于是请求转发(服务器端跳转),url地址栏看上去没变化,实际上你访问的是pages目录下的index.html(我们设置的欢迎页面)。但是,浏览器是根据目前地址栏(你所看到的)来定位资源的。

下面使用浏览器的调试工具查看各图片的路径访问情况(按F12)

  图片1引用路径: ../images/test.jpg

  图片2引用路径: /pathTest/images/test.jpg

  图片3引用路径: images/test.jpg

因为我们设置应用上下文为:/pathTest,所以项目启动时访问http://localhost/pathTest/,tomcat默认你的在web根目录下有一个index.html或者jsp等等欢迎页面,所以我们启动项目第一次访问首页时,其实,

url地址栏是http://localhost/pathTest/index.html或者http://localhost/pathTest/index.jsp(即使它不存在,执着的tomcat......)

此时进行请求转发,访问http://localhost/pathTest/pages/index.html,但是你看到的地址栏仍然是http://localhost/pathTest/。

分析图片1:参考路径:http://localhost +  相对路径:/images/test.jpg  = http://localhost /images/test.jpg,路径错误了(缺少项目名称),故自然无法访问。

分析图片2:参考路径:http://localhost  +  相对路径:/pathTest/images/test.jpg  = http://localhost /pathTest/images/test.jpg,路径正确,可以访问。

分析图片3:参考路径(资源路径):http://localhost/pathTest  +  相对路径:/images/test.jpg  = http://localhost /pathTest/images/test.jpg,路径正确,可以访问。

当我们进入第二页再返回首页时,浏览器的地址栏是  http://localhost/pathTest/pages/index.html

分析图片1:参考路径:http://localhost  +  相对路径:/pathTest/images/test.jpg  = http://localhost/pathTest/images/test.jpg路径正确,可以访问

分析图片2:参考路径:http://localhost  +  相对路径:/pathTest/images/test.jpg  = http://localhost /pathTest/images/test.jpg,路径正确,可以访问。

分析图片3:参考路径(资源路径):http://localhost/pathTest/pages/  +  相对路径:/images/test.jpg  = http://localhost/pathTest/pages/images/test.jpg,路径错误,无法访问。

图片1这里有个地方有点玄,解析一下:在第一次访问首页时,我们可以认为浏览器地址栏是:http://localhost/pathTest/index.html(tomcat假设存在index.html),这个假想的index.html所在的目录是pathTest,它的上一层目录为服务器根目录了,这时在服务器根目录下访问images/test.jpg便会出错。

我们可以做个小实验检验一下:把tomcat的应用上下文(application context)设置为空(默认配置,一个tomcat只装一个web项目,服务器根目录也就是web应用根目录,直接访问http://localhost即可访问web项目pathTest),重启服务器。

此时图片1可以正常访问,图片的访问路径是:http://localhost/images/test.jpg

此时我们可以认为地址栏为:http://localhost/index.html,此时无论这个假想的index.html怎么返回上一级目录,它还是只能呆在http://localhost(也是web应用根目录),而我们的web项目下是存在images/test.jpg的,所以图片可以正常访问。

这样我们就知道为什么欢迎页会导致图片访问出错了,怎么样,是不是有种一本正经的胡说八道的赶脚?其实,相对路径是没有没有万能的写法的,主要是服务器配置好了以后,才有一种相对稳定的写法(以斜杠开头,以根目录为参考路径,这也是为什么推荐这种写法的原因),才有继续讨论的意义。

转载于:https://www.cnblogs.com/Libinkai/p/9376353.html

相关文章:

关于Page翻页效果--Page View Controller

Page View Controllers你使用一个page view controller用page by page的方式来展示内容。一个page view controller管理一个self-contained视图架构。这个架构的父视图由page View controller管理&#xff0c;并且子视图由你提供的view Controllers管理。一&#xff0c;解析Pag…

linux平台下QtCreator中集成Valgrind系列工具

linux平台下QtCreator中集成Valgrind系列工具 ###1、valgrind 安装 valgrind 安装 2、打开QtCreator >> Analyze 你就会发现 这里已经有valgrind的相关选项了 如果没有的话&#xff0c; 在help >> about plugin >> C 中勾选 如图: 点击则可以直接运行…

python输入参数改变图形_Python基于Tensor FLow的图像处理操作详解

本文实例讲述了Python基于Tensor FLow的图像处理操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在对图像进行深度学习时&#xff0c;有时可能图片的数量不足&#xff0c;或者希望网络进行更多的学习&#xff0c;这时可以对现有的图片数据进行处理使其变成一张新的…

CSS层叠样式

为了让网页元素的样式更加丰富&#xff0c;也为了让网页的内容和样式能拆分开&#xff0c;CSS由此思想而诞生&#xff0c;CSS是 Cascading Style Sheets 的首字母缩写&#xff0c;意思是层叠样式表。有了CSS&#xff0c;html中大部分表现样式的标签就废弃不用了&#xff0c;htm…

windows下 Source Monitor代码度量工具的使用

windows下 Source Monitor代码度量工具的使用 引用链接: https://www.cnblogs.com/xuehanyu/p/4520965.html 1.总体介绍 SourceMonitor是一款免费的软件&#xff0c;运行在Windows平台下。它可对多种语言写就的代码进行度量&#xff0c;包括C、C、C#、Java、VB、Delphi和HT…

MVVM 数据绑定

一、在 XAML 中创建绑定 定义源对象。 C# public class Dog {public string DogName { get; set; } }在 XAML 中创建对源对象的命名空间的引用。 XAML <UserControl x:Class"BindingXAML.Page" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/pres…

linux配置文件怎么把某行后几个字符替换_vim(Linux运维)

一、vim使用介绍 介绍在linux系统中&#xff0c;大部分配置文件都是ASCII的纯文本形式存放的&#xff0c;所以我们在修改系统设置的时候使用简单的文本编辑软件就可以实现了&#xff0c;如果你使用过windows当中的word的话&#xff0c;那么你可能会感觉linux字符界面的文本编辑…

Debian 6.0 安装过程 及中文乱码

2019独角兽企业重金招聘Python工程师标准>>> Debian 6.0 安装过程 Debian 6.0 安装过程 转(一个别人自录的安装过程录相) http://v.youku.com/v_show/id_XMjUyMzY1OTIw.html 转(别人写的一个过程) http://hi.baidu.com/ljx_freebsd/blog/item/88d60c09da379da22edd…

git 提交丢失Warning, you are leaving 2 commits behind,

早上在自己的一个版本代码上编辑&#xff0c;提交commint&#xff0c;但是checkout到其他分支再checkout回来发现该的东西不见了&#xff0c; 幸好terminal还没有关掉&#xff0c;回看日志&#xff1a; Warning: you are leaving 2 commits behind, not connected toany of you…

一台支持vlan管理的交换机_关于交换机的VLAN技术你了解多少?

VLAN&#xff08;虚拟局域网&#xff09;是对连接到的第二层交换机端口的网络用户的逻辑分段&#xff0c;不受网络用户的物理位置限制而根据用户需求进行网络分段。一个VLAN可以在一个交换机或者跨交换机实现。VLAN可以根据网络用户的位置、作用、部门或者根据网络用户所使用的…

需要反射时使用dynamic

//使用dynamic的写法 dynamic fileExplorerData _currentFolder.FileExplorerData; var data fileExplorerData.InsertFromPath(newPath);//使用反射的写法 MethodInfo InsertMethod _currentFolder.FileExplorerData.GetType().GetMethod("InsertFromPath"); var…

Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy

Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy 原文连接: https://blog.csdn.net/wsj18808050/article/details/79824619 内容&#xff1a; QtCreator在前几天发布了4.6.0的版本&#xff0c;增加了两个非常棒的新功能&#xff0c;分别是Clang-Tidy和Clazy 官方…

JAVA swing初级教程(四)

附加的swing小部件(下) JOptionPane JOptionPane 是在 Swing 中类似“快捷方式”的东西。通常&#xff0c;作为 UI 开发人员&#xff0c;您需要向用户呈现快速信息&#xff0c;让用户了解错误和信息。甚至可能想得到一些快速数据&#xff0c;例如名称或数字。在 Swing 中&#…

Akka源码分析-Remote-发消息

上一篇博客我们介绍了remote模式下Actor的创建&#xff0c;其实与local的创建并没有太大区别&#xff0c;一般情况下还是使用LocalActorRef创建了Actor。那么发消息是否意味着也是相同的呢&#xff1f; 既然actorOf还是委托给了LocalActorRef&#xff0c;那么在本地创建的Actor…

用sed 给文本文件加行号

看例子&#xff1a; [rootlocalhost tmp]# sed test.txt 1 tsttst tsttsttst 2 west gao 3 west abces [rootlocalhost tmp]# sed test.txt | sed N;s/\n/\t/ 1 tsttst tsttsttst 2 west gao 3 west abces [rootlocalhost tmp]# N的解释&#xff1a; N&am…

Qt 编译一直死循环问题

Qt 编译一直死循环问题 有时候Qt编译项目时&#xff0c; 一直编不过&#xff0c;查看一下编译窗口&#xff0c;发现一直在循环 输出如下: C:\soft\Qt5.11\5.11.1\mingw53_32\bin\qmake.exe -o Makefile ..\..\..\..\PalmQtLib\PalmQtLib\PalmQtLib.pro -spec win32-g "…

路由器运行python脚本_写个Python脚本来登录小米路由器

这个脚本写起来难度并不是很大&#xff0c;博主还是一步步的分析下&#xff0c;这样思路会比较清晰&#xff0c;下次遇到类似系统脚本写起来也更快速。好了&#xff0c;一起来分析分析。首先看下小米路由器的登录界面可以看到只需要输入密码即可登录&#xff0c;博主这里为了演…

PHP定时执行任务的实现

2019独角兽企业重金招聘Python工程师标准>>> ignore_user_abort();//关掉浏览器&#xff0c;PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $interval60*30;// 每隔半小时运行 do{//这里是你要执行的代码 sleep($i…

Spring事务管理 与 SpringAOP

1&#xff0c;Spring事务的核心接口 Spring事务管理的实现有许多细节&#xff0c;如果对整个接口框架有个大体了解会非常有利于我们理解事务&#xff0c;下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略。   Spring事务管理涉及的接口的联系如下&#xff1a; 1.…

iso镜像文件烧写到U盘

iso镜像文件烧写到U盘 windows rufus-3.1.exe 百度云盘链接&#xff1a;https://pan.baidu.com/s/16p1O4lXMVTUltTvCm0DnHA 提取码&#xff1a;inzj 文件格式一般选择默认的就行,如果起不来,就换一个, linux 1、dd命令 2、系统自带 usb-creator-gtk工具 命令行输入&#x…

webgl 游戏_30个令人惊叹的WebGL示例和演示

WebGl仍在增长&#xff0c;尽管大多数现代浏览器都支持它&#xff0c;但它也可能需要在旧的浏览器上工作。在本文中&#xff0c;我遇到了很多WebGL的示例和演示&#xff0c;它们可以增进您对这项新技术的理解。因此&#xff0c;请坐下来放松身心&#xff0c;使用最新的浏览器&a…

IE8下的VML显示问题解决方案

最近在维护一个使用VML画曲线的网站&#xff0c;在不同的IE下浏览效果不一样&#xff0c;特别是在IE8下&#xff0c;出现莫名其妙的样式显示问题&#xff1a; 1.曲线不可见&#xff01;在IE9或IE7下&#xff0c;曲线正常绘制&#xff0c;但是在IE8下&#xff0c;不见坐标轴和曲…

创新工场有哪些失败项目?不要只看着成功

创新工场有哪些失败项目&#xff1f;不要只看着成功 李开复 &#xff0c;创新工场CEO回答&#xff1a;失败或碰到挑战的项目也不少。这里不点名&#xff0c;不谈细节&#xff0c;但是谈谈碰到什么挑战&#xff08;有些已经失败&#xff0c;有些还在努力&#xff09;&#xff1a…

彻底解决Linux索引节点(inode)占用率高的告警

今天邮箱里发现有一封某服务器inode使用率发生告警的邮件 登录到服务器上df -i查看&#xff0c;发现/路径下91%&#xff0c;磁盘使用率却不高&#xff0c;猜测可能是某个目录下的小文件过多&#xff0c;进而造成inode占用率过高&#xff0c;但不清楚根路径下各文件夹里的文件数…

镜像打包工具clonezilla

镜像打包工具clonezilla clonezilla 百度云盘链接&#xff1a;https://pan.baidu.com/s/1LOEPqNE9O0Z4QJmNExlgeA 提取码&#xff1a;zlso 使用方法&#xff1a; 1、将镜像直接烧入U盘 2、U盘启动

python数据分析设置_Python 数据分析系列之如何安装和设置 Python

由于人们用 Python 所做的事情不同&#xff0c;所以没有一个普适的 Python 及其插件包的安装方案&#xff0c;接下来我将详细介绍各个操作系统上 Python 科学计算环境部署。我推荐免费的 Anaconda 安装包&#xff0c;Anaconda 提供 Python 2.7 和 3.6 两个版本&#xff0c;以后…

javamail gmail

http://www.programfan.com/club/showpost.asp?id27614转载于:https://www.cnblogs.com/yqskj/archive/2013/01/11/2855715.html

robots.txt文件的解析及过滤

什么是robots.txt文件? robots.txt&#xff08;统一小写&#xff09;是一种存放于网站根目录下的ASCII编码的文本文件&#xff0c;它通常告诉网络搜索引擎的漫游器&#xff08;又称网络蜘蛛&#xff09;&#xff0c;此网站中的哪些内容是不能被搜索引擎的漫游器获取的&#xf…

CF949C Data Center Maintenance(建图+强联通分量)

题意 有 n 个信息中心&#xff0c;第 i 个信息中心要在第 ti 个小时维护&#xff0c;维护期间信息不能被获得。 每个用户的数据都有两份备份&#xff0c;第 i 个用户的数据放在信息中心 c(i,1) 和 c(i,2)。 现在要挑选一个尽量小的信息中心集合&#xff0c;使得将这个集合的维护…

fabric 启动peer_编写 Fabric 链码的一般准则

我相信智能合约(链码)是 Hyperledger Fabric 区块链网络的核心。正确开发链码可以真正发挥一个安全区块链的优势&#xff0c;反之则会带来灾难性的后果。在这篇文章里我不打算探讨 Hyperledger Fabric 链码设计的特定模式的好与坏&#xff0c;而是希望分享我在开发若干 Hyperle…