热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解析url地址字串,获得请求参数

在项目中出现了要解析url地址字符串并获得请求的参数,故,写了这段小代码后注:现在发现这个工具类还挺好用的,尤其在一些测试里,可以简单的模仿HttpSe



在项目中出现了要解析url地址字符串并获得请求的参数,故,写了这段小代码 
后注: 现在发现这个工具类还挺好用的,尤其在一些测试里,可以简单的模仿HttpServletRequest了 
解析类
 
Java代码   收藏代码
  1. /** 
  2.  * CopyRight (C) 2008-2009 yeyong 
  3.  */  
  4. package com.yy.ah.util;  
  5.   
  6. import java.io.BufferedReader;  
  7. import java.io.IOException;  
  8. import java.io.UnsupportedEncodingException;  
  9. import java.net.URLDecoder;  
  10. import java.security.Principal;  
  11. import java.util.*;  
  12.   
  13. import javax.servlet.RequestDispatcher;  
  14. import javax.servlet.ServletInputStream;  
  15. import javax.servlet.http.COOKIE;  
  16. import javax.servlet.http.HttpServletRequest;  
  17. import javax.servlet.http.HttpSession;  
  18.   
  19. /** 
  20.  * HttpRequestParser工具类 
  21.  * @author yy 
  22.  * @date Jun 21, 2009 2:13:25 PM 
  23.  */  
  24. public class HttpRequestParser {  
  25.   /** 
  26.    * 分析url字符串,采用utf-8解码 
  27.    * @param urlString 
  28.    * @return 
  29.    */  
  30.   public static Request parse(String urlString) {  
  31.     return parse(urlString, "utf-8");  
  32.   }  
  33.   
  34.   /** 
  35.    * 分析url字符串,指定字符集进行解码 
  36.    * @param urlString 
  37.    * @param enc 
  38.    * @return 
  39.    */  
  40.   public static Request parse(String urlString, String enc) {  
  41.     if (urlString == null || urlString.length() == 0) {  
  42.       return new Request();  
  43.     }  
  44.     int questIndex = urlString.indexOf('?');  
  45.     if (questIndex == -1) {  
  46.       return new Request(urlString);  
  47.     }  
  48.     String url = urlString.substring(0, questIndex);  
  49.     String queryString = urlString.substring(questIndex + 1, urlString.length());  
  50.     return new Request(url, getParamsMap(queryString, enc));  
  51.   }  
  52.   
  53.   private static Map getParamsMap(String queryString, String enc) {  
  54.     Map paramsMap = new HashMap();  
  55.     if (queryString != null && queryString.length() > 0) {  
  56.       int ampersandIndex, lastAmpersandIndex = 0;  
  57.       String subStr, param, value;  
  58.       String[] paramPair, values, newValues;  
  59.       do {  
  60.         ampersandIndex = queryString.indexOf('&', lastAmpersandIndex) + 1;  
  61.         if (ampersandIndex > 0) {  
  62.           subStr = queryString.substring(lastAmpersandIndex, ampersandIndex - 1);  
  63.           lastAmpersandIndex = ampersandIndex;  
  64.         } else {  
  65.           subStr = queryString.substring(lastAmpersandIndex);  
  66.         }  
  67.         paramPair = subStr.split("=");  
  68.         param = paramPair[0];  
  69.         value = paramPair.length == 1 ? "" : paramPair[1];  
  70.         try {  
  71.           value = URLDecoder.decode(value, enc);  
  72.         } catch (UnsupportedEncodingException ignored) {  
  73.         }  
  74.         if (paramsMap.containsKey(param)) {  
  75.           values = paramsMap.get(param);  
  76.           int len = values.length;  
  77.           newValues = new String[len + 1];  
  78.           System.arraycopy(values, 0, newValues, 0, len);  
  79.           newValues[len] = value;  
  80.         } else {  
  81.           newValues = new String[] { value };  
  82.         }  
  83.         paramsMap.put(param, newValues);  
  84.       } while (ampersandIndex > 0);  
  85.     }  
  86.     return paramsMap;  
  87.   }  
  88.   
  89.   /** 
  90.    * 请求对象 
  91.    * @author yy 
  92.    * @date Jun 21, 2009 2:17:31 PM 
  93.    */  
  94.   public static class Request implements HttpServletRequest {  
  95.     private String requestURI;  
  96.     private Map parameterMap;  
  97.   
  98.     Request() {  
  99.       this("");  
  100.     }  
  101.   
  102.     Request(String requestURI) {  
  103.       this.requestURI = requestURI;  
  104.       parameterMap = new HashMap();  
  105.     }  
  106.   
  107.     Request(String requestURI, Map parameterMap) {  
  108.       this.requestURI = requestURI;  
  109.       this.parameterMap = parameterMap;  
  110.     }  
  111.   
  112.     /** 
  113.      * 获得指定名称的参数 
  114.      * @param name 
  115.      * @return 
  116.      */  
  117.     public String getParameter(String name) {  
  118.       String[] values = parameterMap.get(name);  
  119.       if (values != null && values.length > 0) {  
  120.         return values[0];  
  121.       }  
  122.       return null;  
  123.     }  
  124.   
  125.     /** 
  126.      * 获得所有的参数名称 
  127.      * @return 
  128.      */  
  129.     public Enumeration getParameterNames() {  
  130.       return Collections.enumeration(parameterMap.keySet());  
  131.     }  
  132.   
  133.     /** 
  134.      * 获得指定名称的参数值(多个) 
  135.      * @param name 
  136.      * @return 
  137.      */  
  138.     public String[] getParameterValues(String name) {  
  139.       return parameterMap.get(name);  
  140.     }  
  141.   
  142.     /** 
  143.      * 获得请求的url地址 
  144.      * @return 
  145.      */  
  146.     public String getRequestURI() {  
  147.       return requestURI;  
  148.     }  
  149.   
  150.     /** 
  151.      * 获得 参数-值Map 
  152.      * @return 
  153.      */  
  154.     public Map getParameterMap() {  
  155.       return parameterMap;  
  156.     }  
  157.   
  158.     @Override  
  159.     public String toString() {  
  160.       StringBuilder buf = new StringBuilder();  
  161.       buf.append("{");  
  162.       buf.append("\n  url = ").append(this.requestURI);  
  163.       buf.append("\n  paramsMap = {");  
  164.       if (this.parameterMap.size() > 0) {  
  165.         for (Map.Entry e : this.parameterMap.entrySet()) {  
  166.           buf.append(e.getKey()).append("=").append(Arrays.toString(e.getValue())).append(",");  
  167.         }  
  168.         buf.deleteCharAt(buf.length() - 1);  
  169.       }  
  170.       buf.append("}\n}");  
  171.       return buf.toString();  
  172.     }  
  173.    //  剩下的函数,自己根据需求实现了,一般返回0或者null即可  
  174.    //  这里就不贴了,HttpServletRequest的接口方法也太多了  
  175.   }  
  176. }  


简单测试一下 
Java代码   收藏代码
  1. /** 
  2.  * CopyRight (C) 2008-2009 yeyong 
  3.  */  
  4. package test.com.yy.ah.util;  
  5.   
  6. import java.io.UnsupportedEncodingException;  
  7. import java.util.Arrays;  
  8.   
  9. import com.yy.ah.util.HttpRequestParser;  
  10. import javax.servlet.http.HttpServletRequest;  
  11.   
  12. /** 
  13.  * HttpRequestParser 测试程序 
  14.  * @author yy 
  15.  * @date Jun 21, 2009 3:01:01 PM 
  16.  */  
  17. public class HttpRequestParserTest {  
  18.   
  19.   public static void main(String[] args) throws UnsupportedEncodingException {  
  20.     String href = "http://127.0.0.1/xxx/yyy.do?id=A00509062015035396&chinese=%E4%B8%AD%E6%96%87%E5%8F%82%E6%95%B0OK"  
  21.         + "&hobby=A&hobby=B&hobby=C"  
  22.         + "&backUrl=http%3A%2F%2F127.0.0.1%2Fxxx%2Flist.do%3Fsearch_name%3D%25E5%258F%25B6%25E6%25B0%25B8%26page%3D4%26order%3Dusername%2Basc";  
  23.   
  24.     HttpServletRequest request = HttpRequestParser.parse(href);  
  25.     System.out.println(request);  
  26.     System.out.println("full URL:     " + href);  
  27.     System.out.println("request URL:  " + request.getRequestURL());  
  28.     System.out.println("id:           " + request.getParameter("id"));  
  29.     System.out.println("chinese:      " + request.getParameter("chinese"));  
  30.     System.out.println("hobbies:      " + Arrays.toString(request.getParameterValues("hobby")));  
  31.     System.out.println("backUrl:      " + request.getParameter("backUrl"));  
  32.   
  33.     System.out.println();  
  34.     String backUrl = request.getParameter("backUrl");  
  35.     request = HttpRequestParser.parse(backUrl);  
  36.     System.out.println(request);  
  37.     System.out.println("full URL:     " + backUrl);  
  38.     System.out.println("request URL:  " + request.getRequestURL());  
  39.     System.out.println("search name:  " + request.getParameter("search_name"));  
  40.     System.out.println("page:         " + request.getParameter("page"));  
  41.     System.out.println("order:        " + request.getParameter("order"));  
  42.   }  
  43. }  
  44. //  输出结果:  显示比较乱..一行显示字数太少造成  
  45. //   
  46. //  {  
  47. //    url = http://127.0.0.1/xxx/yyy.do  
  48. //    paramsMap = {chinese=[中文参数OK],hobby=[A, B, C],backUrl=[http://127.0.0.1/xxx/list.do?search_name=%E5%8F%B6%E6%B0%B8&page=4&order=username+asc],id=[A00509062015035396]}  
  49. //  }  
  50. //  full URL:     http://127.0.0.1/xxx/yyy.do?id=A00509062015035396&chinese=%E4%B8%AD%E6%96%87%E5%8F%82%E6%95%B0OK&hobby=A&hobby=B&hobby=C&backUrl=http%3A%2F%2F127.0.0.1%2Fxxx%2Flist.do%3Fsearch_name%3D%25E5%258F%25B6%25E6%25B0%25B8%26page%3D4%26order%3Dusername%2Basc  
  51. //  request URL:  http://127.0.0.1/xxx/yyy.do  
  52. //  id:           A00509062015035396  
  53. //  chinese:      中文参数OK  
  54. //  hobbies:      [A, B, C]  
  55. //  backUrl:      http://127.0.0.1/xxx/list.do?search_name=%E5%8F%B6%E6%B0%B8&page=4&order=username+asc  
  56. //  
  57. //  {  
  58. //    url = http://127.0.0.1/xxx/list.do  
  59. //    paramsMap = {page=[4],search_name=[叶永],order=[username asc]}  
  60. //  }  
  61. //  full URL:     http://127.0.0.1/xxx/list.do?search_name=%E5%8F%B6%E6%B0%B8&page=4&order=username+asc  
  62. //  request URL:  http://127.0.0.1/xxx/list.do  
  63. //  search name:  叶永  
  64. //  page:         4  
  65. //  order:        username asc  


http://yy629.iteye.com/blog/420432


推荐阅读
author-avatar
温德军46867
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有