今天讲解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资源的指定:
其次,如果我们想要通过相对路径在一个html文件访问到另一个html文件,我们写的路径可能会比较长,看这个文件结构
那么在编写路径的时候就会写的非常长,很麻烦。
../ 表示返回上一级目录
所以为了解决以上问题,我们引出Web工程路径解析技术。(说白了就是更简单的方式来写)
二、浏览器的默认解析路径
当我们在浏览器上访问了一个web资源时,当我们访问下一个web资源时,如果我们直接在action或者servlet的地址栏中填写这个web资源,浏览器会根据上一个web资源的路径为基准,来访问这个新的web资源。
说这么多还是有些模糊,我画个图:
当我们访问login.html时,浏览器栏上是这样显示的:
http://localhost:9000/projectPath/a1/b1/c1/d1/login.html
我们如果在action栏中直接填写一个web资源,而不是写全其完整的路径,那么浏览器就会根据当前浏览器上的web资源的路径访问:
现在提交表单:
可以看到,我们虽然只填写了一个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资源。
知道了浏览器的这个特性以后我们可以让路径更节俭一些,但是这也仅限于两个资源同时在一个目录下,才比较好用。
下面介绍另一种方式。
三、“/” 解析成http://localhost:port
我们在配置Tomcat的时候,会配置Application context路径,一般也和我们的工程名一致,所以这个路径也可能被叫做工程路径
我们在访问任何web资源时,在localhost:9000 后面都要添加这个工程路径。
我们在html页面中的action属性中,可以快速的访问这个工程路径。就是用一个 "/工程路径" (斜杠)。
我们把刚才的例子改一下,在action属性中写入/projectPath/check(带上斜杠):
提交表单:
可以看到我们成功的访问到了这个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资源
答案:
这样是不是比之前访问方式更好一些,这样就不用计算相对路径有多少文件夹了,直接访问即可。