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

解析类
- /**
- * CopyRight (C) 2008-2009 yeyong
- */
- package com.yy.ah.util;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.net.URLDecoder;
- import java.security.Principal;
- import java.util.*;
- import javax.servlet.RequestDispatcher;
- import javax.servlet.ServletInputStream;
- import javax.servlet.http.Cookie;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
- /**
- * HttpRequestParser工具类
- * @author yy
- * @date Jun 21, 2009 2:13:25 PM
- */
- public class HttpRequestParser {
- /**
- * 分析url字符串,采用utf-8解码
- * @param urlString
- * @return
- */
- public static Request parse(String urlString) {
- return parse(urlString, "utf-8");
- }
- /**
- * 分析url字符串,指定字符集进行解码
- * @param urlString
- * @param enc
- * @return
- */
- public static Request parse(String urlString, String enc) {
- if (urlString == null || urlString.length() == 0) {
- return new Request();
- }
- int questIndex = urlString.indexOf('?');
- if (questIndex == -1) {
- return new Request(urlString);
- }
- String url = urlString.substring(0, questIndex);
- String queryString = urlString.substring(questIndex + 1, urlString.length());
- return new Request(url, getParamsMap(queryString, enc));
- }
- private static Map<String, String[]> getParamsMap(String queryString, String enc) {
- Map<String, String[]> paramsMap = new HashMap<String, String[]>();
- if (queryString != null && queryString.length() > 0) {
- int ampersandIndex, lastAmpersandIndex = 0;
- String subStr, param, value;
- String[] paramPair, values, newValues;
- do {
- ampersandIndex = queryString.indexOf('&', lastAmpersandIndex) + 1;
- if (ampersandIndex > 0) {
- subStr = queryString.substring(lastAmpersandIndex, ampersandIndex - 1);
- lastAmpersandIndex = ampersandIndex;
- } else {
- subStr = queryString.substring(lastAmpersandIndex);
- }
- paramPair = subStr.split("=");
- param = paramPair[0];
- value = paramPair.length == 1 ? "" : paramPair[1];
- try {
- value = URLDecoder.decode(value, enc);
- } catch (UnsupportedEncodingException ignored) {
- }
- if (paramsMap.containsKey(param)) {
- values = paramsMap.get(param);
- int len = values.length;
- newValues = new String[len + 1];
- System.arraycopy(values, 0, newValues, 0, len);
- newValues[len] = value;
- } else {
- newValues = new String[] { value };
- }
- paramsMap.put(param, newValues);
- } while (ampersandIndex > 0);
- }
- return paramsMap;
- }
- /**
- * 请求对象
- * @author yy
- * @date Jun 21, 2009 2:17:31 PM
- */
- public static class Request implements HttpServletRequest {
- private String requestURI;
- private Map<String, String[]> parameterMap;
- Request() {
- this("");
- }
- Request(String requestURI) {
- this.requestURI = requestURI;
- parameterMap = new HashMap<String, String[]>();
- }
- Request(String requestURI, Map<String, String[]> parameterMap) {
- this.requestURI = requestURI;
- this.parameterMap = parameterMap;
- }
- /**
- * 获得指定名称的参数
- * @param name
- * @return
- */
- public String getParameter(String name) {
- String[] values = parameterMap.get(name);
- if (values != null && values.length > 0) {
- return values[0];
- }
- return null;
- }
- /**
- * 获得所有的参数名称
- * @return
- */
- public Enumeration<String> getParameterNames() {
- return Collections.enumeration(parameterMap.keySet());
- }
- /**
- * 获得指定名称的参数值(多个)
- * @param name
- * @return
- */
- public String[] getParameterValues(String name) {
- return parameterMap.get(name);
- }
- /**
- * 获得请求的url地址
- * @return
- */
- public String getRequestURI() {
- return requestURI;
- }
- /**
- * 获得 参数-值Map
- * @return
- */
- public Map<String, String[]> getParameterMap() {
- return parameterMap;
- }
- @Override
- public String toString() {
- StringBuilder buf = new StringBuilder();
- buf.append("{");
- buf.append("\n url = ").append(this.requestURI);
- buf.append("\n paramsMap = {");
- if (this.parameterMap.size() > 0) {
- for (Map.Entry<String, String[]> e : this.parameterMap.entrySet()) {
- buf.append(e.getKey()).append("=").append(Arrays.toString(e.getValue())).append(",");
- }
- buf.deleteCharAt(buf.length() - 1);
- }
- buf.append("}\n}");
- return buf.toString();
- }
- // 剩下的函数,自己根据需求实现了,一般返回0或者null即可
- // 这里就不贴了,HttpServletRequest的接口方法也太多了
- }
- }
简单测试一下
- /**
- * CopyRight (C) 2008-2009 yeyong
- */
- package test.com.yy.ah.util;
- import java.io.UnsupportedEncodingException;
- import java.util.Arrays;
- import com.yy.ah.util.HttpRequestParser;
- import javax.servlet.http.HttpServletRequest;
- /**
- * HttpRequestParser 测试程序
- * @author yy
- * @date Jun 21, 2009 3:01:01 PM
- */
- public class HttpRequestParserTest {
- public static void main(String[] args) throws UnsupportedEncodingException {
- 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"
- + "&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";
- HttpServletRequest request = HttpRequestParser.parse(href);
- System.out.println(request);
- System.out.println("full URL: " + href);
- System.out.println("request URL: " + request.getRequestURL());
- System.out.println("id: " + request.getParameter("id"));
- System.out.println("chinese: " + request.getParameter("chinese"));
- System.out.println("hobbies: " + Arrays.toString(request.getParameterValues("hobby")));
- System.out.println("backUrl: " + request.getParameter("backUrl"));
- System.out.println();
- String backUrl = request.getParameter("backUrl");
- request = HttpRequestParser.parse(backUrl);
- System.out.println(request);
- System.out.println("full URL: " + backUrl);
- System.out.println("request URL: " + request.getRequestURL());
- System.out.println("search name: " + request.getParameter("search_name"));
- System.out.println("page: " + request.getParameter("page"));
- System.out.println("order: " + request.getParameter("order"));
- }
- }
- // 输出结果: 显示比较乱..一行显示字数太少造成
- //
- // {
- // url = http://127.0.0.1/xxx/yyy.do
- // 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]}
- // }
- // 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
- // request URL: http://127.0.0.1/xxx/yyy.do
- // id: A00509062015035396
- // chinese: 中文参数OK
- // hobbies: [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
- //
- // {
- // url = http://127.0.0.1/xxx/list.do
- // paramsMap = {page=[4],search_name=[叶永],order=[username asc]}
- // }
- // full URL: http://127.0.0.1/xxx/list.do?search_name=%E5%8F%B6%E6%B0%B8&page=4&order=username+asc
- // request URL: http://127.0.0.1/xxx/list.do
- // search name: 叶永
- // page: 4
- // order: username asc