今天讲解Web路径问题

看这篇需要的前置知识如下,可以看我之前整理的笔记^_^:

JavaWeb笔记整理——HTML、CSS、JavaScript_html css java-CSDN博客

JavaWeb开发笔记图解整理(二)——XML、Tomcat、Servlet_在浏览器输入两个网址访问到servlet-CSDN博客

如果如果您Java基础还没有通关的话,我这还有一本秘籍:

 JavaSE笔记_i_Water_boy的博客-CSDN博客

那我们开始吧——


一、Web工程路径问题引出

我们在编写web页面的时候,提交表单到servlet的时候,我们会在action属性中进行web资源的指定:

java 查看默认xmx_Web

其次,如果我们想要通过相对路径在一个html文件访问到另一个html文件,我们写的路径可能会比较长,看这个文件结构

java 查看默认xmx_java 查看默认xmx_02

java 查看默认xmx_笔记_03

那么在编写路径的时候就会写的非常长,很麻烦。

../ 表示返回上一级目录 

java 查看默认xmx_笔记_04

 所以为了解决以上问题,我们引出Web工程路径解析技术。(说白了就是更简单的方式来写)

二、浏览器的默认解析路径

当我们在浏览器上访问了一个web资源时,当我们访问下一个web资源时,如果我们直接在action或者servlet的地址栏中填写这个web资源,浏览器会根据上一个web资源的路径为基准,来访问这个新的web资源。

说这么多还是有些模糊,我画个图:

java 查看默认xmx_java 查看默认xmx_05

当我们访问login.html时,浏览器栏上是这样显示的:

http://localhost:9000/projectPath/a1/b1/c1/d1/login.html

java 查看默认xmx_笔记_06

我们如果在action栏中直接填写一个web资源,而不是写全其完整的路径,那么浏览器就会根据当前浏览器上的web资源的路径访问: 

java 查看默认xmx_html_07

现在提交表单:

java 查看默认xmx_笔记_08

可以看到,我们虽然只填写了一个check,但是浏览器最终访问的却是http://localhost:9000/projectPath/a1/b1/c1/d1/check

这就是我在开头讲的浏览器会根据上一个web资源的路径为基准,来访问这个新的web资源。

login.html的路径是http://localhost:9000/projectPath/a1/b1/c1/d1/,所以我们在只写一个action =“check”的时候,浏览器就会直接从/d1这个文件夹访问check这个Servlet资源。

java 查看默认xmx_笔记_09

知道了浏览器的这个特性以后我们可以让路径更节俭一些,但是这也仅限于两个资源同时在一个目录下,才比较好用。

下面介绍另一种方式。

三、“/” 解析成http://localhost:port

我们在配置Tomcat的时候,会配置Application context路径,一般也和我们的工程名一致,所以这个路径也可能被叫做工程路径

java 查看默认xmx_html_10

java 查看默认xmx_服务器_11

我们在访问任何web资源时,在localhost:9000 后面都要添加这个工程路径。

java 查看默认xmx_Web_12

 我们在html页面中的action属性中,可以快速的访问这个工程路径。就是用一个 "/工程路径" (斜杠)。

我们把刚才的例子改一下,在action属性中写入/projectPath/check(带上斜杠):

java 查看默认xmx_服务器_13

提交表单:

java 查看默认xmx_html_14

可以看到我们成功的访问到了这个servlet,这就可以说明一个要点:

action 中可以把第一个 “/” 解析成 http://localhost:9000/

所以我们在action中写 /projectPath 就会访问 http://localhost:9000/projectPath

然后我们再加一个/check就可以访问我们编写的servlet(这里的/check 的 / 不会被解析为http://localhost:9000/ 因为不是第一个 / 

四、“/”在浏览器解析和服务器解析

"/"在浏览器和在服务器解析是不一样的,如果单独一个"/"在浏览器中被解析,那么就会被解析为http://localhost:port/   但如果"/"是在服务器中被解析的,那么“/”则会被解析为http://localhost:port/工程路径/

而什么时候是被浏览器解析的而什么时候又是被服务器解析的呢?

什么时候是被浏览器解析的?

  • 当你在HTML中使用<a href="/path"><img src="/path"><link href="/path">等标签时,路径是由浏览器解析的。
  • 当你在JavaScript中使用window.location.href = "/path"fetch("/path")时,路径也是由浏览器解析的。

什么时候是被服务器解析的?

  • 当你在服务器端代码中使用路径来定位文件或资源时,例如在Java的Servlet中使用request.getRequestDispatcher("/path"),路径是由服务器解析的。
  • 当服务器处理请求时,它会根据请求的URL来解析路径,并将其映射到服务器上的资源。例如,http://localhost:8080/yourApp/path在服务器端可能会映射到/yourApp/path

特别注意:请求重定向是由浏览器进行解析的response.sendRediect("/");

这里的/ 会被解析为:http://localhost:port/

五、问题解决

根据以上的两个方式,我们就可以轻松的访问view.html这个资源了:

请你来尝试写出如何在login.html的action中访问到view.html资源

java 查看默认xmx_笔记_15


答案:

java 查看默认xmx_Web_16

这样是不是比之前访问方式更好一些,这样就不用计算相对路径有多少文件夹了,直接访问即可。