Java下的URL生成类

  该类用于生成一个可用的URL,方便URL的生成和管理。

/**
 * 构造的URL
 * @author Alvin
 */
final public class UrlBuilder {

	// 协议名称
	private String scheme;

	// 服务器名称
	private String serverName;

	// 端口号
	private int serverPort;

	// 上下文名称
	private String[] paths;

	// 参数集合
	private Map<String, Object> parameters;

	// 地址缓冲
	private String urlBuffer = null;

	// 路径缓冲
	private String pathBuffer = null;

	// 参数缓冲
	private String parametersBuffer = null;

	/**
	 * 构造器
	 */
	public UrlBuilder(String scheme, String serverName, int serverPort, String[] paths) {
		if (paths != null) {
			for (int i = 0; i < paths.length; i++) {
				paths[i] = trimSeparator(paths[i]);
			}
		}
		this.scheme = scheme;
		this.serverName = serverName;
		this.serverPort = serverPort;
		this.paths = paths;
	}

	/**
	 * 构造器
	 */
	public UrlBuilder(String serverName, int serverPort, String[] paths) {
		this("http", serverName, serverPort, paths);
	}

	/**
	 * 构造器
	 */
	public UrlBuilder(String serverName, int serverPort) {
		this(serverName, serverPort, null);
	}

	/**
	 * 构造器
	 */
	public UrlBuilder(String serverName) {
		this(serverName, 80, null);
	}

	/**
	 * 去除字符串前后的 /
	 */
	private static String trimSeparator(String path) {
		boolean b1 = path.startsWith("/"), b2 = path.endsWith("/");
		if (b1 && b2) {
			path = path.substring(1, path.length() - 1);
		} else if (b1) {
			path = path.substring(1);
		} else if (b2) {
			path = path.substring(0, path.length() - 1);
		}
		return path;
	}

	/**
	 * 添加一个目录
	 */
	public void addPath(String path) {
		path = trimSeparator(path);
		if (path.isEmpty() == false) {
			pathBuffer = null;
			urlBuffer = null;
			if (paths == null) {
				paths = new String[] { path };
			} else {
				paths = Arrays.copyOf(paths, paths.length + 1);
				paths[paths.length - 1] = path;
			}
		}
	}

	/**
	 * 添加若干目录
	 */
	public void addPath(String...paths) {
		List<String> pathList = new ArrayList<>();
		for (String path : paths) {
			path = trimSeparator(path);
			if (path.isEmpty() == false) {
				pathList.add(path);
			}
		}
		if (pathList.isEmpty() == false) {
			pathBuffer = null;
			urlBuffer = null;
			if (this.paths == null) {
				this.paths = pathList.toArray(new String[pathList.size()]);
			} else {
				int len = this.paths.length;
				this.paths = Arrays.copyOf(this.paths, len + pathList.size());
				for (int i = 0; i < pathList.size(); i++) {
					this.paths[len + i] = pathList.get(i);
				}
			}
		}
	}

	/**
	 * 删除目录
	 */
	public String removePath(int index) {
		String value = paths[index];
		String[] newArray = new String[paths.length - 1];
		System.arraycopy(paths, 0, newArray, 0, index);
		System.arraycopy(paths, index + 1, newArray, index, newArray.length - index);
		paths = newArray;
		urlBuffer = null;
		pathBuffer = null;
		return value;
	}

	/**
	 * 转为字符串
	 */
	public String toString(String encoding) {
		if (urlBuffer == null) {
			StringBuilder b = new StringBuilder(scheme);
			b.append("://");
			b.append(serverName);
			b.append(serverPort == 80 ? "" : ":" + serverPort);
			String path = getPath();
			if (path.isEmpty() == false) {
				b.append("/" + path);
			}
			String paramString = getParamString(encoding);
			if (paramString.isEmpty() == false) {
				b.append("?");
				b.append(paramString);
			}
			urlBuffer = b.toString();
		}
		return urlBuffer;
	}

	@Override
	public String toString() {
		return toString("UTF-8");
	}

	/**
	 * 添加一个参数
	 */
	public void addParameter(String name, Object value) {
		if (parameters == null) {
			parameters = new LinkedHashMap<>();
		}
		parametersBuffer = null;
		parameters.put(name, value);
	}

	/**
	 * 删除一个参数
	 */
	public Object removeParameter(String name) {
		if (parameters == null) {
			return null;
		}
		parametersBuffer = null;
		return parameters.remove(name);
	}

	/**
	 * 获取一个参数
	 */
	public Object getParameter(String name) {
		if (parameters == null) {
			return null;
		}
		return parameters.get(name);
	}

	public void setScheme(String scheme) {
		this.scheme = scheme;
		urlBuffer = null;
	}
	public String getScheme() {
		return scheme;
	}
	public void setServerName(String serverName) {
		this.serverName = serverName;
		urlBuffer = null;
	}
	public String getServerName() {
		return serverName;
	}
	public void setServerPort(int serverPort) {
		this.serverPort = serverPort;
		urlBuffer = null;
	}
	public int getServerPort() {
		return serverPort;
	}
	public String getPath(int index) {
		return paths[index];
	}
	public String getPath() {
		if (paths == null) {
			return "";
		}
		if (pathBuffer == null) {
			StringBuilder s = new StringBuilder();
			for (String path : paths) {
				if (s.length() > 0) {
					s.append("/");
				}
				s.append(path);
			}
			pathBuffer = s.toString();
		}
		return pathBuffer;
	}
	public String getParamString(String encoding) {
		if (parametersBuffer == null) {
			parametersBuffer = makeParameters(parameters, encoding);
		}
		return parametersBuffer;
	}
	public String getParamString() {
		return getParamString("UTF-8");
	}

	/**
	 * 解析URL
	 */
	public static UrlBuilder parse(String url, String urlEncoding) {
		String schema, serverName, path = null, queryString = null;
		int pos, pos2, port;

		pos = url.indexOf("://");
		if (pos < 0) {
			schema = "http";
			pos = 0;
		} else {
			schema = url.substring(0, pos).trim();
			if (schema.isEmpty()) {
				throw new IllegalArgumentException(url);
			}
			pos += 3;
		}
		pos2 = url.indexOf("/", pos);
		if (pos2 < 0) {
			serverName = url.substring(pos);
		} else {
			serverName = url.substring(pos, pos2).trim();
		}
		pos = pos2 + 1;

		if (serverName.isEmpty()) {
			throw new IllegalArgumentException(url);
		}
		pos2 = serverName.lastIndexOf(":");
		if (pos2 < 0) {
			port = 80;
		} else {
			port = Integer.parseInt(serverName.substring(pos2 + 1));
			serverName = serverName.substring(0, pos2);
		}
		if (pos > 0) {
			pos2 = url.indexOf("?", pos);
			if (pos2 < 0) {
				path = url.substring(pos);
			} else {
				path = url.substring(pos, pos2);
				pos = pos2 + 1;
				queryString = url.substring(pos);
			}
		}
		UrlBuilder builder = new UrlBuilder(schema, serverName, port, path == null ? null : path.split("/"));
		if (queryString != null) {
			String[] qs = queryString.split("&");
			if (qs != null) {
				builder.parameters = new LinkedHashMap<>();
				for (String q : qs) {
					String[] nv = q.split("=", 2);
					if (nv != null) {
						try {
							builder.parameters.put(nv[0], nv.length > 1 ? URLDecoder.decode(nv[1], urlEncoding) : "");
						} catch (UnsupportedEncodingException e) {
							throw new IllegalArgumentException(url);
						}
					}
				}
			}
		}
		return builder;
	}

	/**
	 * 解析URL
	 */
	public static UrlBuilder parse(String url) {
		return parse(url, "UTF-8");
	}

	/**
	 * 产生参数字符串
	 */
	public static String makeParameters(Map<String, Object> parameters, String encoding) {
		if (parameters == null || parameters.isEmpty()) {
			return "";
		}
		StringBuilder s = new StringBuilder();
		for (Entry<String, Object> e : parameters.entrySet()) {
			if (s.length() > 0) {
				s.append("&");
			}
			s.append(e.getKey());
			s.append("=");
			try {
				s.append(e.getValue() == null ? "" : URLEncoder.encode(String.valueOf(e.getValue()), encoding));
			} catch (UnsupportedEncodingException e1) {
				throw new IllegalArgumentException(encoding);
			}
		}
		return s.toString();
	}

	/**
	 * 产生参数字符串
	 */
	public static String makeParameters(Map<String, Object> parameters) {
		return makeParameters(parameters, "UTF-8");
	}

	/**
	 * 连接两个地址
	 */
	public static String combinUrl(String url1, String url2) {
		boolean b1 = url1.endsWith("/"), b2 = url2.startsWith("/");
		if (b1 && b2) {
			return url1 + url2.substring(1);
		}
		if (b1 || b2) {
			return url1 + url2;
		}
		return url1 + "/" + url2;
	}
}

  测试代码如下:

@Test
public void test() {
	UrlBuilder builder = new UrlBuilder("localhost", 8080);
	builder.addPath("xxx");
	System.out.println(builder.toString());

	builder.addPath("aaa", "bbb");
	System.out.println(builder.toString());

	builder.removePath(1);
	System.out.println(builder.toString());

	builder.addParameter("id", 100);
	System.out.println(builder.toString());

	builder.addParameter("name", "小李");
	System.out.println(builder.toString());

	builder.removeParameter("id");
	System.out.println(builder.toString());

	builder = UrlBuilder.parse("http://www.baidu.com:80/test/a.jsp?id=1");
	System.out.println(builder);
}

Java下的URL生成类

时间: 2024-12-25 23:46:33

Java下的URL生成类的相关文章

java下的多线程操作工具类(原创)

因为毕业设计上需要将控制台的任务实时输出到界面上, 而且那是个Hadoop的mapreduce任务,一跑半个小时的节奏,所以需要用到多线程并随时读取返回的数据, 百度了没找到合适的方法,于是被逼无奈编写了这个十分简单的多线程操作工具类. 大概的功能就是可以执行一个特定的线程(线程必须调用本类的方法才能实现实时输出信息的功能),然后随时调用readResult方法就可以获取到结果集. 在毕业设计的应用上,就是创建一个工具类,然后让它自己去跑,根据taskId保存到session中,用ajax循环读

通用树形下拉菜单生成类

<?php /** * 通用的树型类,可以生成任何树型结构 */ class tree {     /**     * 生成树型结构所需要的2维数组     * @var array     */     var $arr = array();       /**     * 生成树型结构所需修饰符号,可以换成图片     * @var array     */     var $icon = array('│','├','└');       /**     * @access private

构建施耐德楼控系统数据库后台服务器示例工程五(JAVA动态生成类)

在做数据库简易工具的过程中遇到了这么一个问题,即程序部署在tomcat下启动运行后,我们无法事先定义数据库中后续创建的表结构的Hibernate Bean对象,这样就需要我们在服务器运行起来后动态创建bean对象.cglib这个开源库即可解决我们的问题,动态创建JAVA对象. 1.cglib开源库简介 CGLIB(Code Generation Library)是一个开源项目,是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口. 反编译后CGLIB结构

PowerDesigner导入java类生成类图

1;打开PowerDesigner 2;file->Reverse Engineer->Object Language... 3;弹出一个对话框,在General模块下Model Name里写需要生成的文件名称,Object Language选择java 4;点击确定进入下一个对话框,在selection模块下Reverse Engineer选择java directiories 5;在左下角点击add选择需要生成类图的java包   6;点击确定,ok

Java使用zpxing.jar生成带url的二维码

第一步下载zpxing.jar包,并加载进来(网上有很多类似的jar包,这里小编使用的是谷歌提供的jar) 二维码工具类: package com.zpxing.controller; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Shape; import java.awt.geom.RoundRe

Windows环境下教你用Eclipse ADT 插件生成.h/.so文件,Java下调用JNI,轻松学习JNI

准备工作:Eclipse ADT IDE 开发工具,NDK ,Java 环境,博主的配置是:Windows x86 , ADT Build: v22.3.0-887826 , JAVA 1.7, NDK  android-ndk-r9 首先我们需要知道在 Linux 下编译 Project 生成 so 可以用 make ,但是在 WINDOWS 就不行了,这个就不多说了,大伙都明 白,然而今天写的这篇博客就是教大家怎么在Windows 配置自己的ADT开发插件也具备这样的功能,方便快速高效的开发

Java语言Lang包下常用的工具类介绍_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都很不错,不用你写,不用你调试,只要你发现. 在 Apache Jakarta Common 中, Lang 这个 Java 工具包是所有 Apache Jakarta Common 项目中被使用最广泛的,几乎你所知道的名气比较大的软件里面都有用到它,包括 Tomcat, Weblogic, Webs

UrlUtils工具类,Java URL工具类,Java URL链接工具类

UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年7月15日 http://www.cnblogs.com/fanshuyao/ Java代码   import java.util.Ha

使用RetionalRose根据现有的java工程逆向生成类图

1.进入RetionalRose选择J2EE模板 2.在菜单栏选择tools->java/j2EE->reverse engineer 3.编辑路径Edit CLASSPATH选择要生成类图的Java项目src文件 4.点击含有java源文件的文件夹,再点击Add Recursive按钮 5.先点击selectAll再点击Reverse 6.点击Done完成,java工程代码中描绘的类都已出现在左侧的LogicalView中,可以新建类图后拖拽将其显示出来