A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 大山哥哥 于 2018-11-26 22:33 编辑

        在web项目的编写中,我们会遇到很多地方需要写资源路径:文件路径、Servlet访问路径……等。而很多同学对路径的编写很迷惑,感觉怎么写都行,又感觉怎么写都不对。在此我们针对web中的路径做一下比较和总结,让你编写路径时不再出错。
        首先,在大类上进行划分,我们在web中使用的路径分成以下两种:相对路径和绝对路径。而下面我们分别对这两种路径进行介绍。
        相对路径,顾名思义,路径表示的是相对位置,那么最需要搞明白的就是相对位置相对的是谁。在web中的相对路径中,相对指的是当前资源的URL和目标资源的URL的相对关系。而这种关系用这两种符号表示——“./”代表当前目录。当然,表示当前目录时,目录中的“./”是可以省略的,也就是什么都不写就是当前目录中寻找;而“../”代表的是上一级目录,也就是当前目录的父目录。光说会比较抽象,我们举个例子来说明。
        在下图中,假设有两个资源,一个是一个jsp页面,访问的路径是http://localhost:8080/test/aaa/test.jsp。另一个是ServletDemo1,访问的路径为http://localhost:8080/test/ServletDemo1。如果我们现在在访问test.jsp时需要从test.jsp跳转到ServletDemo1中,使用相对路径应该怎么写呢?
        首先,我们说了,相对路径是URL的相对关系。所以我们不用关心Servlet的java文件存在哪里,也不用管jsp存在哪个地方。直接看URL,jsp的路径是http://localhost:8080/test/aaa/test.jsp,所以它的当前目录为“/test/aaa”。而目标资源ServletDemo1的URL是http://localhost:8080/test/ServletDemo1,Servlet的目录为“/test”,所以很容易看出从jsp的位置往上找一级目录才能找到test,才能访问到ServletDemo1。所以在jsp中应该写“../ServletDemo1”才能正确访问,如图。

        我们学会了相对路径的编写了,但是你应该听说过不推荐使用相对路径。为什么呢?答案是使用相对路径需要考虑相对位置,所以路径编写麻烦。而且使用相对路径有一个无法用技术手段修复的BUG。下面我们看看是什么问题。

        假如从ServletDemo1中转发跳转页面到test.jsp,然后在test.jsp中如果编写了相对路径“./test2.jsp”,本意是想要访问“/test/aaa/test2.jsp”。现在转发过来之后我们看看是什么情况。由于转发时地址栏不会发生变化,所以虽然访问了ServletDemo1转发后显示的页面内容是test.jsp中的,但是浏览器还是认为URL是http://localhost:8080/test/ServletDemo1,所以在页面中编写的“./test2.jsp”实际上被浏览器理解为了“/test/test2.jsp”,也就是本来该在aaa中查找的资源变成了到test中查找了,所以肯定会找不到资源导致页面错误。
        小结:相对路径指的是URL的相对关系,但是可能会在转发时出现页面资源路径错误的情况。
        我们再来看看绝对路径,绝对路径就是无论你在哪一层路径中,找到目标资源的路径写法都一样。一般绝对路径以“/”开头。不过,绝对路径虽然好写,但是它也分成两种情况——客户端路径和服务器端路径。
        客户端路径和服务器端路径在写法上的表示就是客户端路径编写时需要以项目的虚拟目录开头编写,而服务器端路径必须省略项目的虚拟目录。那么怎么判断该使用客户端路径还是服务器端路径呢?这个也很简单,就看路径在哪被使用。如果路径在客户端被使用,那就是客户端路径,否则就是服务器端路径。下面我们举例说明:
        在Servlet中重定向时,一般这么编写代码:response.sendRedirect("/test/aaa/test.jsp");这个地方的路径如果用绝对路径编写,我们看一下是那一端的路径。重定向是向浏览器返回响应,然后让浏览器根据响应回来的URL重新发送请求。所以这个路径是在浏览器重新发送请求时用到的,也就是在客户端被使用的,所以这个路径是客户端路径,编写时需要添加项目的虚拟路径/test开头。
        如果是在Servlet中转发,一般这么编写代码:request.getRequestDispatcher("/aaa/test.jsp").forward(request,response);这个地方的路径如果用绝对路径编写,我们看一下是那一端的路径。转发时在服务器内部的跳转行为,在客户端根本感知不到,所以这个路径是服务器使用的,也就是服务器端路径,编写时省略项目虚拟目录,不用以/test开头。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马