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 如:</tagName> */ 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<Map<Object, Object>>数据转化为二维数组 * * @param data * List<Map<Object, Object>>数据 * @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<Map<Object, Object>>集合中。 * * @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 = "'"; }