java解析url参数到hashMap

tomcat解析url参数的解析方式 拿出来做一个备份 方便以后使用

  public static void parseParameters(Map map, String data, String encoding)
	    throws UnsupportedEncodingException
	  {
	    if ((data == null) || (data.length() <= 0))
	    {
	      return;
	    }

	    byte[] bytes = null;
	    try {
	      if (encoding == null)
	        bytes = data.getBytes();
	      else
	        bytes = data.getBytes(encoding);
	    }
	    catch (UnsupportedEncodingException uee)
	    {
	    }
	    parseParameters(map, bytes, encoding);
	  }
	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++)] = 32;
          break;
        case '%':
          data[(ox++)] = (byte)((convertHexDigit(data[(ix++)]) << 4) + convertHexDigit(data[(ix++)]));

          break;
        default:
          data[(ox++)] = c;
        }
      }

      if (key != null) {
        value = new String(data, 0, ox, encoding);
        putMapEntry(map, key, value);
      }
    }
  }
	  private static void putMapEntry(Map map, String name, String value)
	  {
	    String[] newValues = null;
	    String[] oldValues = (String[])(String[])map.get(name);
	    if (oldValues == null) {
	      newValues = new String[1];
	      newValues[0] = value;
	    } else {
	      newValues = new String[oldValues.length + 1];
	      System.arraycopy(oldValues, 0, newValues, 0, oldValues.length);
	      newValues[oldValues.length] = value;
	    }
	    map.put(name, newValues);
	  }
	  private static byte convertHexDigit(byte b)
	  {
	    if ((b >= 48) && (b <= 57)) return (byte)(b - 48);
	    if ((b >= 97) && (b <= 102)) return (byte)(b - 97 + 10);
	    if ((b >= 65) && (b <= 70)) return (byte)(b - 65 + 10);
	    return 0;
	  }

 

### Java解析URL参数的方法 在Java中,可以通过多种方式来解析URL中的参数。以下是几种常见的实现方法: #### 方法一:手动解析字符串 可以利用`request.getQueryString()`获取网址中的参数字符串[^1],然后通过分割符`&`和`=`对手动拆分键值对。 ```java public static Map<String, String> parseUrlParameters(String queryString) { Map<String, String> parameters = new HashMap<>(); if (queryString != null && !queryString.isEmpty()) { for (String param : queryString.split("&")) { String[] pair = param.split("="); if (pair.length >= 2) { String key = URLDecoder.decode(pair[0], StandardCharsets.UTF_8); String value = URLDecoder.decode(pair[1], StandardCharsets.UTF_8); parameters.put(key, value); } } } return parameters; } ``` 此方法适用于简单的场景,但对于复杂的编码情况可能不够健壮。 --- #### 方法二:使用`URI`类与自定义逻辑 通过`java.net.URI`类提取查询部分,并进一步处理参数[^2]。 ```java import java.net.URI; public static Map<String, String> getParamsFromUri(URI uri) throws Exception { String query = uri.getRawQuery(); // 获取原始查询串 Map<String, String> paramsMap = new HashMap<>(); if (query != null && !query.isEmpty()) { for (String param : query.split("&")) { String[] keyValue = param.split("=", 2); // 按 "=" 切割成两部分 if (keyValue.length == 2) { String decodedKey = URLDecoder.decode(keyValue[0], "UTF-8"); String decodedValue = URLDecoder.decode(keyValue[1], "UTF-8"); paramsMap.put(decodedKey, decodedValue); } else if (keyValue.length == 1) { String decodedKey = URLDecoder.decode(keyValue[0], "UTF-8"); paramsMap.put(decodedKey, ""); } } } return paramsMap; } ``` 这种方法更加结构化,适合需要严格控制输入的情况。 --- #### 方法三:借助第三方库Apache Commons Codec 如果希望减少手写代码的工作量,可以选择引入成熟的开源库,如`Apache HttpClient`或`Commons Codec`[^3]。 示例代码如下: ```xml <!-- Maven依赖 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependency> ``` ```java import org.apache.commons.text.StrTokenizer; public static Map<String, String> parseWithCommonsCodec(String queryString) { Map<String, String> paramMap = new LinkedHashMap<>(); StrTokenizer tokenizer = new StrTokenizer(queryString, "&".toCharArray()); while (tokenizer.hasNext()) { String token = tokenizer.nextToken(); int index = token.indexOf('='); if (index > 0) { String key = URLDecoder.decode(token.substring(0, index), StandardCharsets.UTF_8); String value = URLDecoder.decode(token.substring(index + 1), StandardCharsets.UTF_8); paramMap.put(key, value); } } return paramMap; } ``` 这种方式不仅简化了开发流程,还提供了更高的可靠性和性能优化。 --- #### 测试样例 假设有一个URL `http://www.example.com/page?id=1&name=%E5%B0%8F%E6%98%8E`,其对应的参数应为 `{id=1, name=小明}`[^4]。 测试代码如下: ```java public static void main(String[] args) throws Exception { URI uri = new URI("http://www.example.com/page?id=1&name=%E5%B0%8F%E6%98%8E"); System.out.println(getParamsFromUri(uri)); } ``` 输出结果将是: ```plaintext {id=1, name=小明} ``` --- ### 总结 上述三种方法各有优劣,具体选择取决于项目需求和技术栈偏好。对于小型应用,可以直接采用手动解析;而对于大型系统,则推荐使用成熟稳定的第三方库以降低维护成本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值