使用RequestUtil解析URL查询参数

本文介绍如何使用Tomcat的RequestUtil工具类解析URL查询参数。内容包括6.0版本源码链接,使用示例,以及注意事项,如只解析查询参数部分,Map的value为数组格式。解析时需注意避免将整个URL提交,防止错误解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
            }
        }

    }

实现不难,省的自己写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值