浏览 5408 次
锁定老帖子 主题:用jdom写了一个通用xml的CRUD接口
精华帖 (0) :: 良好帖 (1) :: 新手帖 (8) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-04
最后修改:2009-01-08
1,比如先建一个User package vo; public class User { private String uid; private String username; private String age; private String sex; private String address; 省略getter,setter方法 } 2.然后你要做的写个我提供的通用接口的实现类UserService package service; import java.util.List; import tools.Iservice; import tools.ServiceCreator; import vo.User; //这就是我提供的那个接口 public class UserService implements Iservice<User> { //在接口实现类里将User的class传进去,然后就能操控基于User的一个XML文件 private Iservice<User> service; public UserService() { service = new ServiceCreator<User>(User.class); } public void addObject(User t) { service.addObject(t); } public void deleteObject(String ObjectId) { service.deleteObject(ObjectId); } public List<User> getAllObject() { return service.getAllObject(); } public User getObject(String ObjectId) { return service.getObject(ObjectId); } public User getObject(String fieldName, String value) { return service.getObject(fieldName, value); } } 有了这个类呢,那就随便你怎么写了,程序会自动生成xml文件,看看里面的效果User.xml <?xml version="1.0" encoding="UTF-8"?> <Objects> <User uid="91865" username="cici" age="12" sex="nan" address="nanchang" /> <User uid="53307" username="试试" age="35" sex="nv" address="yunnan" /> </Objects> 这样不用数据库,也能非常快速的开发一个小应用,比如留言板之类安全性要求低的应用 下面就把具体内部实现贴出来 首先是接口Iservice.java package tools; import java.util.List; public interface Iservice<T> { public abstract void addObject(T t); public abstract T getObject(String ObjectId); public abstract List<T> getAllObject(); public abstract void updateObject(String ObjectId, T t); public abstract void deleteObject(String ObjectId); public T getObject(String fieldName,String value); } =============================================================================== 然后是操控xml的实现类ServiceCreator.java有点长 package tool; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.jdom.Attribute; import org.jdom.Document; import org.jdom.Element; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import java.lang.reflect.*; @SuppressWarnings("unchecked") public class ServiceCreator <T> implements Iservice<T>{ private static String baseFile="E:/XmlData/model/base.xml"; private String file="E:/XmlData/model/"; private Element root; private Document doc; private List<Element> Elementlist; private T t; private List<Method> getMethods; private List<Method> setMethods ; private List<String> fieldNames; private Class<T> classType; public ServiceCreator(T t) { this.t=t; file=new StringBuffer(file).append(t.getClass().getSimpleName()).append(".xml").toString(); File tempFile=new File(file); if(!tempFile.exists()){ try { copyFile(new File(baseFile)); } catch (Exception e) { e.printStackTrace(); } } doc=new DocCreator().getDoc(file); root=doc.getRootElement(); Elementlist=root.getChildren(); classType =(Class<T>) t.getClass(); declearFileds(); } //下面是私有共用方法 private void declearFileds(){ Field fields[]=classType.getDeclaredFields(); getMethods = new ArrayList<Method>(); setMethods = new ArrayList<Method>(); fieldNames = new ArrayList<String>(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; // 得到属性的名称 String fieldName = field.getName(); fieldNames.add(fieldName); String firstLetter = fieldName.substring(0, 1).toUpperCase(); // 得到属性的get和set方法 String getMethodName = "get" + firstLetter + fieldName.substring(1); String setMethodName = "set" + firstLetter + fieldName.substring(1); try { getMethods.add(classType.getMethod(getMethodName, new Class[] {})); setMethods.add(classType.getMethod(setMethodName, new Class[] { field.getType() })); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } } private Element searchElement(String objectId){ for(Element e : Elementlist){ if(e.getAttribute(fieldNames.get(0)).getValue().equals(objectId)){ return e; } } return null; } private Element searchElement(String fieldName,String value){ for(Element e : Elementlist){ if(e.getAttribute(fieldName).getValue().equals(value)){ return e; } } return null; } @SuppressWarnings("unchecked") private T setObjectValue(Element e ){ T newT=null; try { newT = classType.newInstance(); } catch (InstantiationException e2) { e2.printStackTrace(); } catch (IllegalAccessException e2) { e2.printStackTrace(); } List<Attribute> array= e.getAttributes(); for(int i=0;i<array.size();i++){ try { setMethods.get(i).invoke(newT, new Object[] { array.get(i).getValue() }); } catch (IllegalArgumentException e1) { e1.printStackTrace(); } catch (IllegalAccessException e1) { e1.printStackTrace(); } catch (InvocationTargetException e1) { e1.printStackTrace(); } } return newT; } public void copyFile(File fileInput) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(fileInput); fos = new FileOutputStream(file); byte[] buff = new byte[1024]; int byteRead = 0; while(-1 != (byteRead =fis.read(buff, 0, buff.length))){ fos.write(buff, 0, byteRead); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { fis.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } } //===========================添删查改================= public void addObject(T t){ try { if(t!=null){ Element newT=new Element(t.getClass().getSimpleName());//新建一个二级结点 for(int i=0;i<fieldNames.size();i++){ newT.setAttribute(fieldNames.get(i),getMethods .get(i).invoke(t,new Object[] {}).toString()); } root.addContent(newT); } XMLOutputter outer=new XMLOutputter(Format.getPrettyFormat());//输出类 outer.output(doc,new FileOutputStream(file));//输出文档 } catch (FileNotFoundException e) { System.out.println("文件没有找到!"); } catch (IOException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } public T getObject(String ObjectId){ return setObjectValue(searchElement(ObjectId)); } public List<T> getAllObject(){ List<T> list= new ArrayList<T>(); for(Element e :Elementlist){ list.add(setObjectValue(e)); } return list; } public void updateObject(String ObjectId,T t){ root.removeContent(searchElement(ObjectId)); addObject(t); } public void deleteObject(String objectId){ root.removeContent(searchElement(objectId)); addObject(null); } public T getObject(String fieldName,String value){ return setObjectValue(searchElement(fieldName,value)); } } ================================================================ 然后是其中的一个辅助类DocCreator.java package tools; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.jdom.Document; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class DocCreator { public Document getDoc(String file){ SAXBuilder sb=new SAXBuilder();//实例化SAXBuilder对象 Document doc=null; try { doc = sb.build(new FileInputStream(file)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return doc; } } 因为xml的路径很多时候比较麻烦,所以我就直接硬编码将xml生成在E:/XmlData/model下统一管理 技术上 用了反射来得到vo的所有属性,还有就是泛型来规范接口,当然还有很大的扩展空间,就没太过详细的去弄了 这个可由自己修改地址,假如不想用xml存储了,很简单,写个dao实现Iservice接口就拉倒了 很快的 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-08
写的很好,楼主在改以个DOM4J的版本吧
|
|
返回顶楼 | |
发表时间:2009-05-08
挺不错的,不用改XML了。直接调用一下就自动生成了。
|
|
返回顶楼 | |
发表时间:2009-05-18
看到JDOM有点害怕了,这东西的版本和中间件的JDOM版本;老是冲突...
|
|
返回顶楼 | |
发表时间:2009-05-18
我记得xstream 好像就是干这个的,楼主的有何新意!!!!
|
|
返回顶楼 | |
发表时间:2009-05-25
如果要求 线程安全?
怎么处理比较好 |
|
返回顶楼 | |
发表时间:2009-09-16
。。。这个jdom比起C#的。。。实在实在是一坨垃圾。
|
|
返回顶楼 | |
发表时间:2009-09-16
jaxb可以
|
|
返回顶楼 | |
发表时间:2009-09-20
拿到一个javabena的set以及get方法。楼主为什么还在拼字符串。精神值得表扬。不过重复了而已。哈哈
|
|
返回顶楼 | |