Java解析url地址字符串,获得请求参数(基于JDK1.4)

阅读更多

【需求描述】

项目中,需要一个解析URL并获取参数信息的工具类。

JDK版本要求:1.4

 

【解决方案】

1)增加一个解析URL的HttpRequestParser工具类

public class HttpRequestParser

 

2)代码如下:

/*
 * 创建日期 2012-9-26
 *
 */
package com.test.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.security.Principal;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * 解析URL的HttpRequestParser工具类
 * 基于JDK版本1.4
 */
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 getParamsMap(String queryString, String enc) {   
	    Map paramsMap = new HashMap();   
	    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 = (String[])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 parameterMap;   
	  
	    Request() {   
	      this("");   
	    }   
	  
	    Request(String requestURI) {   
	      this.requestURI = requestURI;   
	      parameterMap = new HashMap();   
	    }   
	  
	    Request(String requestURI, Map parameterMap) {   
	      this.requestURI = requestURI;   
	      this.parameterMap = parameterMap;   
	    }   
	  
	    /**  
	     * 获得指定名称的参数  
	     * @param name  
	     * @return  
	     */  
	    public String getParameter(String name) {   
	      String[] values = (String[])parameterMap.get(name);   
	      if (values != null && values.length > 0) {   
	        return values[0];   
	      }   
	      return null;   
	    }   
	  
	    /**  
	     * 获得所有的参数名称  
	     * @return  
	     */  
	    public Enumeration getParameterNames() {   
	      return Collections.enumeration(parameterMap.keySet());   
	    }   
	  
	    /**  
	     * 获得指定名称的参数值(多个)  
	     * @param name  
	     * @return  
	     */  
	    public String[] getParameterValues(String name) {   
	      return (String[])parameterMap.get(name);   
	    }   
	  
	    /**  
	     * 获得请求的url地址  
	     * @return  
	     */  
	    public String getRequestURI() {   
	      return requestURI;   
	    }   
	  
	    /**  
	     * 获得 参数-值Map  
	     * @return  
	     */  
	    public Map getParameterMap() {   
	      return parameterMap;   
	    }   
	  
	    public String toString() {   
	      StringBuffer buf = new StringBuffer();   
	      buf.append("{");   
	      buf.append("\n  url = ").append(this.requestURI);   
	      buf.append("\n  paramsMap = {");   
	      if (this.parameterMap.size() > 0) {   	      	
	        Iterator it = this.parameterMap.entrySet().iterator(); 
	        while(it.hasNext()){ 
	          Map.Entry e=(Map.Entry)it.next(); 
	          buf.append(e.getKey()).append("=").append(Arrays.asList((Object[])e.getValue()).toString()).append(",");
	        }   
	        buf.deleteCharAt(buf.length() - 1);   
	      }   
	      buf.append("}\n}");   
	      return buf.toString();   
	    }   
	   //  剩下的函数,自己根据需求实现了,一般返回0或者null即可   
	   //  这里就不贴了,HttpServletRequest的接口方法也太多了   

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getAuthType()
		 */
		public String getAuthType() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getCookies()
		 */
		public Cookie[] getCookies() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getDateHeader(java.lang.String)
		 */
		public long getDateHeader(String arg0) {
			// TODO 自动生成方法存根
			return 0;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String)
		 */
		public String getHeader(String arg0) {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getHeaders(java.lang.String)
		 */
		public Enumeration getHeaders(String arg0) {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getHeaderNames()
		 */
		public Enumeration getHeaderNames() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getIntHeader(java.lang.String)
		 */
		public int getIntHeader(String arg0) {
			// TODO 自动生成方法存根
			return 0;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getMethod()
		 */
		public String getMethod() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getPathInfo()
		 */
		public String getPathInfo() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getPathTranslated()
		 */
		public String getPathTranslated() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getContextPath()
		 */
		public String getContextPath() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getQueryString()
		 */
		public String getQueryString() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getRemoteUser()
		 */
		public String getRemoteUser() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#isUserInRole(java.lang.String)
		 */
		public boolean isUserInRole(String arg0) {
			// TODO 自动生成方法存根
			return false;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getUserPrincipal()
		 */
		public Principal getUserPrincipal() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId()
		 */
		public String getRequestedSessionId() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getRequestURL()
		 */
		public StringBuffer getRequestURL() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getServletPath()
		 */
		public String getServletPath() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getSession(boolean)
		 */
		public HttpSession getSession(boolean arg0) {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#getSession()
		 */
		public HttpSession getSession() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid()
		 */
		public boolean isRequestedSessionIdValid() {
			// TODO 自动生成方法存根
			return false;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromCookie()
		 */
		public boolean isRequestedSessionIdFromCookie() {
			// TODO 自动生成方法存根
			return false;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromURL()
		 */
		public boolean isRequestedSessionIdFromURL() {
			// TODO 自动生成方法存根
			return false;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromUrl()
		 */
		public boolean isRequestedSessionIdFromUrl() {
			// TODO 自动生成方法存根
			return false;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
		 */
		public Object getAttribute(String arg0) {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getAttributeNames()
		 */
		public Enumeration getAttributeNames() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getCharacterEncoding()
		 */
		public String getCharacterEncoding() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
		 */
		public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException {
			// TODO 自动生成方法存根
			
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getContentLength()
		 */
		public int getContentLength() {
			// TODO 自动生成方法存根
			return 0;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getContentType()
		 */
		public String getContentType() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getInputStream()
		 */
		public ServletInputStream getInputStream() throws IOException {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getProtocol()
		 */
		public String getProtocol() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getScheme()
		 */
		public String getScheme() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getServerName()
		 */
		public String getServerName() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getServerPort()
		 */
		public int getServerPort() {
			// TODO 自动生成方法存根
			return 0;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getReader()
		 */
		public BufferedReader getReader() throws IOException {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getRemoteAddr()
		 */
		public String getRemoteAddr() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getRemoteHost()
		 */
		public String getRemoteHost() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#setAttribute(java.lang.String, java.lang.Object)
		 */
		public void setAttribute(String arg0, Object arg1) {
			// TODO 自动生成方法存根
			
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
		 */
		public void removeAttribute(String arg0) {
			// TODO 自动生成方法存根
			
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getLocale()
		 */
		public Locale getLocale() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getLocales()
		 */
		public Enumeration getLocales() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#isSecure()
		 */
		public boolean isSecure() {
			// TODO 自动生成方法存根
			return false;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String)
		 */
		public RequestDispatcher getRequestDispatcher(String arg0) {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getRealPath(java.lang.String)
		 */
		public String getRealPath(String arg0) {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getRemotePort()
		 */
		public int getRemotePort() {
			// TODO 自动生成方法存根
			return 0;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getLocalName()
		 */
		public String getLocalName() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getLocalAddr()
		 */
		public String getLocalAddr() {
			// TODO 自动生成方法存根
			return null;
		}

		/* (非 Javadoc)
		 * @see javax.servlet.ServletRequest#getLocalPort()
		 */
		public int getLocalPort() {
			// TODO 自动生成方法存根
			return 0;
		}
	  } 
}

 

 

PS:原来JDK1.5版本的解析URL工具类以及测试代码参见

http://yy629.iteye.com/blog/420432(解析url地址字串,获得请求参数)

你可能感兴趣的:(Java,URL)