使用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增加了其它功能,依赖其它包。这里我们只需要它的解析功能,所以够用即可。
使用方法很简单,如下例子所示:
有两点需要注意:
-这里只是解析查询参数,而不是全部的URL。例如URL本来类似于
- 使用的Map类型为
这里开始搞错了,写成了
改过来就成。
最后可以来看看RequestUtil的实现,其实主要是一个函数
实现不难,省的自己写了。
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); } } }
实现不难,省的自己写了。
相关文章推荐
- UGUI控件可拖拽移动类组件
- VUE也有自己的日历组件
- 《APUE.3E》用gdb调试ftw函数(图4-22)
- UILabel attributedText的一个坑
- easyui
- easyui的验证
- 浅谈Java设计模式(四)建造者模式(Builder)
- <java.util>PriorityQueue代码分析
- Angular-Ui-Router+ocLazyLoad动态加载脚本
- easyui--datetimebox插件,下拉框的日期不能全部显示,即一个月份中的天数未全部显示
- android测试详解_2-Building Local Unit Tests-本地单元测试
- easyui中datetimebox不显示日期框
- UVA - 10420 List of Conquests
- Codeforces 689 C The Values You Can Make(dp)
- CharSequence 只要要求是一串字符就行了可以有StringBuffer和StringBuilder
- Rescue 优先队列+广搜
- GO中url.Values作为参数传递的两种解析方法
- HDU 1242 Rescue【BFS+优先队列】
- UIView的clipsToBounds属性和CALayer的masksToBounds属性的比较
- UIView的clipsToBounds属性和CALayer的masksToBounds属性的比较