JavaWEB路径总结
这篇文章是小编一直想写的一篇,主要是对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的方法如下:
- 使用request获取: request.getSession().getServletContext();
- 在Servlet中获取:this.getServletContext();
- 使用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
JavaWEB路径总结的更多相关文章
- JavaWeb路径问题打包总结--小心出门右转404
话说,培训和自学就不是一个回事,两周讲完java基础,两天讲完jsp,两节课讲完servlet,还真不是一般人能受得了的,这两天学习jsp和servlet频繁被路径问题困扰,倒不是出错,只是各种act ...
- JavaWeb(七)之详解JavaWeb路径
前言 在我们的实际开发中,经常要写路径,不管是链接,重定向还是转发,这都是需要路径的.那这一篇我给大家详细的分享一下Web中的各种路径问题. 世界上一切东西都是相对的,对于这点而言,相信大家并不陌生, ...
- JavaWeb 路径问题
路径问题 CreateTime--2016年9月22日15:19:56 Author:Marydon 一.jsp页面 src="../demo/clazz/clazz_add.js&qu ...
- JavaWeb中读取文件资源的路径问题
在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节.字符流来将这个文件读取到内存 ...
- javaWeb中的/路径问题
在写javaweb的时候,在写路径的时候,/有时候表示站点根目录,有时候表示当前web应用根目录,究竟如何区分呢? 首先,我们建议开发的时候,跳转之类的都是用绝对路径(注意:不是物理路径),而不是使用 ...
- JavaWeb 项目中的绝对路径和相对路径以及问题的解决方式
近期在做JavaWeb项目,总是出现各种的路径错误,并且发现不同情况下 / 所代表的含义不同,导致在调试路径上浪费了大量时间. 在JavaWeb项目中尽量使用绝对路径 由于使用绝对路径是绝对不会出 ...
- Javaweb开发中URL路径的使用
看到博客园孤傲苍狼的web系列文章中有关于URL路径的使用文章后,感觉自己对URL的使用清楚了很多,自己再对着动手写一遍以加深记忆. JavaWeb开发中常看到URL以"/"开头, ...
- javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
javaweb项目中有很多场景的路径客户端的POST/GET请求,服务器的请求转发,资源获取需要设置路径等这些路径表达的含义都有不同,所以想要更好的书写规范有用的路径代码 需要对路径有一个清晰地认知 ...
- Javaweb学习笔记——(九)——————Servlet的进入,及ServletConfig、GenericServlet、HttpServlet、ServletContext、获取类路径资源
Servlet1.什么是Servlet? *Servlet是Javaweb三大组件之一(Servlet,Filter,Listener) *Servlet是用来处理客户端请求的动态资源 *Servle ...
随机推荐
- 关于js的window.open()
window.open是javascript函数,该函数的作用是打开一个新窗口或这改变原来的窗口,不过一般用来的是打开新窗口,因为修改原来的网页地址,可以有另一个函数,那就是window.locati ...
- 将git文件挂到cdn上
网址:http://raw.githack.com/
- Java--ConcurrentHashMap原理分析
一.背景: 线程不安全的HashMap 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 效率低下的H ...
- OpenCV调试利器——Image Watch插件的安装和使用
各大编译工具在调试的时候都可以实时查看变量的值,了解变量值的变动情况,在图像处理相关的程序调试中,是否也可以实时查看内存中图像变量的图形信息以及图像上指定区域或点位的数值变化情况呢? 在工业机器视觉领 ...
- 常见的选择<数据源协议,委托协议>(IOS发展)
-常见的选择必须满足这两个协议,约定实施.一个为数据源协议 -托付协议负责控制控件UI.事件响应, 实现可选 -数据源协议负责控件与应用数据模型的桥梁,一般必须实现 @interface ViewCo ...
- JPA示例项(J采纳PA的hibernate实现版本号)
(1).JPA介绍: JPA全名Java Persistence API ,Java坚持API这是Sun公司Java EE 5规范中提出的Java持久化接口. JPA吸取了眼下Java持久化技术的长处 ...
- C#调用WebKit内核
原文:C#调用WebKit内核 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013564470/article/details/80255954 ...
- HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth完全详细的说明
HTML:scrollLeft,scrollWidth,clientWidth,offsetWidth具体指完全解释究竟哪里的距离scrollHeight: 获取对象的高度滚动. scrollLe ...
- .net reactor 学习系列(二)---.net reactor界面各功能说明
原文:.net reactor 学习系列(二)---.net reactor界面各功能说明 安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...
- 在实现视频播放器的步骤client(三)风行网络电影列表
(三) 今日热门电影实现这个功能.主要从server获取数据.然后显示在屏幕上.虽然说是从这个server获取电影信息数据,但,不实际的http相关知识,我们直接sdk包(56网络提供api),你将能 ...