最近用jdom弄了个通用的接口,说说作用吧,在程序中你只要提供一个普通的vo类,然后实现我给的那个接口,然后在实现类里就可以实现一整套的CRUD操作,隔离了程序员与xml打交到的部分,讲的有点乱,直接上代码吧
1,比如先建一个User
2.然后你要做的写个我提供的通用接口的实现类UserService
有了这个类呢,那就随便你怎么写了,程序会自动生成xml文件,看看里面的效果User.xml
这样不用数据库,也能非常快速的开发一个小应用,比如留言板之类安全性要求低的应用
下面就把具体内部实现贴出来
首先是接口Iservice.java
===============================================================================
然后是操控xml的实现类ServiceCreator.java有点长
================================================================
然后是其中的一个辅助类DocCreator.java
因为xml的路径很多时候比较麻烦,所以我就直接硬编码将xml生成在E:/XmlData/model下统一管理
技术上 用了反射来得到vo的所有属性,还有就是泛型来规范接口,当然还有很大的扩展空间,就没太过详细的去弄了
这个可由自己修改地址,假如不想用xml存储了,很简单,写个dao实现Iservice接口就拉倒了
很快的
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接口就拉倒了
很快的