写这篇东西主要是为了完成上回写的“用策略模式实现对数据库的增删改操作”一文,这里仍然使用上次使用过的反射机制来实现。这次之所以将操作类写在xml中是为了在前端真正的实现对后台操作的抽象,这样的好处是可以更灵活的实现对后台扩展而不用修改现有代码,也就是说更加符合“开-闭”原则。
这里的xml读取之所以采用的sax工具,其实主要是想试一试这个“
民间标准”的手感(毕竟以前对事件处理机制接触不多)。至于读取的过程,采用单例模式管理是为了更有效的读取xml文件:如果文件在读取之前被修改则重新读取,否则直接读取上次读取的结果。
该例中使用的xml文件(myxml.xml)
<?xml version="1.0" encoding="gb2312"?>
<myxml>
<database>
<insert>com.Insert</insert>
<delete>com.Delete</delete>
<updata>com.Updata</updata>
</database>
</myxml>
<myxml>
<database>
<insert>com.Insert</insert>
<delete>com.Delete</delete>
<updata>com.Updata</updata>
</database>
</myxml>
下面是源代码(策略类和数据库操作类可参见“用策略模式实现对数据库的增删改操作”一文):
SAXHandler类(解析xml文件的核心类)
package
com;
import java.util. * ;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
class SAXHandler
extends DefaultHandler ... {
private Stack<String> stack = new Stack<String> ();
private Map<String, String> map = new HashMap<String, String> ();
private String currentElement = null;
private String currentValue = null;
public Map<String,String> getMap()...{
return map;
}
public void characters(char ch[], int start, int length) throws SAXException ...{
currentValue = new String(ch, start, length);
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) ...{
currentElement = qName;
stack.push(qName);
}
public void endElement(String uri, String localName, String qName) ...{
stack.pop();
if (!stack.empty() &&stack.peek().equalsIgnoreCase("database")) ...{
map.put(currentElement, currentValue);
}
}
}
import java.util. * ;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import org.xml.sax.Attributes;
class SAXHandler
extends DefaultHandler ... {
private Stack<String> stack = new Stack<String> ();
private Map<String, String> map = new HashMap<String, String> ();
private String currentElement = null;
private String currentValue = null;
public Map<String,String> getMap()...{
return map;
}
public void characters(char ch[], int start, int length) throws SAXException ...{
currentValue = new String(ch, start, length);
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) ...{
currentElement = qName;
stack.push(qName);
}
public void endElement(String uri, String localName, String qName) ...{
stack.pop();
if (!stack.empty() &&stack.peek().equalsIgnoreCase("database")) ...{
map.put(currentElement, currentValue);
}
}
}
XMLManager类(单例模式管理解析过程的类)
package
com;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import java.io.File;
import java.util.Map;
public class XMLManager ... {
private String xmlpath = new String("myxml.xml");
private File xmlfile = null;
private long lastmodifiedtime = 0;
private SAXHandler saxhandler = null;
private SAXParserFactory saxparserfactory = null;
private SAXParser saxparser = null;
private Map<String, String> map = null;
private static XMLManager xmlmanager = new XMLManager();
private XMLManager() ...{
xmlfile = new File(xmlpath);
lastmodifiedtime = xmlfile.lastModified();
saxhandler = new SAXHandler();
try ...{
saxparserfactory = SAXParserFactory.newInstance();
saxparser = saxparserfactory.newSAXParser();
saxparser.parse(xmlfile, saxhandler);
map = saxhandler.getMap();
}
catch (Exception ex) ...{
ex.printStackTrace();
}
}
public static XMLManager newInstance() ...{
return xmlmanager;
}
synchronized public String getValue(String key) ...{
long newtime = xmlfile.lastModified();
if (newtime == 0) ...{
if (lastmodifiedtime == 0) ...{
System.out.println("file dose not exist!");
}
else ...{
System.out.println("file was deleted!");
}
return "";
}
else if (newtime > lastmodifiedtime) ...{
try ...{
saxparser.parse(xmlfile, saxhandler);
map = saxhandler.getMap();
}
catch (Exception ex) ...{
ex.printStackTrace();
}
}
lastmodifiedtime = newtime;
return map.get(key);
}
}
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import java.io.File;
import java.util.Map;
public class XMLManager ... {
private String xmlpath = new String("myxml.xml");
private File xmlfile = null;
private long lastmodifiedtime = 0;
private SAXHandler saxhandler = null;
private SAXParserFactory saxparserfactory = null;
private SAXParser saxparser = null;
private Map<String, String> map = null;
private static XMLManager xmlmanager = new XMLManager();
private XMLManager() ...{
xmlfile = new File(xmlpath);
lastmodifiedtime = xmlfile.lastModified();
saxhandler = new SAXHandler();
try ...{
saxparserfactory = SAXParserFactory.newInstance();
saxparser = saxparserfactory.newSAXParser();
saxparser.parse(xmlfile, saxhandler);
map = saxhandler.getMap();
}
catch (Exception ex) ...{
ex.printStackTrace();
}
}
public static XMLManager newInstance() ...{
return xmlmanager;
}
synchronized public String getValue(String key) ...{
long newtime = xmlfile.lastModified();
if (newtime == 0) ...{
if (lastmodifiedtime == 0) ...{
System.out.println("file dose not exist!");
}
else ...{
System.out.println("file was deleted!");
}
return "";
}
else if (newtime > lastmodifiedtime) ...{
try ...{
saxparser.parse(xmlfile, saxhandler);
map = saxhandler.getMap();
}
catch (Exception ex) ...{
ex.printStackTrace();
}
}
lastmodifiedtime = newtime;
return map.get(key);
}
}
test类(测试类)
package
com;
import java.util.Map;
import java.lang.reflect.Constructor;
import java.util.HashMap;
public class test ... {
public static void main(String[] args) ...{
DataBaseContext dbc = new DataBaseContext();
DataBaseSuper dbs = null;
Map map = new HashMap();
map.put("name", "丁丁");
map.put("age", "14");
String dboperate = XMLManager.newInstance().getValue("insert");
if (dboperate.equals("") || dboperate == null) ...{
System.out.println("operate failed!");
}
else ...{
try ...{
/** *//** */
/** *//***具体的反射实现过程***/
Class cls = Class.forName(dboperate);
Class partype = Class.forName("java.util.Map");
Constructor ct = cls.getConstructor(partype);
dbs = (DataBaseSuper) ct.newInstance(map);
}
catch (Throwable ex) ...{
System.err.println(ex);
}
if (dbs != null) ...{
dbc.setOperate(dbs);
dbc.excuteOperate();
}
}
}
}
import java.util.Map;
import java.lang.reflect.Constructor;
import java.util.HashMap;
public class test ... {
public static void main(String[] args) ...{
DataBaseContext dbc = new DataBaseContext();
DataBaseSuper dbs = null;
Map map = new HashMap();
map.put("name", "丁丁");
map.put("age", "14");
String dboperate = XMLManager.newInstance().getValue("insert");
if (dboperate.equals("") || dboperate == null) ...{
System.out.println("operate failed!");
}
else ...{
try ...{
/** *//** */
/** *//***具体的反射实现过程***/
Class cls = Class.forName(dboperate);
Class partype = Class.forName("java.util.Map");
Constructor ct = cls.getConstructor(partype);
dbs = (DataBaseSuper) ct.newInstance(map);
}
catch (Throwable ex) ...{
System.err.println(ex);
}
if (dbs != null) ...{
dbc.setOperate(dbs);
dbc.excuteOperate();
}
}
}
}