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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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值