百度百科上URL的解释
URL以字符串的抽象形式来描述一个资源在[万维网](https://baike.baidu.com/item/%E4%B8%87%E7%BB%B4%E7%BD%91/215515)上的地址。一个URL唯一标识一个[Web](https://baike.baidu.com/item/Web/150564)资源,通过与之对应的URL即可获得该资源。URL一般形式如下:
<scheme>:<scheme-specificpart>
其中<scheme>表示URL采用的方案,方案之后是一个冒号(:),之后的方案描述部分(<scheme-specificpart>)则依赖之前所采用的方案。方案名可以由一系列字符组成,字符可以是小写字母“a"-“z"、数字以及字符加号(“+")、句点(“.")和连字符(“-*)为了便于使用,程序在解释URL时视大小写字符是等价的(如http等价于HTTP)。 <sup>[2]</sup>
具体来说,常用的URL格式如下:
协议类型://服务器地址[:端口号]/路径/文件名[参数=值]
上述结构中[]部分是可选的。如果端口号与相关协议默认值不同,则需包含端口号。其中协议类型包括[HTTP](https://baike.baidu.com/item/HTTP/243074),[MAILTO](https://baike.baidu.com/item/MAILTO/611052),[FILE](https://baike.baidu.com/item/FILE/22393471),[FTP](https://baike.baidu.com/item/FTP/13839)等。利用HTTP协议访问万维网上的一个资源的URL形如:
http://website.com/goods/search.phpterm-apple
其中website.com服务器,search.php是服务器端的一个脚本文件,之后紧跟脚本执行所需要的参数term,而apple为用户输入的对应term的参数值。
除上述的绝对形式外,还可以相对某一特殊主机或主机上的一个特殊路径指定URL,如:
/goods/search.phpterm-apple
/search.phpterm-apple
Web页面常常用上述相对形式描述Web站点或者应用程序中的导航。
## 组成部分介绍
[编辑](javascript:;)
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/[路径](https://baike.baidu.com/item/%E8%B7%AF%E5%BE%84)查询”。完整的、带有授权部分的普通统一[资源](https://baike.baidu.com/item/%E8%B5%84%E6%BA%90)标志符语法看上去如下:协议://用户名:密码@子域名.域名.顶级域名:[端口号](https://baike.baidu.com/item/%E7%AB%AF%E5%8F%A3%E5%8F%B7)/目录/文件名.文件后缀参数=值#标志。
### 第一部分
模式/协议(scheme):它告诉浏览器如何处理将要打开的文件。最常用的模式是超文本传输协议(Hypertext Transfer Protocol,缩写为HTTP),这个协议可以用来访问网络。 <sup>[1]</sup>
其他协议:
http——超文本传输协议资源
https——用[安全套接字层](https://baike.baidu.com/item/%E5%AE%89%E5%85%A8%E5%A5%97%E6%8E%A5%E5%AD%97%E5%B1%82)传送的[超文本](https://baike.baidu.com/item/%E8%B6%85%E6%96%87%E6%9C%AC/8535513)[传输协议](https://baike.baidu.com/item/%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE)
ftp——[文件传输协议](https://baike.baidu.com/item/%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE)
mailto——[电子邮件地址](https://baike.baidu.com/item/%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%9C%B0%E5%9D%80)
ldap——[轻型目录访问协议](https://baike.baidu.com/item/%E8%BD%BB%E5%9E%8B%E7%9B%AE%E5%BD%95%E8%AE%BF%E9%97%AE%E5%8D%8F%E8%AE%AE)搜索
file——当地电脑或网上分享的文件
news——[Usenet新闻组](https://baike.baidu.com/item/Usenet%E6%96%B0%E9%97%BB%E7%BB%84)
gopher——Gopher协议
telnet——[Telnet协议](https://baike.baidu.com/item/Telnet%E5%8D%8F%E8%AE%AE)
### 第二部分
第二部分是 Internet 主机名。我们希望访问的 WWW 页 面就存放在该计算机上。有了这台计算机的名 字,Internet 通过 [DNS](https://baike.baidu.com/item/DNS/427444)( 域名服务器) 找到与这台计算机的英文名相对应的数字地址,也叫做 IP 地址,就能够在全世界范围内找到这台计算机,不管它是在哪个国家或哪个地区。 <sup>[4]</sup> 文件所在的服务器的名称或[IP地址](https://baike.baidu.com/item/IP%E5%9C%B0%E5%9D%80/150859),后面是到达这个文件的路径和文件本身的名称。服务器的名称或IP地址后面有时还跟一个冒号和一个[端口号](https://baike.baidu.com/item/%E7%AB%AF%E5%8F%A3%E5%8F%B7)。它也可以包含接触服务器必须的用户名称和密码。
### 第三部分
url的第三项为路径。它定义信息保存在 这台计算机上的什么地方,即哪个子目录中。 每个子目录的前面有 一条斜杠 。[路径](https://baike.baidu.com/item/%E8%B7%AF%E5%BE%84)部分包含等级结构的路径定义,一般来说不同部分之间以斜线(/)分隔。询问部分一般用来传送对服务器上的数据库进行动态询问时所需要的参数。 <sup>[5]</sup>
### 第四部分
url的第四项是文件名或主页名。也就是我们想要访问的某个具体信息的文件名或主页名。在 http://home.nets cape.com/pub/ma in/index.html 中 index.html 为主页名。当然,文件名也是可以省略的,如果省略,你所连接的计算机将自动决定使用哪一个文件。常见的 文件类型有:正式的 Web 页( .html) 、纯文本文件( .txt 或.text) 、图片文件( .gif 或.jpeg) 、声音文件( .wav 或.au) 、电 影文件( .avi 或.mpeg) 等。 <sup>[4]</sup>
## 分类
[编辑](javascript:;)
### 绝对
绝对URL(absolute URL)显示文件的完整路径,这意味着绝对URL本身所在的位置与被引用的实际文件的位置无关。
### 相对
相对URL是不完整的,要从相对URL中获取访问资源所需的全部信息,就必须相对另一个被称为基础的URL进行解析。相对URL(relative URL)以包含URL本身的文件夹的位置为参考点,描述目标文件夹的位置。如果目标文件与当前页面(也就是包含URL的页面)在同一个目录,那么这个文件的相对URL仅仅是文件名和扩展名,如果目标文件在当前目录的子目录中,那么它的相对URL是子目录名,后面是斜杠,然后是目标文件的文件名和扩展名。
一般来说,对于同一服务器上的文件,应该总是使用相对URL,它们更容易输入,而且在将页面从本地系统转移到服务器上时更方便,只要每个文件的相对位置保持不变,链接就仍然是有效地。
相对URL为了保持一组资源(HTML页面)的便捷性提供了一种便捷方式,如果使用相对URL,可以在搬移一组文档时,仍保持链接的有效性;因为相对URL是相对于新基础进行解释的,类似于在其他服务器提供镜像内容等功能
百度百科上URI的解释
## URI、URL和URN
[编辑](javascript:;)
[统一资源定位符](https://baike.baidu.com/item/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%AC%A6/4438100)(Uniform Resource Locator,URL),[统一资源名称](https://baike.baidu.com/item/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%90%8D%E7%A7%B0/4437154)(Uniform Resource Name,URN)是URI的子集。
Web上地址的基本形式是URI,它有两种形式:
一种是URL,这是目前URI的最普遍形式。
另一种就是URN,这是URL的一种更新形式,URN不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。
### URI与URL
URL是Uniform Resource Locator的缩写,译为"统一资源定位符"。URL是一种URI,它标识一个互联网[资源](https://baike.baidu.com/item/%E8%B5%84%E6%BA%90),并指定对其进行操作或获取该资源的方法。可能通过对主要访问手段的描述,也可能通过网络“位置”进行标识。例如,http://www.wikipedia.org/这个URL,标识一个特定资源([首页](https://baike.baidu.com/item/%E9%A6%96%E9%A1%B5))并表示该资源的某种形式(例如以编码字符表示的,首页的[HTML](https://baike.baidu.com/item/HTML)代码)是可以通过[HTTP](https://baike.baidu.com/item/HTTP)协议从www.wikipedia.org这个网络主机获得的。主要用在各种WWW客户程序和[服务器](https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8)程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
目前最大的缺点是当信息资源的存放地点发生变化时,必须对URL作相应的改变。因此人们正在研究新的信息资源表示方法,例如:URI(Universal Resource Identifier)即"通用资源标识" <sup>[2]</sup> 、URN(Uniform Resource Name)即"统一资源名"和URC(Uniform Resource Citation)即"统一资源引用符"等。
URI还在进一步的研究当中。研究的方向就是弥补URL的缺点。
### URI与URN
URI可被视为定位符(URL),名称(URN)或两者兼备。统一资源名(URN)如同一个人的名称,而[统一资源定位符](https://baike.baidu.com/item/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E5%AE%9A%E4%BD%8D%E7%AC%A6)(URL)代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地址。
用于[标识](https://baike.baidu.com/item/%E6%A0%87%E8%AF%86)唯一书目的ISBN系统是一个典型的URN使用范例。例如,ISBN 0486275574(urn:isbn:0-486-27557-4)无二义性地标识出莎士比亚的戏剧《罗密欧与朱丽叶》的某一特定版本。为获得该资源并阅读该书,人们需要它的位置,也就是一个URL地址。在类Unix操作系统中,一个典型的URL地址可能是一个[文件目录](https://baike.baidu.com/item/%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95),例如file:///home/username/RomeoAndJuliet.pdf。该URL[标识](https://baike.baidu.com/item/%E6%A0%87%E8%AF%86)出存储于本地硬盘中的电子书文件。因此,URL和URN有着互补的作用。
URN是基于某[名字空间](https://baike.baidu.com/item/%E5%90%8D%E5%AD%97%E7%A9%BA%E9%97%B4)通过名称指定资源的URI。人们可以通过URN来指出某个资源,而无需指出其位置和获得方式。资源无需是基于互联网的。例如,URNurn:ISBN0-395-36341-1 指定标识系统(即国际标准书号[ISBN](https://baike.baidu.com/item/ISBN))和某资源在该系统中的唯一表示的URI。它可以允许人们在不指出其位置和获得方式的情况下谈论这本书。
## URI格式
[编辑](javascript:;)
表示指定的 URI,要使用涵盖全部必要信息的绝对 URI、绝对 URL 以及相对 URL。相对 URL,是指从浏览器中基本 URI 处指定的 URL,形如 /image/logo.gif。
URI格式由URI协议名(例如[http](https://baike.baidu.com/item/http)、[ftp](https://baike.baidu.com/item/ftp)、[mailto](https://baike.baidu.com/item/mailto)、file),一个[冒号](https://baike.baidu.com/item/%E5%86%92%E5%8F%B7),和协议对应的内容所构成。特定的协议定义了协议内容的语法和[语义](https://baike.baidu.com/item/%E8%AF%AD%E4%B9%89),而所有的协议都必须遵循一定的URI文法通用规则,亦即为某些专门目的保留部分特殊字符。URI文法同时也就各种原因对协议内容加以其他的限制,例如,保证各种分层协议之间的协同性。百分号编码也为URI提供附加信息。
URL的格式由下列三部分组成:,第一部分是协议(或称为服务方式);第二部分是存有该资源的主机IP地址(有时也包括端口号);第三部分是主机资源的具体地址。
具体URI的格式如下:
[协议名]://[用户名]:[密码]@[服务器地址]:[服务器端口号]/[路径]?[查询字符串]#[片段ID] <sup>[4]</sup>
### 登录信息(用户名:密码)
指定用户名和密码作为从服务器端获取资源时必要的登录信息(身份认证)。此项是可选项。
### 服务器地址
使用绝对 URI 必须指定待访问的服务器地址。地址可以是类似 hackr.jp 这种 DNS 可解析的名称,或是 192.168.1.1 这类 IPv4 地址 名,还可以是 [0:0:0:0:0:0:0:1] 这样用方括号括起来的 IPv6 地址名。
### 服务器端口号
指定服务器连接的网络端口号。此项也是可选项,若用户省略则自动使用默认端口号。
### 带层次的文件路径
指定服务器上的文件路径来定位特指的资源。这与 UNIX 系统的文件目录结构相似。
### 查询字符串
针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。此项可选。
### 片段标识符
使用片段标识符通常可标记出已获取资源中的子资源(文档内的某个位置)。但在 RFC 中并没有明确规定其使用方法。该项也为可选项。
在Java的API中,java.net包下解释了二者的区别
URL
Version:1.0 StartHTML:000000292 EndHTML:000006731 StartFragment:000000661 EndFragment:000006699 StartSelection:000000661 EndSelection:000006693 SourceURL:mk:@MSITStore:E:\javaweb网上商城源码资料毕业设计\jdk%20api%201.8_China\jdk%20api%201.8_google.CHM::/java/net/URL.html <title>URL (Java Platform SE 8 )</title><link title="Style" href="../../stylesheet.css" rel="stylesheet" type="text/css">
compact1, compact2, compact3
java.net
## Class URL
* [java.lang.Object](../../java/lang/Object.html "class in java.lang")
* * java.net.URL
* <dl>
<dt>All Implemented Interfaces:</dt>
<dd>[Serializable](../../java/io/Serializable.html "java.io中的接口")</dd>
</dl>
* * *
<pre>public final class URL
extends [Object](../../java/lang/Object.html "class in java.lang")
implements [Serializable](../../java/io/Serializable.html "interface in java.io")</pre>
Class `URL`表示统一资源定位符,指向万维网上的“资源”的指针。 资源可以像文件或目录一样简单,或者可以是对更复杂的对象的引用,例如对数据库或搜索引擎的查询。 有关URL类型及其格式的更多信息,请访问: [*Types of URL*](http://web.archive.org/web/20051219043731/http://archive.ncsa.uiuc.edu/SDG/Software/Mosaic/Demo/url-primer.html)
一般来说,URL可以分为几个部分。 请考虑以下示例:
> <pre> http://www.example.com/docs/resource1.html
> </pre>
上面的URL表示要使用的协议是`http` (超文本传输协议),并且信息驻留在名为`www.example.com`的主机上。 该主机上的信息名为`/docs/resource1.html` 。 主机上此名称的确切含义取决于协议和主机。 信息通常驻留在一个文件中,但它可以在飞行中生成。 该URL的这个组件称为*路径*组件。
URL可以选择指定一个“端口”,它是在远程主机上进行TCP连接的端口号。 如果未指定端口,则使用协议的默认端口。 例如, `http`的默认端口是`80` 。 另一个端口可以指定为:
> <pre> http://www.example.com:1080/docs/resource1.html
> </pre>
的语法`URL`由下式定义[*RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax*](http://www.ietf.org/rfc/rfc2396.txt) ,通过修正[*RFC 2732: Format for Literal IPv6 Addresses in URLs*](http://www.ietf.org/rfc/rfc2732.txt) 。 文字IPv6地址格式也支持scope_ids。 描述了scope_ids的语法和用法[here](Inet6Address.html#scoped) 。
URL可能附加了一个“片段”,也称为“ref”或“reference”。 片段由尖锐的符号字符“#”表示,后跟更多的字符。 例如,
> <pre> http://java.sun.com/index.html#chapter1
> </pre>
该片段在技术上不是URL的一部分。 相反,它表示在检索到指定的资源之后,应用程序对附有标签`chapter1`的文档的该部分`chapter1` 。 标签的含义是资源特定的。
一个应用程序还可以指定一个“相对URL”,它只包含相对于另一个URL访问资源的足够的信息。 HTML页面中经常使用相对URL。 例如,如果URL的内容:
> <pre> http://java.sun.com/index.html
> </pre>
在其中包含相对URL:
> <pre> FAQ.html
> </pre>
这将是一个速记:
> <pre> http://java.sun.com/FAQ.html
> </pre>
相对URL不需要指定URL的所有组件。 如果协议,主机名或端口号丢失,该值将从完全指定的URL继承。 必须指定文件组件。 可选片段不被继承。
URL类本身不会根据RFC2396中定义的转义机制对任何URL组件进行编码或解码。 来电者有责任编码任何需要在调用URL之前进行转义的字段,并对从URL返回的任何转义字段进行解码。 此外,由于URL不具有URL转义的知识,因此不能识别同一URL的编码或解码形式之间的等同性。 例如,两个URL:
<pre> http://foo.com/hello world/ and http://foo.com/hello%20world </pre>
将被视为不相等。
注意,在某些情况下, [`URI`](../../java/net/URI.html "java.net中的类")类确实执行其组件字段的转义。 管理URL编码和解码的推荐方法是使用[`URI`](../../java/net/URI.html "java.net中的类") ,并使用[`toURI()`](../../java/net/URL.html#toURI--)和[`URI.toURL()`](../../java/net/URI.html#toURL--)在这两个类之间进行转换。
也可以使用[`URLEncoder`](../../java/net/URLEncoder.html "java.net中的类")和[`URLDecoder`](../../java/net/URLDecoder.html "java.net中的类")类,但仅适用于与RFC2396中定义的编码方案不同的HTML表单编码。
<dl>
<dt>从以下版本开始:</dt>
<dd>JDK1.0</dd>
<dt>另请参见:</dt>
<dd>[Serialized Form](../../serialized-form.html#java.net.URL)</dd>
</dl>
URI
Version:1.0 StartHTML:000000292 EndHTML:000021484 StartFragment:000000661 EndFragment:000021452 StartSelection:000000661 EndSelection:000021446 SourceURL:mk:@MSITStore:E:\javaweb网上商城源码资料毕业设计\jdk%20api%201.8_China\jdk%20api%201.8_google.CHM::/java/net/URI.html <title>URI (Java Platform SE 8 )</title><link title="Style" href="../../stylesheet.css" rel="stylesheet" type="text/css">
compact1, compact2, compact3
java.net
## Class URI
* [java.lang.Object](../../java/lang/Object.html "class in java.lang")
* * java.net.URI
* <dl>
<dt>All Implemented Interfaces:</dt>
<dd>[Serializable](../../java/io/Serializable.html "java.io中的接口") , [Comparable](../../java/lang/Comparable.html "java.lang中的接口") < [URI](../../java/net/URI.html "java.net中的类") ></dd>
</dl>
* * *
<pre>public final class URI
extends [Object](../../java/lang/Object.html "class in java.lang")
implements [Comparable](../../java/lang/Comparable.html "interface in java.lang")<[URI](../../java/net/URI.html "class in java.net")>, [Serializable](../../java/io/Serializable.html "interface in java.io")</pre>
表示统一资源标识符(URI)参考。
除了下面指出的一些微小偏差,这个类的一个实例表示由所定义的URI引用[*RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax*](http://www.ietf.org/rfc/rfc2396.txt) ,通过修正[*RFC 2732: Format for Literal IPv6 Addresses in URLs*](http://www.ietf.org/rfc/rfc2732.txt) 。 文字IPv6地址格式也支持scope_ids。 描述了scope_ids的语法和用法[here](Inet6Address.html#scoped) 。 该类提供了用于从其组件创建URI实例或通过解析其字符串表单,访问实例的各种组件的方法以及用于归一化,解析和相对化URI实例的方法的构造函数。 这个类的实例是不可变的。
### URI语法和组件
在最高级别,字符串形式的URI引用(以下简称为“URI”)具有语法
> [ *scheme* **`:`**] *scheme-specific-part*[ **`#`** *fragment*]
其中方括号[...]描绘可选组件,字符**`:`**和**`#`**代表自己。
*绝对* URI指定方案; 一个不是绝对的URI被认为是*相对的* 。 URI也根据它们是*不透明*还是分*层次分类* 。
*不透明的* URI是一个绝对URI,其特定于方案的部分不以斜杠字符开头( `'/'` )。 不透明的URI不需要进一步解析。 不透明URI的一些示例是:
> | `mailto:java-net@java.sun.com` | |
> | `news:comp.lang.java` | |
> | `urn:isbn:096139210x` |
*分层* URI是绝对URI,其方案特定部分以斜杠字符开头,或相对URI,即不指定方案的URI。 分层URI的一些示例是:
> `http://java.sun.com/j2se/1.3/`
> `docs/guide/collections/designfaq.html#28`
> `../../../demo/jfc/SwingSet2/src/SwingSet2.java`
> `file:///~/calendar`
分层URI根据语法进行进一步解析
> [ *scheme* **`:`**][ **`//`** *authority*][ *path*][ **`?`** *query*][ **`#`** *fragment*]
里的人物**`:`** , **`/`** , **`?`**和**`#`**代表它们自身。 分层URI的方案特定部分由方案和片段组件之间的字符组成。
如果指定了分层URI的权限组件,则*基于服务器或基于* *注册表* 。 基于服务器的权限根据熟悉的语法进行分析
> [ *user-info* **`@`**] *host*[ **`:`** *port*]
字符**`@`**和**`:`**代表自己。 目前使用的几乎所有URI方案都是基于服务器的。 不以这种方式解析的权限组件被认为是基于注册表的。
如果分层URI的路径组件以斜杠字符( `'/'` )开头,则它本身被称为绝对路径组件; 否则是相对的。 绝对的或指定权限的分层URI的路径总是绝对的。
总而言之,一个URI实例有以下九个组件:
> | *Component* | *Type* |
> | scheme | `String` |
> | scheme-specific-part | `String` |
> | authority | `String` |
> | user-info | `String` |
> | host | `String` |
> | port | `int` |
> | path | `String` |
> | query | `String` |
> | fragment | `String` |
在给定的实例中,任何特定的组件是*未定义的*或者用不同的值*定义* 。 未定义的字符串组件由`null` ,而未定义的整数组件由`-1` 。 可以将字符串组件定义为将空字符串作为其值; 这不等于该组件未定义。
特定组件是否在实例中定义取决于所表示的URI的类型。 绝对URI具有方案组件。 不透明URI具有方案,方案特定部分和可能的片段,但没有其他组件。 分层URI总是具有路径(虽然它可以是空的)和方案特定部分(至少包含路径),并且可以具有任何其他组件。 如果权限组件存在并且基于服务器,则将定义主机组件,并且可以定义用户信息和端口组件。
#### URI实例的操作
这一类支持的关键操作是*规范化* , *解决*和*相对化* 。
*归一化*是从分层URI的路径组件中删除不必要的`"."`和`".."`段的过程。 每个`"."`段都被简单地删除。 一个`".."`段只有在非`".."`段之前`".."` 。 规范化对不透明的URI没有影响。
*分辨率*是对另一个解决一个URI的过程中, *基本* URI。 生成的URI由RFC 2396指定的方式由两个URI的组件构成,从原始URI中未指定的基本URI获取组件。 对于分层URI,原始路径将根据基础路径进行解析,然后进行归一化。 结果,例如,解决
> `docs/guide/collections/designfaq.html#28` (1)
对基地URI `http://java.sun.com/j2se/1.3/`是结果URI
> `http://docs.oracle.com/javase/1.3/docs/guide/collections/designfaq.html#28`
解析相对URI
> `../../../demo/jfc/SwingSet2/src/SwingSet2.java` (2)
反过来,
> `http://java.sun.com/j2se/1.3/demo/jfc/SwingSet2/src/SwingSet2.java`
支持绝对和相对URI的分辨率,以及分层URI情况下的绝对路径和相对路径的分辨率。 解决URI `file:///~calendar`对任何其他URI只是产生原始URI,因为它是绝对的。 解析相对URI(2)相对于相对基本URI(1)产生归一化但仍然相对的URI
> `demo/jfc/SwingSet2/src/SwingSet2.java`
*相对论*最后是分辨率的倒数:对于任何两个归一化的URI *u*和*v* ,
> *u* `.relativize(` *u* `.resolve(` *v* `)).equals(` *v* `)` and
> *u* `.resolve(` *u* `.relativize(` *v* `)).equals(` *v* `)` .
在可能的情况下,构建包含必须相对于文档的基本URI的URI的文档时,此操作通常很有用。 例如,相对于URI
> `http://docs.oracle.com/javase/1.3/docs/guide/index.html`
针对基本URI
> `http://java.sun.com/j2se/1.3`
产生相对URI `docs/guide/index.html` 。
#### 字符类别
RFC 2396精确地指定在URI引用的各种组件中允许哪些字符。 以下类别,大部分来自该规范,在下面用于描述这些约束:
> | *alpha* | The US-ASCII alphabetic characters, `'A'` through `'Z'` and `'a'` through `'z'` |
> | *digit* | The US-ASCII decimal digit characters, `'0'` through `'9'` |
> | *alphanum* | All *alpha* and *digit* characters |
> | *unreserved* | All *alphanum* characters together with those in the string `"_-!.~'()*"` |
> | *punct* | The characters in the string `",;:$&+="` |
> | *reserved* | All *punct* characters together with those in the string `"?/[]@"` |
> | *escaped* | Escaped octets, that is, triplets consisting of the percent character (`'%'`) followed by two hexadecimal digits (`'0'`-`'9'`, `'A'`-`'F'`, and `'a'`-`'f'`) |
> | *other* | The Unicode characters that are not in the US-ASCII character set, are not control characters (according to the [`Character.isISOControl`](../../java/lang/Character.html#isISOControl-char-) method), and are not space characters (according to the [`Character.isSpaceChar`](../../java/lang/Character.html#isSpaceChar-char-) method) *(**Deviation from RFC 2396**, which is limited to US-ASCII)* |
所有合法URI字符集由*未* *保留* , *保留* , *转义*和*其他*字符组成。
#### 转义八位字节,引号,编码和解码
RFC 2396允许转义的八位字节出现在用户信息,路径,查询和片段组件中。 转义在URI中有两个目的:
* 当URI需要严格遵守RFC 2396时不包含任何*其他*字符,以*对*非US-ASCII字符*进行编码* 。
* *引用*组件中其他非法的字符。 用户信息,路径,查询和片段组件在哪些角色被视为合法和非法的情况下略有不同。
这些目的通过三个相关的操作在这个课程中提供:
* 通过用UTF-8字符集中代表该字符的转义八位字节序列代替字符进行*编码* 。 例如,欧元货币符号( `'\u20AC'` )编码为`"%E2%82%AC"` 。 *( **偏离RFC 2396** ,不指定任何特定字符集。)*
* 非法字符简单地通过编码*引用* 。 例如,用空格字符替换为`"%20"` 。 UTF-8包含US-ASCII,因此对于US-ASCII字符,此转换完全符合RFC 2396所要求的效果。
* 通过用UTF-8字符集中表示的字符序列替换转义的八位字节序列来*解码* 。 UTF-8包含US-ASCII,因此解码具有取消引用任何引用的US-ASCII字符以及解码任何编码的非US-ASCII字符的解码效果。 如果[decoding error](../nio/charset/CharsetDecoder.html#ce)解码转义八位组,则错误的八位位组被更换时发生`'\uFFFD'` ,Unicode替换字符。
这些操作在此类的构造函数和方法中暴露如下:
* [single-argument constructor](../../java/net/URI.html#URI-java.lang.String-)要求引用其参数中的任何非法字符,并保留任何转义的八位字节和*其他*存在的字符。
* 该[multi-argument constructors](../../java/net/URI.html#URI-java.lang.String-java.lang.String-java.lang.String-int-java.lang.String-java.lang.String-java.lang.String-)引用非法字符如要求它们出现的组件。 百分比字符( `'%'` )始终由这些构造函数引用。 任何*其他*字符都被保留。
* 的[`getRawUserInfo`](../../java/net/URI.html#getRawUserInfo--) , [`getRawPath`](../../java/net/URI.html#getRawPath--) , [`getRawQuery`](../../java/net/URI.html#getRawQuery--) , [`getRawFragment`](../../java/net/URI.html#getRawFragment--) , [`getRawAuthority`](../../java/net/URI.html#getRawAuthority--)和[`getRawSchemeSpecificPart`](../../java/net/URI.html#getRawSchemeSpecificPart--)方法返回原始形式及其相应的分量的值,而不用解释任何转义八位组。 这些方法返回的字符串可能包含转义的八位字节和*其他*字符,并且不会包含任何非法字符。
* 的[`getUserInfo`](../../java/net/URI.html#getUserInfo--) , [`getPath`](../../java/net/URI.html#getPath--) , [`getQuery`](../../java/net/URI.html#getQuery--) , [`getFragment`](../../java/net/URI.html#getFragment--) , [`getAuthority`](../../java/net/URI.html#getAuthority--)和[`getSchemeSpecificPart`](../../java/net/URI.html#getSchemeSpecificPart--)方法解码任何逃脱在它们的对应部件的八位字节。 这些方法返回的字符串可能包含*其他*字符和非法字符,并且不会包含任何转义的八位字节。
* [`toString`](../../java/net/URI.html#toString--)方法返回一个包含所有必要引号的URI字符串,但可能包含*其他*字符。
* [`toASCIIString`](../../java/net/URI.html#toASCIIString--)方法返回不包含任何*其他*字符的完全引用和编码的URI字符串。
#### 身份
对于任何URI *U,*它始终是情况
> `new URI(` *u* `.toString()).equals(` *u* `)` .
对于任何*URIÜ*不包含一个空的机构(如在之前的冗余语法如两个斜杠`file:///tmp/`以下一个主机名,但没有端口(如在)或冒号`http://java.sun.com:` ),和不除了那些必须是字符进行编码引用,以下身份也符合:
<pre> new URI(*u*.getScheme(),
*u*.getSchemeSpecificPart(),
*u*.getFragment())
.equals(*u*) </pre>
在所有情况下,
<pre> new URI(*u*.getScheme(),
*u*.getUserInfo(), *u*.getAuthority(),
*u*.getPath(), *u*.getQuery(),
*u*.getFragment())
.equals(*u*) </pre>
如果*你*是分层的,和
<pre> new URI(*u*.getScheme(),
*u*.getUserInfo(), *u*.getHost(), *u*.getPort(),
*u*.getPath(), *u*.getQuery(),
*u*.getFragment())
.equals(*u*) </pre>
如果*u*是分层的,并且没有权限或基于服务器的权限。
#### URI,URL和URN
URI是统一的资源*标识符* ,而URL是统一的资源*定位符* 。 因此,每个URL都是一个URI,而不是每个URI都是URL。 这是因为还有另一个URI类别,统一资源*名称* (URN),它们命名资源但不指定如何定位它们。 上面`mailto` `news`和`isbn` URI是URN的示例。
URI和URL之间的概念区别反映在这个类与[`URL`](../../java/net/URL.html "java.net中的类")类之间的[差异](../../java/net/URL.html "java.net中的类")中。
该类的实例表示RFC 2396定义的句法意义中的URI引用。URI可以是绝对的或相对的。 根据通用语法解析URI字符串,而不考虑它指定的方案(如果有的话)。 不执行主机的查找(如果有的话),并且不构造与方案相关的流处理程序。 严格按照实例的字符内容来定义平等,散列和比较。 换句话说,一个URI实例只是一个结构化的字符串,它支持语法,方案独立的比较,归一化,分辨率和相对性化的操作。
相反, [`URL`](../../java/net/URL.html "java.net中的类")类的一个实例表示URL的句法组件以及访问其描述的资源所需的某些信息。 URL必须是绝对的,也就是说,它必须始终指定一个方案。 根据其方案解析URL字符串。 始终为URL建立流处理程序,实际上不可能为没有处理程序可用的方案创建一个URL实例。 平等和散列取决于主机的方案和互联网地址(如果有的话); 比较没有定义。 换句话说,URL是一个结构化字符串,支持分辨率的语法操作以及查找主机并打开与指定资源的连接的网络I / O操作。
<dl>
<dt>从以下版本开始:</dt>
<dd>1.4</dd>
<dt>另请参见:</dt>
<dd>[*RFC 2279: UTF-8, a transformation format of ISO 10646*](http://www.ietf.org/rfc/rfc2279.txt) ,
[*RFC 2373: IPv6 Addressing Architecture*](http://www.ietf.org/rfc/rfc2373.txt) ,
[*RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax*](http://www.ietf.org/rfc/rfc2396.txt)
[*RFC 2732: Format for Literal IPv6 Addresses in URLs*](http://www.ietf.org/rfc/rfc2732.txt) ,
[URISyntaxException](URISyntaxException.html) , [Serialized Form](../../serialized-form.html#java.net.URI)</dd>
</dl>
URL包括URI、URN,URN为统一资源名称,URL为统一资源定位符,URI是统一资源标识符,URN、URL都是URI的子集,在JSP的标签技术中,我们可以声明自定义标签或者Sun公司的标签
自定义标签声明语句:
<%@taglib uri="/example" prefix="e" %>
或者:
<%@taglib uri="http://www.itcast.cn" prefix="itcast" %>
prefix为简写,而这些uri都是在tld文件中配置的
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>itcast</short-name>
<uri>/example</uri>
<tag>
<name>referer</name>
<tag-class>cn.itcast.web.tag.example.RefererTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>site</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>page</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
还是不太清楚,继续看:
维基百科:
“A Uniform Resource Identifier (URI) 是一个紧凑的字符串用来标示抽象或物理资源。”
“A URI 可以进一步被分为定位符、名字或两者都是. 术语“Uniform Resource Locator” (URL) 是URI的子集, 除了确定一个资源,还提供一种定位该资源的主要访问机制(如其网络“位置”)。“
那我们无所不知的维基百科把这段消化的很好,并描述的更加形象了:
“URI可以分为URL,URN或同时具备locators 和names特性的一个东西。URN作用就好像一个人的名字,URL就像一个人的地址。换句话说:URN确定了东西的身份,URL提供了找到它的方式。”
通过这些描述我们可以得到一些结论:
•首先,URL是URI的一种(通过那个图就看的出来吧)。所以有人跟你说URL不是URI,他就错了呗。但也不是所有的URI都是URL哦,就好像蝴蝶都会飞,但会飞的可不都是蝴蝶啊,你让苍蝇怎么想!
•让URI能成为URL的当然就是那个“访问机制”,“网络位置”。e.g. http:// or ftp://.。
•URN是唯一标识的一部分,就是一个特殊的名字。
下面就来看看例子吧,当来也是来自权威的RFC:
•ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)
•http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)
•ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)
•mailto:John.Doe@example.com (also a URL because of the protocol)
•news:comp.infosystems.www.servers.unix (also a URL because of the protocol)
•tel:+1-816-555-1212
•telnet://192.0.2.16:80/ (also a URL because of the protocol)
•urn:oasis:names:specification:docbook:dtd:xml:4.1.2
这些全都是URI, 其中有些事URL. 哪些? 就是那些提供了访问机制的.
3 request
* request对象,tomcat根据http协议的请求的内容,将相应的数据封装到request对象中。
* request和response必须是成对出现,先有的request,再有的response
* 接口:javax.servlet.http.HttpServletRequest extends javax.servlet.ServletRequest
* 实现类:tomcat实现,并在请求时,tomcat创建 。
* 请求行
* 入口:http://localhost:8080/day05/demo/pathRequestServlet?username=jack&password=1234
* 请求方式
request.getMethod();
* 路径
// * 请求资源路径
// 1 获得servlet路径,web.xml配置的url-pattern【★★★】
String servletPath = request.getServletPath();
System.out.println(" 1 servletPath -->" + servletPath); //--> /demo/pathRequestServlet
//2 获得发布到tomcat时的项目名称【★★★】
String contextPath = request.getContextPath();
System.out.println(" 2 contextPath -->" + contextPath); //--> /day05
//3 获得请求行中的资源路径
String requestURI = request.getRequestURI();
System.out.println(" 3 requestURI -->" + requestURI);//-->/day05/demo/pathRequestServlet
//4 获得请求URL(地址栏书写)
String requestURL = request.getRequestURL().toString();
System.out.println(" 4 requestURL -->" + requestURL);//-->http://localhost:8080/day05/demo/pathRequestServlet
// *** 以上都不获得get请求的参数
//5 获得get请求的参数,获得的是所有参数的一个字符串
String queryString = request.getQueryString();
System.out.println(" 5 queryString -->" + queryString); //-->username=jack&password=1234
* 协议
request.getProtocol();
* 请求头
* java.lang.String getHeader(java.lang.String name) 获得指定名称的头信息(一条)【★★★】
* long getDateHeader(java.lang.String name) 获得特殊数据,时间
* int getIntHeader(java.lang.String name) 获得特殊数据,整型
* java.util.Enumeration getHeaderNames() 获得所有的请求头的名称
* java.util.Enumeration getHeaders(java.lang.String name) 获得指定名称头的所有内容
* 实例:防盗链,(不能直接访问 /refererTwoServlet)
* 请求体
* ServletInputStream getInputStream() 获得请求体的所有内容。(之后讲,文件上传)
* 核心API
* 属性操作
* xxxAttribute (set / get / remove) 服务器端【★★★】
* 获得参数
* 获得浏览器 发送给 服务器端的参数(Parameter)
* API【★★★】
* 实例:url?username=jack&username=rose&username=tom&password=1234
* getParameter(java.lang.String name) 获得指定参数的第一个值,如果数据不存在获得null 。
* 例如:getParameter("username") 获得 jack
* java.lang.String[] getParameterValues(java.lang.String name) 获得指定参数的所有的值。
* 例如:getParameterValues("username") ,获得[jack,rose,tom]
* java.util.Map<String,String[]> getParameterMap() 获得所有的内容,key 参数的名称 ,value 该参数的所有的值
* 例如:{username=[jack,rose,tom],password=[1234]}
* 中文乱码
* POST请求【★★★】
* 设置 setCharacterEncoding(java.lang.String env) ,设置字符编码
* GET请求
* new String(username.getBytes("ISO-8859-1"), "字符集");
好像有点懂了,貌似这些目前还是比较有争议的,有个大概的理解就好啦。