最近用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接口就拉倒了
很快的
分享到:
相关推荐
JDom是一个Java API,它为XML文档提供了全面且高性能的处理能力,使得开发者能够方便地构建、修改和访问XML数据。 **JDom详解** 1. **JDom简介** JDom是Java Document Object Model的简称,它是基于Java语言的一...
JDOM是Java中一个用于处理XML文档的库,它提供了一种高效且方便的方式来创建、读取、修改XML文件。本篇文章将深入探讨如何使用JDOM来读取XML文件。 首先,我们需要了解JDOM的基本概念。JDOM通过构建一棵DOM...
在解析XML时,JDOM会将整个XML文档转换为一个Document对象,这个对象包含了一个根元素和其他子元素,这些元素又可以包含更多的元素和属性。 解析XML文件的基本步骤如下: 1. 引入JDOM库:确保项目中已经添加了JDOM...
JDOM是由以下几个包组成的: org.jdom包含了所有的xml文档要素的java类 org.jdom.adapters包含了与dom适配的java类 org.jdom.filter包含了xml文档的过滤器类 org.jdom.input包含了读取xml文档的类 org.jdom.output...
总结,JDOM为Java开发者提供了一个方便的接口来处理XML文档。通过JDOM,可以轻松地解析、修改和生成XML内容。在JSP环境中,这些操作可以帮助创建动态的Web应用,实现与XML数据的交互。通过实践和理解这些基本概念,...
JDOM的核心思想是通过构建一个轻量级的对象模型来表示XML文档。这使得开发人员能够非常直观地对XML文档进行读取、修改和创建。JDOM的核心类包括: - `Document`:代表整个XML文档。 - `Element`:代表XML文档中的...
总结来说,JDOM是一个强大的Java库,用于处理XML文档。通过SAXBuilder或DOMBuilder解析XML,结合XPath查询,我们可以轻松地读取、修改和保存XML数据。在实际应用中,根据项目需求选择合适的解析策略,如需处理大量...
JDOM的出现是为了应对Java XML生态中存在多种API,但缺乏一个直观且易于使用的Java友好型接口的问题。它提供了一个完全基于Java的API,使得XML数据能够直接映射为Java对象,从而方便地进行读取、修改和生成XML文档。...
JDOM是一个针对Java的DOM(Document Object Model)实现,旨在为Java开发者提供一个高效且灵活的方式来处理XML文档。它提供了直接在内存中构建和操作XML文档的方法,使得XML解析和生成变得简单。 ### 2. 安装与导入...
2. 加载XML文件:使用`SAXBuilder`类来构建一个`Document`对象,该对象代表了整个XML文档。以下是一个示例代码: ```java import org.jdom2.Document; import org.jdom2.input.SAXBuilder; public class ...
相比于SAX的事件驱动解析,JDOM提供了一个完整的文档对象模型,使得操作XML更加直观,但可能在处理大型XML时占用更多内存。 通过以上介绍,我们可以看到JDOM为Java开发者提供了一个强大的工具,用于解析和操作XML...
在Java编程中,处理XML文件是一项常见的任务,而JDOM(Java Document Object Model)提供了一个高效、简单且方便的方式来操作XML文档。JDOM允许开发者以面向对象的方式创建、修改和读取XML数据。本文将详细介绍如何...
Java JDOM解析XML是Java开发中处理XML文档的一种方法,JDOM全称为Java Document Object Model,它是一个基于Java语言的API,用于创建、修改和读取XML文档。JDOM为XML处理提供了一种高效且方便的解决方案,尤其适用于...
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文档被表示为一个树形结构,主要由三个基本元素组成:`Element`代表XML元素,`Attribute`表示元素的属性,而`Document`则封装了整个XML文档。通过这些类,你可以创建新的XML文档,或者读取并修改已有的...
JDOM(Java Document Object Model)是一个用纯Java编写的API,它提供了构建、读取和修改XML文档的功能。JDOM的目标是为Java开发者提供一个高效且易于使用的接口来处理XML文档。相比于DOM(Document Object Model)...
JDOM(Java Document Object Model)是一个用纯Java实现的XML文档对象模型,它为XML处理提供了一种高效、灵活且方便的方法。JDOM的目标是为Java开发者提供一个与平台无关的方式来创建、读取、修改和保存XML文档。...
JDOM提供了一个直接映射到XML文档的Java对象模型,使得操作XML变得更为便捷。 首先,让我们深入理解JDOM的基本概念。JDOM的核心类包括`Element`、`Attribute`、`Document`等。`Document`代表整个XML文档,它是XML...