JSP页面中相对路径与绝对路径详解,了解JSP开发中 '/' 的含义

博主最近写项目时,碰到很多<a href="URL">,<form action="URL">,<jsp:include page="URL"/>等关于URL路径的填写。也出现了不少错误,所以有如下总结,都经过博主的代码认证,若有疑问的小伙伴,可以先自行认证,然后提醒博主修改

那么对URL来说,我们都知道有相对路径和绝对路径,这个博主不打算解释,因为实际上我们经常用相对路径,相信大家在用相对路径时,可能会出现一个疑问,什么时候用 '/'作为URL的开头,什么时候不用,例如可能你写某一个URL时,会写成<a href="/user/userInfo.jsp"> 也可能你会想,为什么不用<a href="user/userInfo.jsp>呢? 那么下文将告诉大家‘/’字符在不同情况下的用法所在

博主是思路是这样的,我们将 '/' 的处理分成两个部分(以下都是针对相对路径):

①客户浏览器对 '/' 的处理

②web服务器对 '/' 的处理

1.客户浏览器对 '/' 的处理

   首先,什么是客户浏览器对 '/' 的处理(这个概念博主自己提出来的,不是很官方,但便于博主的解释,继续看下去的话,大家应该能理解博主的本意),对于<a href="URL"> <form action="URL"> 还有response.sendRedirect(String URL)等,这些都可以说是客户浏览器对 '/' 的解析,因为这些都是需要客户浏览器发送一遍http请求去请求页面。这一点很重要,为了不把问题复杂化,我们举一个小例子:

现在用户访问了localhost:8080/WebTest/index.jsp  该页面中有一个<a href="/user/userInfo.jsp">A1</a>,还有一个<a href="user/userInfo">A2</a>,很明显A1和A2的区别就是最前面有没有'/',经过测试,我们会发现,当点击A1时,跳转到的新页面的地址栏中的内容显示为"localhost:8080/user/userInfo.jsp",而点击A2时,浏览器中地址栏中的内容显示为“localhost:8080/WebTest/user/userInfo.jsp”,A2为什么会是这样 ,相信大家都能懂,因为是相对于index.jsp而言的。对于A1,我们也不难发现,加入'/',就是相当于把URL的内容直接加到localhost:8080后面了。经过博主的测试,上述提到的,如<a><form>,response.sendRedirect()都是采取这样的方式的。相信大家肯定使用过response.sendRedirect(request.getContextPath+"某某.jsp"),现在大家也可以去试试改成response.sendRedirect("/web项目名/某某.jsp"),然后在同上述分析,帮助理解,记住项目名前面要有'/'

2.web服务器对 '/' 的处理(将 '/' 当做web项目的根路径):

同上,web服务器对 '/'的处理出现在jsp中使用<jsp:include page=""/> <jsp:forward page=""> <%@include file="">和request.getRequestDispatcher(String path)等,为什么?因为这些都是要告诉服务器页面在哪!那么根据上面的想法,我们在不浪费篇幅的前提下,直接说明 '/' 的含义,

2.1 在此处如果加入 '/',则web服务器认为你是想从/web项目名下出发,比如我们用了/user/userInfo.jsp,即web服务器认为你要访问的是/web项目名/user/userInfo.jsp。

2.2 如果没加 '/' ,就是相对当前文件url的位置,这个相对当前文件url位置怎么理解呢,比如现在index.jsp文件的url是:localhost:8080/web项目名/index.jsp,没加 '/' ,web服务器认为userInfo文件是在与index.jsp同级目录的user目录下的。即localhost:8080/web项目名/user/userInfo.jsp。说到这里,可能有人会觉得博主太废话了,这不就是相对index.jsp吗。

2.3接下来,博主要说的是在Servlet和Filter中使用request.getRequestDispathcer(String path)的情况,因为Servlet和Filter都是放在src中的,那么加不加 '/' 的结果到底是怎样。‘/’对于这两者的情况一致,博主就拿Servlet来说明。 我们都知道,Servlet和Filter都需要配置,假设Serlvet的urlPatterns={"/test.lol"},那么我们访问该Servlet的url地址肯定是:localhost:8080/web项目名/test.lol,那么此时如果Servlet中有request.getRequestDispatcher("index1.jsp").include(request,response)和request.getRequestDispatcher("/index2.jsp").include(request.response)的话,web服务器为作何解释,其实也很简单,index1.jsp也解释为相对路径,因为Servlet访问路径为.../web项目名/text.lol,所以index1.jsp就解释为.../web项目名/index.jsp,而/index2.jsp,web服务器会将index2.jsp转化为..../web项目名/index2.jsp,在这里,/相当于web项目的根路径,看似结果差不多,如果读者有兴趣,可以修改Servlet的urlPatterns,比如改成 "/servlet/text.lol",然后再按上述想法去调试,相信大家会有很大收货的。

       通过上面,我们不难发现,服务器处理 ‘/’  其实就是根据当前jsp,Serlvet,Filter文件对应的url来处理的,开头有 '/' 服务器就直把这个url加到/web项目名后面,否则,就根据相对路径(是指文件对应的url相对路径)来计算了,而客户浏览器处理 '/' 就是把url加到localhost:8080后面,否则,也根据相对路径来算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值