url和uri区别

url和uri区别

这两天在写代码的时候,由于涉及到资源的位置,因此,需要在Java Bean中定义一些字段,用来表示资源的位置,比如:imgUrl,logoUri等等。但是,每次定义的时候,心里都很纠结,是该用imgUrl还是imgUri呢?

同样的,另外一个问题:String HttpServletRequest.getRequestURI();和StringBuffer HttpServletRequest.getRequestURL();返回的内容有何不同?为什么会如此?

带着这些问题到网上去搜了下,没发现让自己看了明白的解释,于是,想到了Java类库里有两个对应的类java.net.URI和java.net.URL,终于,在这两个类里的javadoc里找到了答案。

URIs, URLs, and URNs

首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。而URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。也就是说,URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的,schema必须被指定。

ok,现在回答文章开头提出的问题,到底是imgUrl好呢,还是imgUri好?显然,如果说imgUri是肯定没问题的,因为即使它实际上是url,那它也是uri的一种。那么用imgUrl有没有问题呢?此时则要看它的可能取值,如果是绝对路径,能够定位的,那么用imgUrl是没问题的,而如果是相对路径,那还是不要用ImgUrl的好。总之,用imgUri是肯定没问题的,而用imgUrl则要视实际情况而定。

第二个,从HttpServletRequest的javadoc中可以看出,getRequestURI返回一个String,“the part of this request’s URL from the protocol name up to the query string in the first line of the HTTP request”,比如“POST /some/path.html?a=b HTTP/1.1”,则返回的值为”/some/path.html”。现在可以明白为什么是getRequestURI而不是getRequestURL了,因为此处返回的是相对的路径。而getRequestURL返回一个StringBuffer,“The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.”,完整的请求资源路径,不包括querystring。

总结一下:URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。

注:这里的绝对(absolute)是指包含scheme,而相对(relative)则不包含scheme。

URI抽象结构 [scheme:]scheme-specific-part[#fragment]

[scheme:][//authority][path][?query][#fragment]

authority为[user-info@]host[:port]

参考资料:

http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URI.html

http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.html

ps:

java.net.URL类不提供对标准RFC2396规定的特殊字符的转义,因此需要调用者自己对URL各组成部分进行encode。而java.net.URI则会提供转义功能。因此The recommended way to manage the encoding and decoding of URLs is to use java.net.URI. 可以使用URI.toURL()和URL.toURI()方法来对两个类型的对象互相转换。对于HTML FORM的url encode/decode可以使用java.net.URLEncoder和java.net.URLDecoder来完成,但是对URL对象不适用。

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
24ZMPnWeDfPu/NfSF6qWPw==

上一篇:springboot+element ui实现表单和多张图片的增加功能


下一篇:原来DataTable的Distinct竟如此简单![转]