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:[email protected]。也就是说,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是一种语义上的抽象概念,可以是绝对的,也可

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

以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。注:这里的绝对(absolute)是指包含scheme,而相对(relative)则不包含scheme。URI抽象结构 [scheme:]scheme-specific-part[#fragment][scheme:][//authority][path][?query][#fragment]authority为[[email protected]]host[:port]参考资料:http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URI.htmlhttp://en.wikipedia.org/wiki/Uniform_Resource_Identifierhttp://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.htmlps: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对象不适用。