您的位置:首页 > 产品设计 > UI/UE

使用RequestUtil解析URL查询参数

2016-07-08 17:04 507 查看
RequestUtil是Tomcat出品,对URL的查询进行解析。

6.0版本的源码在这里:

http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/RequestUtil.java?view=markup

新的有8.0,直接改一下上边链接里的版本号就可以。但是6.0版本没有其它依赖,可以直接用,8.0增加了其它功能,依赖其它包。这里我们只需要它的解析功能,所以够用即可。

使用方法很简单,如下例子所示:

String query="name=tom&age=ee&";

Map<String, String[]> values = new HashMap<>();
try {
RequestUtil.parseParameters(values, query, "utf8");
for (Map.Entry<String, String[]> entry : values.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue()[0] + ";");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}


有两点需要注意:

-这里只是解析查询参数,而不是全部的URL。例如URL本来类似于
http://www.baidu.com?q=sd&f=3
,这里解析的是
?
之后的部分,如果全部提交给它解析,会把
http://www.baidu.com?q
当作是一个key;

- 使用的Map类型为
Map<String, String[]>
,也就是value是数组格式的。

这里开始搞错了,写成了
Map<String, String>
类型,结果一直报错:

[Ljava.lang.String; cannot be cast to java.lang.String


改过来就成。

最后可以来看看RequestUtil的实现,其实主要是一个函数

public static void parseParameters(Map map, byte[] data, String encoding)
throws UnsupportedEncodingException {

if (data != null && data.length > 0) {
int    ix = 0;
int    ox = 0;
String key = null;
String value = null;
while (ix < data.length) {
byte c = data[ix++];
switch ((char) c) {
case '&':
value = new String(data, 0, ox, encoding);
if (key != null) {
putMapEntry(map, key, value);
key = null;
}
ox = 0;
break;
case '=':
if (key == null) {
key = new String(data, 0, ox, encoding);
ox = 0;
} else {
data[ox++] = c;
}
break;
case '+':
data[ox++] = (byte)' ';
break;
case '%':
data[ox++] = (byte)((convertHexDigit(data[ix++]) << 4)
+ convertHexDigit(data[ix++]));
break;
default:
data[ox++] = c;
}
}
//The last value does not end in '&'.  So save it now.
if (key != null) {
value = new String(data, 0, ox, encoding);
putMapEntry(map, key, value);
}
}

}


实现不难,省的自己写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: