vaniglia 是一个开源的java工具库,下的版本大概1.7万,学习一下。
一. XML文件操作
封装org.w3c.dom.* 工具类,主要提供下面几个方法:
public XMLUtilities() { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); dbf.setValidating(false); dbf.setIgnoringComments(true); try { db = dbf.newDocumentBuilder(); } catch (ParserConfigurationException e) { logger.fatal("Unable to create a DocumentBuilder"); System.exit(-1); } db.setErrorHandler(errorHandler); }
注:在xml文件中如果出现异常的空格、换行,可能导致#text的错误节点。
二.TextTable 支持在控制台打印一个表
效果如下:
Non Adaptive Text Table
name address zip
------------------------------------
pippo via due 100
aa diecicarat 2
via qualtu 8
noadr 188
bbb piudidiecicaratterid 20
cccc this element has not 100
pluto this element has not 130
ffff this element has not 10
代码实现主要是TextTable,该类的两个主要方法分别是columns和elements,一个存储列信息,一个存储表内的元素
public class TextTable { //略 private TableColumn[] columns; //列信息 private Vector elements; //表内的元素
其中TableColume中包含,它只是列的定义信息,本身并不包含数据。数据在elements中。
public class TableColumn { private String name = ""; private int minWidth; private int width; private Align alignment; //当前只支持三列,即左、中、右
三.对TextTable的操作如下:
public class App { public static void main(String[] args) { { System.out.println("Non Adaptive Text Table"); System.out.println(); TextTable table = new TextTable(new TableColumn[] { new TableColumn("name", 5, Align.CENTER), new TableColumn("address", 20, Align.LEFT), new TableColumn("zip", 3, Align.RIGHT) },2, false); table.addElement(new String[] {"pippo", "via due", "100"}); table.addElement(new String[] {"aa", "diecicarat", "2"}); table.addElement(new String[] {"", "via qualtu", "8"}); table.addElement(new String[] {"noadr", "", "1888"}); table.addElement(new String[] {"bbb", "piudidiecicaratteridisicuro", "20"}); table.print(System.out);
三.模板引擎,类似于jsp、struts2中的变量标签,如下例:
public static void main(String[] args) throws IOException { String template = "<html><head><title>$title</title></head>\n"+ "<body style=\"background-color: rgb(202, 227, 255); visibility: visible;\">\n"+ "<b>Dear $name</b>\n"+ "<p>\n"+ "how is going? Is a long time we don't see. Last time was $lasttime\n"+ "I hope you can join us for my party that is scheduled for $party.\n"+ "</p>\n"+ "<p>\n"+ "Best Regards,<br/>\n"+ " <i>Michele</i>\n"+ "</body></html>\n"; ContextMap context = new ContextMap(); context.put("title", "Page Title"); context.put("name", "Luca"); context.put("lasttime", "10/05/2005"); context.put("party", "20/07/2005"); context.put("static", "TemplateEngine.merge static"); TemplateEngine templateEngine = new TemplateEngine(template); templateEngine.merge(context, new PrintWriter(System.out));
上例中$打头的变量将会被新的字符串替换,该特性实现主要分以下几个部分:
1. 定义一个ContextMap,维护一个hash表记录字符串和被替换字符串的映射关系;
2. 实现核心类TemplateEngine,其中重要的是:
int tokenEnd = findTokenEndIndex(template, tokenBegin+1); String key = template.substring(tokenBegin+1, tokenEnd); String value = context.get(key); if (value != null) { writer.write(value); } else { writer.write(token); writer.write(key); } start = tokenEnd;
private static int findTokenEndIndex(String template, int startindex) { int currentindex = startindex; char current; while (currentindex < template.length()) { current = template.charAt(currentindex); if ((current >= '0' && current <='9') || (current >= 'A' && current <= 'Z') || (current >= 'a' && current <= 'z') || (current == '_') || (current == '-')) { currentindex++; } else { break; } } return currentindex; }