【需求描述】
项目中,需要一个解析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中生成二维码,我们可以使用一些库,如`qrcode-jdk1.4.jar`,这个库提供了生成二维码的功能。以下是一个简单的Java生成二维码的示例: ```java import net.sf.qrcodegen.QRCode; public class ...
- **数据库连接**:确保数据库连接字符串中指定了正确的字符集。 - **文件读写**:使用合适的编码来读取或写入文件,例如在使用Java的`FileReader`和`FileWriter`时,需要明确指定字符编码。 - **日志记录**:在记录...
- **字符串处理**: 字符串操作方法。 #### 三、类和接口 - **类的概念**: 对象的模板,定义对象的属性和行为。 - **构造函数**: 初始化对象的方法。 - **继承**: 子类继承父类的属性和方法。 - **接口**: 定义行为...
- **视图名称**:直接返回字符串作为视图名称。 - **ModelAndView**:返回`ModelAndView`对象,设置模型数据和视图名称。 **2.5 常用注解** - `@Controller`:标记类为控制器。 - `@RequestMapping`:指定请求映射...
表达式(Expression)将Java表达式的结果转换为字符串,并直接插入到HTML输出中。 **2.5 JSP指令标签** page指令用于配置整个JSP页面的属性,如字符编码、导入的包等;include指令用于在编译时将其他文件内容包含...
- **属性编辑**:Spring支持自定义属性编辑器,用于将字符串转换成特定类型的值。 - **访问Properties文件**:Spring提供了多种方式来读取和管理Properties文件中的配置信息。 ##### 2.3 AOP容器...
- **StringBuilder/StringBuffer**:可变字符串,后者是线程安全的。 - **重载和重写的区别**: - **重载**:同一个类中方法名相同但参数列表不同。 - **重写**:子类覆盖父类的方法。 - **抽象类和接口的区别*...
为了处理复杂的数据类型,Struts2提供了转换器机制,如通过`conversion.properties`文件自定义转换规则,这有助于将HTTP请求中的字符串转换成应用所需的对象类型。同时,Struts2支持国际化,通过配置`struts.custom....
- **与服务器通信**:使用URL类进行网络请求。 - **10.7 验证Applet对象在客户端如何存在的**: - **对象状态**:通过getDocumentBase()等方法检查。 #### 第11章:网络编程 - **11.1 网络编程的基础知识**: ...
- **commons-lang3**: 提供字符串和数据操作的公共方法。 - **javassist**: 字节码操作库。 #### 1.4 Struts2入门理论 **JavaEE设计模式** 对于理解Struts2的工作原理非常重要。其中,**前端控制器模式**是Struts2...
- 将 XML 字符串转换为 Document 对象 - 将 Document 对象转换为 XML 字符串 **7.40 XML Schema** - **定义**: 一种 XML 数据类型语言,用于描述 XML 文档的结构和数据类型。 - **优点**: - 强类型约束 - 更好...
- **基础类型**:Groovy支持整型、浮点型、字符串等多种基础数据类型,同时也支持复数、大整数等高级类型。 - **语法糖**:Groovy通过语法糖简化了列表、映射和范围等复杂数据结构的操作,提高了代码的可读性和简洁...
- **玩转Groovy**:通过简单的代码示例展示Groovy的基本用法,如字符串操作、集合处理等。 - **与Java的基本不同点**:Groovy在语法上与Java有许多相似之处,但也存在显著差异,例如闭包、元编程等高级特性。 - **...
- JSP(JavaServer Pages)是一种基于Java的服务器端技术,用于创建动态网页。它允许开发者将Java代码嵌入到HTML文档中,从而实现动态内容的生成。 - **1.2 JSP页面** - JSP页面是由HTML标记和嵌入其中的Java代码...
3.1.1 字符串资源 3.1.2 布局资源 3.1.3 资源引用语法 3.1.4 定义资源ID供以后使用 3.1.5 已编译和未编译的Android资源 3.2 Android关键资源 3.3 使用任意XML资源文件 3.4 使用原始资源 3.5...
3.1.1 字符串资源 3.1.2 布局资源 3.1.3 资源引用语法 3.1.4 定义资源ID供以后使用 3.1.5 已编译和未编译的Android资源 3.2 Android关键资源 3.3 使用任意XML资源文件 3.4 使用原始资源 3.5...