【需求描述】
项目中,需要一个解析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地址字串,获得请求参数)