`
zenggang2008
  • 浏览: 30390 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

用jdom写了一个通用xml的CRUD接口

    博客分类:
  • java
阅读更多
  最近用jdom弄了个通用的接口,说说作用吧,在程序中你只要提供一个普通的vo类,然后实现我给的那个接口,然后在实现类里就可以实现一整套的CRUD操作,隔离了程序员与xml打交到的部分,讲的有点乱,直接上代码吧
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接口就拉倒了
很快的


分享到:
评论
9 楼 ningmenglovesoft 2009-09-20  
拿到一个javabena的set以及get方法。楼主为什么还在拼字符串。精神值得表扬。不过重复了而已。哈哈
8 楼 jcs7575 2009-09-16  
jaxb可以
7 楼 ray_linn 2009-09-16  
。。。这个jdom比起C#的。。。实在实在是一坨垃圾。
6 楼 bachelor007 2009-09-16  
楼主果然强大
5 楼 littleJava 2009-05-25  
如果要求 线程安全?
怎么处理比较好
4 楼 kjj 2009-05-18  
我记得xstream 好像就是干这个的,楼主的有何新意!!!!
3 楼 fjlyxx 2009-05-18  
看到JDOM有点害怕了,这东西的版本和中间件的JDOM版本;老是冲突...
2 楼 luojunaction 2009-05-08  
挺不错的,不用改XML了。直接调用一下就自动生成了。
1 楼 minzaipiao 2009-05-08  
写的很好,楼主在改以个DOM4J的版本吧

相关推荐

    JDom 读写XML

    JDom是一个Java API,它为XML文档提供了全面且高性能的处理能力,使得开发者能够方便地构建、修改和访问XML数据。 **JDom详解** 1. **JDom简介** JDom是Java Document Object Model的简称,它是基于Java语言的一...

    jdom 读取XML 文件

    JDOM是Java中一个用于处理XML文档的库,它提供了一种高效且方便的方式来创建、读取、修改XML文件。本篇文章将深入探讨如何使用JDOM来读取XML文件。 首先,我们需要了解JDOM的基本概念。JDOM通过构建一棵DOM...

    用jdom解析xml文件

    在解析XML时,JDOM会将整个XML文档转换为一个Document对象,这个对象包含了一个根元素和其他子元素,这些元素又可以包含更多的元素和属性。 解析XML文件的基本步骤如下: 1. 引入JDOM库:确保项目中已经添加了JDOM...

    jdom1.1.3xml解析工具类

    JDOM是由以下几个包组成的: org.jdom包含了所有的xml文档要素的java类 org.jdom.adapters包含了与dom适配的java类 org.jdom.filter包含了xml文档的过滤器类 org.jdom.input包含了读取xml文档的类 org.jdom.output...

    用jdom解析xml

    总结,JDOM为Java开发者提供了一个方便的接口来处理XML文档。通过JDOM,可以轻松地解析、修改和生成XML内容。在JSP环境中,这些操作可以帮助创建动态的Web应用,实现与XML数据的交互。通过实践和理解这些基本概念,...

    JDOM操作xml文件的xmlBean

    JDOM的核心思想是通过构建一个轻量级的对象模型来表示XML文档。这使得开发人员能够非常直观地对XML文档进行读取、修改和创建。JDOM的核心类包括: - `Document`:代表整个XML文档。 - `Element`:代表XML文档中的...

    使用JDOM解析XML文件

    总结来说,JDOM是一个强大的Java库,用于处理XML文档。通过SAXBuilder或DOMBuilder解析XML,结合XPath查询,我们可以轻松地读取、修改和保存XML数据。在实际应用中,根据项目需求选择合适的解析策略,如需处理大量...

    用jdom简化xml 编程 关于xml

    JDOM的出现是为了应对Java XML生态中存在多种API,但缺乏一个直观且易于使用的Java友好型接口的问题。它提供了一个完全基于Java的API,使得XML数据能够直接映射为Java对象,从而方便地进行读取、修改和生成XML文档。...

    jdom读写xml说明

    JDOM是一个针对Java的DOM(Document Object Model)实现,旨在为Java开发者提供一个高效且灵活的方式来处理XML文档。它提供了直接在内存中构建和操作XML文档的方法,使得XML解析和生成变得简单。 ### 2. 安装与导入...

    java利用jdom读取xml文件

    2. 加载XML文件:使用`SAXBuilder`类来构建一个`Document`对象,该对象代表了整个XML文档。以下是一个示例代码: ```java import org.jdom2.Document; import org.jdom2.input.SAXBuilder; public class ...

    JDOM解析本地XML

    相比于SAX的事件驱动解析,JDOM提供了一个完整的文档对象模型,使得操作XML更加直观,但可能在处理大型XML时占用更多内存。 通过以上介绍,我们可以看到JDOM为Java开发者提供了一个强大的工具,用于解析和操作XML...

    jdom读写自定义XML

    在Java编程中,处理XML文件是一项常见的任务,而JDOM(Java Document Object Model)提供了一个高效、简单且方便的方式来操作XML文档。JDOM允许开发者以面向对象的方式创建、修改和读取XML数据。本文将详细介绍如何...

    java jdom解析xml

    Java JDOM解析XML是Java开发中处理XML文档的一种方法,JDOM全称为Java Document Object Model,它是一个基于Java语言的API,用于创建、修改和读取XML文档。JDOM为XML处理提供了一种高效且方便的解决方案,尤其适用于...

    jdom-test-1.1.zip_Java Test_java 操作xml_jdom_jdom xml_xml java jd

    JDOM,全称为Java Document Object Model,是一个专为Java设计的API,用于读写XML文档。它提供了一个直观的、基于树的API,使得开发者能够轻松地创建、修改和处理XML文档。JDOM的核心类包括`Element`、`Attribute`和...

    基于java的开发源码-用jdom解析xml.zip

    基于java的开发源码-用jdom解析xml.zip 基于java的开发源码-用jdom解析xml.zip 基于java的开发源码-用jdom解析xml.zip 基于java的开发源码-用jdom解析xml.zip 基于java的开发源码-用jdom解析xml.zip 基于java的开发...

    jdom-1.1.zip jdom-1.1.jar jdom.jar jdom库 jdom操作xml

    在JDOM中,XML文档被表示为一个树形结构,主要由三个基本元素组成:`Element`代表XML元素,`Attribute`表示元素的属性,而`Document`则封装了整个XML文档。通过这些类,你可以创建新的XML文档,或者读取并修改已有的...

    jdom.jar xml解析

    JDOM(Java Document Object Model)是一个用纯Java编写的API,它提供了构建、读取和修改XML文档的功能。JDOM的目标是为Java开发者提供一个高效且易于使用的接口来处理XML文档。相比于DOM(Document Object Model)...

    jdom处理xml例子

    JDOM(Java Document Object Model)是一个用纯Java实现的XML文档对象模型,它为XML处理提供了一种高效、灵活且方便的方法。JDOM的目标是为Java开发者提供一个与平台无关的方式来创建、读取、修改和保存XML文档。...

    JDOM读取XML,并且创建XML

    JDOM提供了一个直接映射到XML文档的Java对象模型,使得操作XML变得更为便捷。 首先,让我们深入理解JDOM的基本概念。JDOM的核心类包括`Element`、`Attribute`、`Document`等。`Document`代表整个XML文档,它是XML...

Global site tag (gtag.js) - Google Analytics