路径
从一个点到另一个点的过程称为路径。
从一个起点到某个具体资源的过程称为访问路径,访问路径的最后一个斜杠(/)后面的是资源名称。
绝对资源路径是从起点http://开始到某个具体资源的前面的最后一个”/”结束的路径。
绝对访问路径:https://localhost:8080/blog/csdn/net/index.jsp
绝对资源路径:https://localhost:8080/blog/csdn/net/
资源名称:index.jsp
相对访问路径:/csdn/net/index.jsp
相对资源路径:/csdn/net/
绝对访问路径(URL)=绝对资源路径+资源名称
相对访问路径=相对资源路径+资源名称。
有相对访问路径就有参考路径,参考路径的前半部分一定是https://localhost:8080/。
绝对访问路径=参考路径+相对访问路径。
把访问路径是否可以独立完成资源准确定位的 作为判别标准,可以将路径分为绝对访问路径和相对访问路径。
绝对访问路径:给定的访问路径可以准确的定位到资源
相对访问路径:必须结合参照路径才能实现资源的定位
下面所说的相对路径都是指相对访问路径。
(1)以”/”开头的相对路径,开头的”/”表示根路径
a.前台路径
邮浏览器解析执行的代码中所包含的路径(出现在 css js html jsp 的路径就叫前台路径,因为浏览器访问服务器资源时会把css,js,html,jsp文件缓存到浏览器中,然后进行渲染,所以请求是从浏览器端发出的,自然由浏览器解析)(127.0.0.1=localhost=本机地址)
前台路径的参照路径是 web服务器的根路径
即:http://127.0.0.1:8080/,根路径下是多个项目。参考tomcat服务器,则根路径http://127.0.0.1:8080/ 代表webapps目录。
所以相对路径中开头的”/”即表示:http://127.0.0.1:8080/
转换工作由浏览器完成
b.后台路径
是由服务器解析执行的代码文件中所包含的路径(java 代码 ,jsp 文件中的动态部分,xml)
后台应用的参照路径是项目的根路径:
http://127.0.0.1:8080/项目名称/
所以相对路径中开头的”/”即表示:http://127.0.0.1:8080/项目名称/
可以看出,由服务器解析的根路径比由浏览器解析的多出一个”项目名称”节点,因为一个项目的根节点自然是这个项目的名称嘛。
(2)以路径名称开头的相对路径
路径名前面的空白是缺省的该资源文件的参照路径。除了请求转发外,其他的路径跳转方式的参照路径都是其绝对资源路径,不管是浏览器解析还是由服务器解析。
response 的sendRedirect() 方法可以完成重定向,其意思是让浏览器按照其指定的路径重新发一次请求,所以显然里面的路径自然由浏览器来解析,是前台路径。其参数路径开头的”/”表示当前web服务器的根。故此,此方法不仅仅可以实现在项目内部资源的跳转,还可以实现在实现在项目之间的跳转。
可以这样访问当前项目的其他资源:
response.sendRedirect(request.getContextPath()+”/otherServlet”);
总结:
1、如果使用多次”../”,最多返回至根目录。
如果是由浏览器解析,则最多返回到web服务器的根目录所在的路径,比如tomcat中的”…./webapps/”。
如果是由服务器解析,则最多返回到项目的根目录”webapp/”所在的路径,对应于发布后的路径”…./项目名/”,因为在服务器中不可能跳出该项目的范围。
项目发布后的路径中的节点 “项目名称” 对应于未发布前的webapp(WebRoot,WebContent)目录。
2、请求转发request.getRequestDispatcher(“路径名”).forward(request,response)中的路径一定是由服务器进行解析,因为它是在Java代码中。如果请求的资源文件中进行了转发,则在下一个资源文件中,由浏览器解析的路径的参照路径是上一个资源文件的参照路径,以此类推。
3、和浏览器解析不同,不管是请求转发还是其他的资源文件之间的跳转,由服务器进行解析的路径的当前路径(参照路径)一定是该文件的绝对资源路径。
4、除了请求转发,好像其他所有的路径跳转都是由浏览器来解析。
**5、**web.xml中的标签包含的是一个相对访问路径,它的参照路径是项目的根路径”…./项目名/”,对应于项目结构的”webapp”目录,可以把多重文件夹里的页面作为首页。该标签的原理利用了请求转发,当客户端请求该项目,也就是我们经常输入项目名来访问该项目的首页时,请求来到了该项目的根目录”/项目名”,即当前的参照路径是根目录,随后标签转发该请求到其包含的资源文件,该路径名是由服务器解析的,所以服务器找到了标签中包含的资源文件返回给浏览器。由于是转发,所以有浏览器解析的当前路径仍然保留在项目的根路径,所以我们看到浏览器的地址栏中的路径是项目的根路径。
**6、**src下的资源全都放在了WEB-INF目录下的classes文件夹里,WEB-INF目录下的文件只有服务器端才可以访问,之所以能够直接访问WEB-INF目录下的action或controller,是因为已经在配置文件中(Servlet或者DispatcherServlet)对请求进行了映射处理。映射后的当前路径是action(controller)所在的绝对资源路径,action(controller)是直接放在根目录下面的,即它的当前路径是(…/项目名/)
(猜的,因为我们可以在浏览器的地址栏中直接输入项目名+具体的action访问该action,并且action的父级目录只能是项目名目录,此外在action中以相对路径的方式访问项目中其他资源文件时的参照路径是项目根目录。可是action不是放在WEB-INF下的class文件夹里的吗?WEB-INF文件夹到底是怎样的一个特殊文件夹?)。
7、既然无法从外面直接获取WEB-INF文件夹中的资源,那么WEB-INF文件夹中的资源可以以相对路径的方式访问WEB-INF文件夹外面的资源吗?
答案是可以的。既可以通过服务器解析跳转也可以通过浏览器解析跳转,通过服务器解析跳转就不说了,根据绝对资源路径;通过浏览器解析路径跳转时的当前路径是项目的根目录所在的路径(可能跳转到该资源的方式是请求转发,所以保留了原来的参照路径),和action一样似乎都是直接放在根目录下,但是它不像action可以直接从浏览器端访问,应该是没有进行映射的原因。总之,它能
以浏览器解析的方式跳转出WEB-INF目录,但不能以浏览器解析的方式跳转进WEB-INF目录,只能通过请求转发(服务器解析)或者action跳转进来。