SpringMVC作为一个Web层框架避免不了要处理各种URI,因此提供了一个很方便的UriComponents
用于处理URI拼接、替换、编码等操作。UriComponents
的用法非常直观,这里我们直接通过几个例子进行演示。
下面例子我们通过UriComponents工具类构造了一个HTTPS协议的URI。
package com.gacfox.demo;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
public class Main {
public static void main(String[] args) {
// 构造UriComponents对象
UriComponents uriComponents =
UriComponentsBuilder.newInstance()
.scheme("https")
.host("google.com")
.port(443)
.path("/search")
.queryParam("q", "美女")
.build();
// 输出为字符串
String uri = uriComponents.encode().toString();
System.out.println(uri);
}
}
输出结果:
https://google.com:443/search?q=%E7%BE%8E%E5%A5%B3
上面代码中,我们通过UriComponentsBuilder
构造了一个URI并在URL编码后将其输出为字符串。通常来说URI的Schema和Host是必须指定的(虽然UriComponentsBuilder
并不要求你这样做),此外上面代码Port实际我们也可以不指定,因为HTTPS默认端口就是443。
如果说构造URI我们还能用字符串拼接的方式勉强实现,那用正则表达式解析URI可就比较麻烦了。SpringMVC的UriComponents
对象直接提供了URI解析功能,使用起来非常方便,我们直接看一个例子。
package com.gacfox.demo;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
// 解码URI
String uri = "https://google.com/search?q=%E7%BE%8E%E5%A5%B3";
uri = URLDecoder.decode(uri, "UTF-8");
// 从字符串构造UriComponents对象
UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(uri).build();
// 解析各种信息
System.out.println(uriComponents.getScheme());
System.out.println(uriComponents.getHost());
System.out.println(uriComponents.getPort());
System.out.println(uriComponents.getPath());
System.out.println(uriComponents.getQueryParams());
}
}
输出结果:
https
google.com
-1
/search
{q=[美女]}
上面代码中我们首先将URI从编码状态还原,然后使用fromHttpUrl()
方法来构造UriComponents
对象,最后调用其中的各种get
方法获取我们需要的信息。注意这里由于原URI字符串中我们没有明确写端口,因此getPort()
方法返回的是-1
。
注意:这里我们使用的fromHttpUrl()
方法仅支持HTTP或HTTPS协议,如果URI字符串的Schema为其它协议如FTP等会抛出异常。如果需要支持其他协议,可以更换为fromUriString()
方法,这个方法能解析任何符合URI格式的字符串,不再限制协议为HTTP或HTTPS。