这篇文章是小编一直想写的一篇,主要是对web阶段中各个路径进行的一些总结,希望读者看过之后对于路径方面有一个清晰的认识。首先声明一点:世界上一切东西都是相对的,对于这点而言,相信大家并不陌生,从初中开始我们就接触了物体的相对运动,由于这篇文章是针对于WEB阶段来讲的,所以以下绝对路径和相对路径都是针对于整个互联网而言的。

客户端路径

是指运行在浏览器上的路径。比如:表单、超链接、js(location.href)、Ajax(url)、CSS和JS的引入以及重定向等。路径分为绝对路径和相对路径,相对路径又分为相对主机的路径和相对于当前请求的路径。干说没用,举例如下:

  例1:假设a.html的路径为: http://localhost:8080/hello/pages/a.html 。a.html的内容如下:

<a href="http://localhost:8080/hello/pages/b.html">绝对路径</a>

<a href="/hello/pages/b.html">相对于主机的路径</a>

<a href="b.html">相对于请求的路径</a>

  绝对路径(以协议开头的路径):最终请求路径为:http://localhost:8080/hello/pages/b.html

  相对路径:

  相对于主机的路径(以“/”开头):相对于当前主机(可以简单理解为ip地址,如果想深入了解请研究tomcat的Server.xml文件。这里是localhost)的路径,请求的最终路径为:http://localhost:8080/hello/pages/b.html

相对于请求的路径(不以“/”开头):相对于当前请求(浏览器的请求)的路径,如果是直接访问的a.html页面,则当前请求为:http://localhost:8080/hello/pages/a.html .最终请求路径为:http://localhost:8080/hello/pages/b.html ;如果是请求的http://localhost:8080/hello/aServlet   然后在服务器转发到了a.html页面。则当前请求为:http://localhost:8080/hello/aServlet,请求的最终路径为:http://localhost:8080/hello/b.html

例2:假设当前请求为http://localhost:8080/hello/aServlet。当前请求的Servlet(或Controller)中有如下重定向的代码:

//绝对路径
response.sendRedirect("http:localhost:8080/hello/page/b.html"); //以“/”开头的相对路径
response.sendRedirect("/hello/page/b.html"); //不以“/”开头的相对路径
response.sendRedirect("b.html");

  绝对路径是以协议开头的,没什么可说的。

  以“/”开头的相对路径(相对于当前主机的路径):请求的最终路径为:http://localhost:8080/hello/pages/b.html

  不以“/”开头的路径(相对于当前请求的路径):请求的最终路径为:http://localhost:8080/hello/b.html

  注:

    1.  推荐使用相对于主机的路径。这样跟当前请求无关。

  2. 重定向是在服务器上设置了302的状态码和location的响应头。浏览器接收之后按照location的响应头重新发送请求,由于重定向的地址是在客户端重新请求的地址,所以重定向属于客户端路径。

服务端路径

  服务端路径是指在服务器上面运行的请求,比如请求转发(常用)、请求包含等。服务端的路径有两种:相对于当前应用的路径和相对于当前请求的路径。

  例:假设当前请求的路径为:http://localhost:8080/hello/servlet/aServlet ,在后台有如下代码:

//以“/”开头,相对于当前应用的路径
request.getRequestDispatcher("/servlet/b.html").forward(request, response); //不以“/”开头,相对于当前请求的路径
request.getRequestDispatcher("b.html").forward(request, response);

  相对于当前应用的路径(以“/”开头):最终转发的地址为:http://localhost:8080/hello/servlet/b.html 。

  相对于当前请求的路径(不以“/”开头):最终转发的地址为:http://localhost:8080/hello/servlet/b.html 。

  另:所有Web层框架的底层使用的都是Web的基础Filter(Struts)或Servlet(SpringMVC),请求都是request,响应都是response,所以各个Web层框架的转发或重定向底层都是利用request和response进行的。  

<url-pattern>路径

  这里的路径仅仅是指web.xml文件中的标签内容。这个路径是虚拟的路径,只有相对路径(相对于当前应用的路径),但相对路径的写法可以是精确查询和模糊查询。

例:

<!—精确查询,是相对于当前应用-->
<url-pattern>/servlet/testPath</url-pattern> <!—模糊查询,表示匹配servlet目录下的所有文件或请求。/*表示匹配所有-->
<url-pattern>/servlet/*</url-pattern> <!—模糊查询,表示匹配所有后缀名为do的文件或请求-->
<url-pattern>*.do</url-pattern>

  在web.xml文件中通配符(*)只能放在路径开头或结尾,不能放在中间。如“/*.do”是非法的。

  注:tomcat查找路径的顺序:优先具体的路径,其次是匹配目录,然后是后缀名。最后是缺省路径。

获取资源的路径

  获取资源的路径主要有3种,分别是ServletContext、Class和ClassLoader。其中ServletContext是WEB阶段的,Tomcat提供的一种获取资源的方式;Class和ClassLoader获取资源主要是JavaAPI提供的一种获取流的方式,由于这是JDK提供的,所以不仅局限于Web,在普通Java类中也可以使用,主要用于获取src目录及其子目录下的文件流。

ServletContext获取资源的路径。

  这里ServletContext获取资源的路径是相对系统的绝对路径(在Windows中是带盘符的,可以用来获取上传或下载文件的具体路径)。

  基本语法:servletContext.getRealPath("路径");参数中的路径必须是相对路径,可以“/”开头,也可以不使用“/”开头,但无论是否使用“/”开头都是相对当前应用路径,建议以"/"开头(这样可以尽量统一)。

  另外获取ServletContext的方法如下:

  1. 使用request获取: request.getSession().getServletContext();
  2. 在Servlet中获取:this.getServletContext();
  3. 使用FilterConfig对象获取(在Filter中使用):config.getServletContext();

  示例如下:假如当前tomcat的路径为:D:\SoftWare\development\tomcat7.0.52,项目名为hello。有如下代码:

ServletContext servletContext = this.getServletContext();

String path1 = servletContext.getRealPath("a.txt");

String path2 = servletContext.getRealPath("/a.txt");

  则path1和path2一样:D:\SoftWare\development\tomcat7.0.52\webapps\hello\a.txt

  所代表的网络路径为:http://localhost:8080/hello/a.txt

Class获取资源

  Class获取资源主要是用作自己写的配置文件,用来读取内容。

  用法:clazz.getResourceAsStream("路径")。参数中的路径可以以“/”开头,也可以不以“/”开头。其中带“/”的表示相对于当前类的路径,不以“/”开头表示相对于当前class所在目录的路径。

  示例:假设当前类的包结构为:com.wind-snow.test.path

//获取Class对象
Class clazz = this.getClass();
//带“/”的路径(相对于当前的类路径)
InputStream stream1 = clazz.getResourceAsStream("/a.txt");
//不带“/”的路径(相对于当前class所在目录的路径)
InputStream stream2 = clazz.getResourceAsStream("a.txt");

  stream1代表src目录下的a.txt文件,发布之后代表“/项目名/WEB-INF/classes/a.txt”文件。

  stream2代表src目录下的com/wind-snow/test/path/a.txt文件,发布之后代表“/项目名/WEB-INF/classes/com/wind-snow/test/path/a.txt”文件。

  注:

    1. 若找不到。此方法不会报异常。只是会返回一个null;。

    2. 这个方法的底层使用的是ClassLoader的getResourceAsStream方法。

ClassLoader获取资源

  和Class获取资源类似。只是不同的写法而已,也是用于获取文件流的。

  用法:classLoader.getResourceAsStream("路径")。参数中的路径可以以“/”开头,也可以不以“/”开头(建议)。但带不带“/”的都表示相对于当前类的路径。

  示例:假设当前类的路径为:com.wind-snow.test.path

ClassLoader classLoader= this.getClass().getClassLoader();

InputStream stream1 = classLoader.getResourceAsStream("/a.txt");

InputStream stream2 = classLoader.getResourceAsStream("a.txt");

  stream1和stream2都代表src目录下的a.txt文件,发布之后代表“/项目名/WEB-INF/classes/a.txt”文件。

  注:若找不到。此方法不会报异常。只是会返回一个null。

总结:

1. 客户端是带“/”相对当前主机。

2. 服务端(包括上述的服务端、url-pattern路径和ServletContext路径)带不带“/”都是相对当前应用(建议带上)。

3. Class带“/”是相对当前类路径。不带“/”是相对于当前位置。

4. ClassLoader无论带不带“/”都是当前类路径(建议带上)。

  另附:总结的一张图片如下,此图是使用XMind画的,原件下载地址:https://files.cnblogs.com/files/wind-snow/Web路径总结.zip

最新文章

  1. Html-浅谈如何正确给table加边框
  2. Linux sudo
  3. (转)我看PhD by 王珢
  4. crond不执行原因分析
  5. VB.NET vs. C#
  6. SpringMVC核心——参数获取与Servlet资源获取问题
  7. Windows下Node.js+Express+WebSocket 安装配置
  8. HttpContext.Current.User.Identity.IsAuthenticated
  9. Zendframework 模块加载事件触发顺序。
  10. HDU-4607 Park Visit bfs | DP | dfs
  11. Thinkphp 事物问题
  12. maven项目,去除jar包中的不想要的依赖关系(Document root element &quot;beans&quot;, must match DOCTYPE root &quot;null&quot;. )
  13. Hadoop之——又一次格式化hdfs系统的方法
  14. SharePoint2010 部署步骤“激活功能”中出现错误:无法启动计算机“PCName”上的服务SPUserCodeV4
  15. VMware安装Centos6.8设置ip无法远程连接问题
  16. 尼姆博弈(Nimm&#39;s Game)
  17. linux学习:sed与awk与tr用法整理
  18. 【XSY1596】旅行 期望DP
  19. Confluence 6 中修改默认的表现和内容
  20. oralce 11.2.0.4手动创建EM

热门文章

  1. linux 静态库和动态库(共享库)的制作与使用(注意覆盖问题)
  2. cookie登录功能实现
  3. Leetcode 268 Missing Number 位运算
  4. Python科学计算(两)——时域波形和正弦信号的频谱
  5. WPF中的 Layout To Layout
  6. 跨进程调用Service(AIDL Service)
  7. JS正则--非负整数或小数[小数最多精确到小数点后两位]
  8. 特殊存储过程——触发器Trigger
  9. 自定义函数Function
  10. WPF中类似使用tab键功能,可以向上向下定位