个人理解,仅供参考,多多指教(URL URI 表示对应的对象)。
问题:
在获取项目的根目录时,一开始直接用getResource()的方法得到URL的对象,然后去getPath()。在我自己的电脑上测试没什么问题。但是提交到服务器上测试时,通过getPath()获取到的路径却乱码了。百思不得其解。
后来用getResource()的带的URL对象.toURI()获取到URI对象,再getPath(),得到的路径就是完整的路径了。
原因:
URL.getPath() 会经过application/x-www- form-urlencoded编码,所以如果你服务器上的路径中有特殊的字符&%或者空格,那么会自动帮你编码。而URI.getPath()不会帮你编码,直接返回对应的路径。
延伸:
为什么URL.getPath() 会自动进行编码,而URI不会?这就要谈到URL和URI的区别了。
(截取百度百科)
URL:统一资源定位符 ,是对可以从互联网上得到的资源的位置和访问方法的一种唯一标识,是互联网上标准资源的地址。
URI:统一资源标识符,是一个用于标识某个唯一互联网资源名称的字符串。
还有他们一个家人 URN:统一资源名称,标识一个某个唯一互联网资源实体的标识符,但是不能定位到资源的位置。
从上面可以看出,URI 分为URL和URN两种,URL和URN 都是表示唯一的一个资源,但他们之间最明显的区别就是,是否能定位到表示的资源实体。就像地球上的人本质上分为男人和女人(故意找茬的我打死你。。。)。
mailto:cay@horstman.com
上面的是一个URI,但是他不能定位资源的位置,所以他是一个URN。
URL 中 L 表示Locator 定位器的意思,他能定位到资源的具体位置。例如:
https://baike.baidu.com/item file/url/110640.html
红色部分表示 指定的传输协议,蓝色部分指存放资源的服务器的域名系统 (DNS) 主机名或 IP 地址,黑色部分就是路径(path)表示110640.html文件在服务器上的具体位置,开始URL.getPath()获取到的就是黑色部分。回到问题,为什么URL.getPath()会自动编码。因为URL是一定需要能定位到资源的字符,如果你的路径中包含了特殊字符或者空格,那么肯定是访问(定位)不到代表的资源的。所以JDK会使用application/x-www- form-urlencoded对路径进行编码,已确保你的路径能正常的访问。而URI不会自动编码是因为他包括了URL和URI,所以URI并不代表一定需要定位到资源,所以不会自动编码。