java html工具

package org.liufei.jweb.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 由java生成HTML标记代码。
 * 
 * @author 刘飞
 * 
 */
public final class HtmlUtils {

	private static final String X = ",";

	private static final String STRING = "=";

	private static final String REGEX = ":";

	private static final String TEXT_CSS = "text/css";

	private static final String STYLESHEET = "stylesheet";

	private static final String HREF = "href";

	private static final String REL = "rel";

	private static final String LINK = "link";

	private static final String SRC = "src";

	private static final String SCRIPT = "script";

	private static final String TYPE = "type";

	private static final String TEXT_JAVASCRIPT = "text/javascript";

	private static final String TABLE = "table";

	private static final String TR = "tr";

	private static final String TH = "th";

	private static final String TD = "td";

	private static final String DIV = "div";

	private static final String SPAN = "span";

	private static final String SELECT = "select";

	private static final String OPTION = "option";

	private static final String IMG = "img";

	private static final String A = "a";

	private static final String INPUT = "input";

	private HtmlUtils() {
	}

	/**
	 * 创建HTML代码。
	 * 
	 * @param tagName
	 *            html标记名称。
	 * @param keys
	 *            该html标记的属性名称。
	 * @param values
	 *            该html标记的属性值。
	 * @param contentHTML
	 *            该html标记所包含的子html标记或内容。
	 * @return 该HTML代码标记片段。
	 */
	public static String htmlCreator(String tagName, String[] keys,
			Object[] values, Object contentHTML) {
		StringBuffer buffer = new StringBuffer("");
		buffer.append(htmlTagStartCreator(tagName, keys, values));
		buffer.append(contentHTML);
		buffer.append(htmlTagEndCreator(tagName));
		return buffer.toString();
	}

	/**
	 * 创建HTML代码。
	 * 
	 * @param tagName
	 *            html标记名称。
	 * @param properties
	 *            标签属性字符串, 属性之间以','分隔, 属性键值间以':'或'='分隔
	 * @param contentHTML
	 *            该html标记所包含的子html标记或内容。
	 * @return 该HTML代码标记片段。
	 */
	public static String htmlCreator(String tagName, String properties,
			Object contentHTML) {
		if (properties == null) {
			return htmlCreator(tagName, contentHTML);
		} else if (properties.equals("") || properties.length() == 0) {
			return htmlCreator(tagName, contentHTML);
		} else {
			String[] props = properties.split(X);
			int size = props.length;
			if (properties.indexOf(X) != -1) {// 多个属性
				if (properties.indexOf(REGEX) != -1) {
					String[] keys = new String[size];
					Object[] values = new Object[size];
					for (int i = 0; i < size; i++) {
						String _prop = props[i].trim();
						String[] keyValue = _prop.split(REGEX);
						keys[i] = keyValue[0].trim();
						values[i] = keyValue[1].trim();
					}
					return htmlCreator(tagName, keys, values, contentHTML);
				} else if (properties.indexOf(STRING) != -1) {
					String[] keys = new String[size];
					Object[] values = new Object[size];
					for (int i = 0; i < size; i++) {
						String _prop = props[i].trim();
						String[] keyValue = _prop.split(STRING);
						keys[i] = keyValue[0].trim();
						values[i] = keyValue[1].trim();
					}
					return htmlCreator(tagName, keys, values, contentHTML);
				} else {// 无属性
					return htmlCreator(tagName, contentHTML);
				}
			} else if (properties.indexOf(STRING) != -1) {// 一个属性, 以'='分隔
				String[] keys = new String[size];
				Object[] values = new Object[size];
				String _prop = props[0].trim();
				String[] keyValue = _prop.split(STRING);
				keys[0] = keyValue[0].trim();
				values[0] = keyValue[1].trim();
				return htmlCreator(tagName, keys, values, contentHTML);
			} else if (properties.indexOf(REGEX) != -1) {// 一个属性, 以':'分隔
				String[] keys = new String[size];
				Object[] values = new Object[size];
				String _prop = props[0].trim();
				String[] keyValue = _prop.split(REGEX);
				keys[0] = keyValue[0].trim();
				values[0] = keyValue[1].trim();
				return htmlCreator(tagName, keys, values, contentHTML);
			} else {// 无属性
				return htmlCreator(tagName, contentHTML);
			}
		}
	}

	/**
	 * 创建HTML代码。
	 * 
	 * @param tagName
	 *            html标记名称。
	 * @param properties
	 *            标签属性
	 * @param contentHTML
	 *            该html标记所包含的子html标记或内容。
	 * @return 该HTML代码标记片段。
	 */
	public static String htmlCreator(String tagName,
			Map<String, Object> properties, Object contentHTML) {
		if (properties == null) {
			return htmlCreator(tagName, contentHTML);
		} else {
			int size = properties.size();
			String[] keys = new String[size];
			Object[] values = new Object[size];
			Set<String> keysSet = properties.keySet();
			int i = 0;
			for (String key : keysSet) {
				keys[i] = key;
				values[i] = properties.get(key);
				i++;
			}
			return htmlCreator(tagName, keys, values, contentHTML);
		}
	}

	/**
	 * 创建HTML代码。
	 * 
	 * @param tagName
	 *            html标记名称。
	 * @param contentHTML
	 *            该html标记所包含的子html标记或内容。
	 * @return 该HTML代码标记片段。
	 */
	public static String htmlCreator(String tagName, Object contentHTML) {
		return htmlCreator(tagName, null, null, contentHTML);
	}

	/**
	 * html开始标记生成。
	 * 
	 * @param tagName
	 *            tagName 标记名称
	 * @param keys
	 *            属性名称数组
	 * @param values
	 *            属性值数组
	 * @return
	 */
	private static String htmlTagStartCreator(String tagName, String[] keys,
			Object[] values) {
		StringBuffer buffer = new StringBuffer("");
		if (tagName == null) {
			throw new IllegalArgumentException("HTML标签名不能为空!");
		} else if (tagName.length() == 0 || tagName.equals("")) {
			throw new IllegalArgumentException("HTML标签名不能为空!");
		}
		if (keys == null || values == null) {
			buffer.append("");
		} else {
			for (int i = 0; i < keys.length; i++) {
				buffer.append(keys[i] + STRING + quotesMarks + values[i]
						+ quotesMarks + " ");
			}
		}

		return htmlTagStart + tagName + " " + buffer.toString() + htmlTagEnd;
	}

	/**
	 * html结束标记创建。
	 * 
	 * @param tagName
	 *            标记名称
	 * @return 如:&lt/tagName&gt
	 */
	private static String htmlTagEndCreator(String tagName) {
		return htmlTagEndStart + tagName + htmlTagEnd;
	}

	/**
	 * css的link标记。
	 * 
	 * @param href
	 *            css文件地址。
	 * @return
	 */
	public static String cssLinkCreator(String href) {
		return htmlCreator(LINK, new String[] { REL, HREF, TYPE },
				new Object[] { STYLESHEET, href, TEXT_CSS }, "");
	}

	/**
	 * javascript链接javascript文件。
	 * 
	 * @param src
	 *            javascript文件地址。
	 * @return
	 */
	public static String javascriptLinkCreator(String src) {
		return htmlCreator(SCRIPT, new String[] { TYPE, SRC }, new Object[] {
				TEXT_JAVASCRIPT, src }, "");
	}

	/**
	 * 简单的javascript的弹出对话框。
	 * 
	 * @param message
	 * @return
	 */
	public static String javascriptAlertCreator(String message) {
		return javascriptCreator("alert(\"" + message + " \") ;");
	}

	/**
	 * 创建javascript脚本代码字符串。
	 * 
	 * @param functions
	 *            javascript函数字符串。
	 * @return
	 */
	public static String javascriptCreator(Object functions) {
		return htmlCreator(SCRIPT, new String[] { TYPE },
				new Object[] { TEXT_JAVASCRIPT }, functions);
	}

	/**
	 * 创建javascript函数
	 * 
	 * @param name
	 *            函数名称
	 * @param functionBody
	 *            函数体。
	 * @return
	 */
	public static String javascriptFunction(String name, String functionBody) {
		return "\n\tfunction " + name + " {\n\t\t" + functionBody + "\n\t}\n";
	}

	/**
	 * 将一个二维数组的数据放入到table表格中。
	 * 
	 * @param ths
	 *            表格的TH内容
	 * @param data
	 *            表格的二维数组数据
	 * @return
	 */
	public static String simpleTableCreator(String ths, Object[][] data) {
		StringBuffer bufferTable = new StringBuffer("");
		StringBuffer bufferTrs = new StringBuffer("");
		if (ths != null) {
			bufferTrs.append(trCreator(ths));
		}
		if (data == null) {
			throw new IllegalArgumentException("参数不能为空!");
		} else if (data.length > 0 && data[0].length > 0) {
			for (Object[] row : data) {
				StringBuffer bufferTr = new StringBuffer("");
				for (Object col : row) {
					bufferTr.append(tdCreator(col));
				}
				bufferTrs.append(trCreator(bufferTr.toString()));
			}
		}
		bufferTable.append(tableCreator(bufferTrs.toString()));
		return bufferTable.toString();
	}

	/**
	 * 创建以二维数组大小的表格。
	 * 
	 * @param data
	 *            表格的二维数组数据
	 * @return
	 */
	public static String simpleTrsCreator(Object[][] data) {
		StringBuffer bufferTrs = new StringBuffer("");
		if (data == null) {
			throw new IllegalArgumentException("参数不能为空!");
		} else if (data.length > 0 && data[0].length > 0) {
			for (Object[] row : data) {
				StringBuffer bufferTr = new StringBuffer("");
				for (Object col : row) {
					bufferTr.append(tdCreator(col));
				}
				bufferTrs.append(trCreator(bufferTr.toString()));
			}
		}

		return bufferTrs.toString();
	}

	/**
	 * 将一个二维数组的数据放入到table表格中。
	 * 
	 * @param data
	 *            表格的二维数组数据
	 * @param arrayData
	 *            表格的一维数组数据, 一般作为菜单项。
	 * @return
	 */
	public static String simpleTrsCreator(Object[][] data, Object[] arrayData) {
		return simpleTrsCreator(ArrayUtils.addAll(data, arrayData));
	}

	/**
	 * 将一个二维数组的数据放入到table表格中。
	 * 
	 * @param data
	 *            表格的二维数组数据
	 * @return
	 */
	public static String simpleTableCreator(Object[][] data) {
		return simpleTableCreator("", data);
	}

	/**
	 * 将一个二维数组的数据放入到table表格中。
	 * 
	 * @param data
	 *            表格的二维数组数据
	 * @param arrayData
	 *            表格的一维数组数据, 一般作为菜单项。
	 * @return
	 */
	public static String simpleTableCreator(Object[][] data, Object[] arrayData) {
		return simpleTableCreator(ArrayUtils.addAll(data, arrayData));
	}

	/**
	 * 将一个二维数组的数据放入到table表格中。
	 * 
	 * @param ths
	 *            表格的TH内容
	 * @param data
	 *            表哥的二维数组数据
	 * @return
	 */
	public static String simpleTableCreator(String ths,
			List<Map<Object, Object>> data) {
		return simpleTableCreator(ths, ArrayListMapUtils.listMapToArray(data));
	}

	/**
	 * 将一个二维数组的数据放入到table表格中。
	 * 
	 * @param data
	 *            表哥的二维数组数据
	 * @return
	 */
	public static String simpleTableCreator(List<Map<Object, Object>> data) {
		return simpleTableCreator(null, data);
	}

	/**
	 * 数组和Map、List集合之间的转化。
	 * 
	 * @author 刘飞
	 * 
	 */
	public static class ArrayListMapUtils {

		/**
		 * List&ltMap&ltObject, Object&gt&gt数据转化为二维数组
		 * 
		 * @param data
		 *            List&ltMap&ltObject, Object&gt&gt数据
		 * @return
		 */
		public static Object[][] listMapToArray(List<Map<Object, Object>> data) {
			Object[][] arrayData = null;
			if (data == null) {
				throw new IllegalArgumentException("数据参数不能为空!");
			}
			int rows = data.size();
			if (rows > 0) {
				Set<Object> keySet = data.get(0).keySet();
				int cols = keySet.size();
				if (cols > 0) {
					arrayData = new Object[rows][cols];
					int r = 0;
					for (Map<Object, Object> dataMap : data) {
						Set<Object> keys = dataMap.keySet();
						Iterator<Object> iter = keys.iterator();
						int c = 0;
						while (iter.hasNext()) {
							arrayData[r][c] = dataMap.get(iter.next());
							c++;
						}
						r++;
					}
				}
			}
			return arrayData;
		}

		/**
		 * 将二维数组的数据放入List&ltMap&ltObject, Object&gt&gt集合中。
		 * 
		 * @param data
		 *            二维数组
		 * @return
		 */
		public static List<Map<Object, Object>> arrayToListMap(Object[][] data) {
			List<Map<Object, Object>> listMapData = new ArrayList<Map<Object, Object>>();
			if (data == null) {
				throw new IllegalArgumentException("数据参数不能为空!");
			}
			if (data.length > 0 && data[0].length > 0) {
				for (Object[] row : data) {
					Map<Object, Object> mapData = new HashMap<Object, Object>();
					for (Object col : row) {
						mapData.put(col, col);
					}
					listMapData.add(mapData);
				}
			}
			return listMapData;
		}
	}

	/**
	 * html的table标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String tableCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(TABLE, keys, values, contentHTML);
	}

	/**
	 * html的table标记。
	 * 
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String tableCreator(Object contentHTML) {
		return tableCreator(null, null, contentHTML);
	}

	/**
	 * html的tr标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String trCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(TR, keys, values, contentHTML);
	}

	/**
	 * html的tr标记。
	 * 
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String trCreator(Object contentHTML) {
		return trCreator(null, null, contentHTML);
	}

	/**
	 * html的th标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String thCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(TH, keys, values, contentHTML);
	}

	/**
	 * html的th标记。
	 * 
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String thCreator(Object contentHTML) {
		return thCreator(null, null, contentHTML);
	}

	/**
	 * html的td标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String tdCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(TD, keys, values, contentHTML);
	}

	/**
	 * html的td标记。
	 * 
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String tdCreator(Object contentHTML) {
		return tdCreator(null, null, contentHTML);
	}

	/**
	 * html的div标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String divCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(DIV, keys, values, contentHTML);
	}

	/**
	 * html的span标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String spanCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(SPAN, keys, values, contentHTML);
	}

	/**
	 * html的select标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String selectCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(SELECT, keys, values, contentHTML);
	}

	/**
	 * html的option标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String optionCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(OPTION, keys, values, contentHTML);
	}

	/**
	 * html的img标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @return
	 */
	public static String imgCreator(String[] keys, Object[] values) {
		return htmlCreator(IMG, keys, values, "");
	}

	/**
	 * html的a标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @param contentHTML
	 *            子标记或内容
	 * @return
	 */
	public static String aCreator(String[] keys, Object[] values,
			Object contentHTML) {
		return htmlCreator(A, keys, values, contentHTML);
	}

	/**
	 * html的input标记。
	 * 
	 * @param keys
	 *            标记属性名称列表
	 * @param values
	 *            标记属性值列表
	 * @return
	 */
	public static String inputCreator(String[] keys, Object[] values) {
		return htmlCreator(INPUT, keys, values, "");
	}

	/**
	 * HTML标记前缀。
	 */
	public static final String htmlTagStart = "<";

	/**
	 * HTML标签结束前缀。
	 */
	public static final String htmlTagEndStart = "</";

	/**
	 * HTML标记后缀。
	 */
	public static final String htmlTagEnd = ">";

	/**
	 * 英文状态下的双引号。
	 */
	public static final String quotesMarks = "\"";

	/**
	 * 英文状态下的单引号
	 */
	public static final String singleQuoteMarks = "'";
}

你可能感兴趣的:(java)