XML(Extensible Markup Language)可扩展标记语言,具有灵活、跨平台的特点,当前处理结构话文档信息的有利工具。
一、关系型数据库的弊端:
具有严格的数据及关系定义,缺乏数据模型上的灵活性,难以应对具有复杂、多变结构的数据,只能适合固定的结构化数据。优点是查询速度快,缺点是模型固定,不够灵活,数据交流受限。
XML数据库:
XML数据库是XML文档的集合或者说是专门管理XML文档的数据库。XML数据库弥补了关系型数据库的若干不足,但是xml数据库又有它的一些弊端,比如查询速度等。这类数据库主要用于文件系统类型的管理。提供一些参考资料,http://www.etc.edu.cn/articledigest38/chun%20XML.htm这里不做详解。
二、XML文件的应用场景:
1、解析配置文件,程序的灵活性:
对并发处理的性能的要求不是很高,借助jdom或者dom4j来解析这些文件,通常我们把关于数据库的配置放到这里。
<config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
<user-name>drp1</user-name>
<password>drp1</password>
</db-info>
<dao-factory>
<item-dao-facotry>com.bjpowernode.drp.basedata.dao.ItemDaoFactory4Oracle</item-dao-facotry>
<user-dao-facotry>com.bjpowernode.drp.basedata.dao.UserDaoFactory4Oracle</user-dao-facotry>
</dao-factory>
</config>
2、数据交流转换:
是关于javaBean文件的相互映射。因为在系统中的并发量大,访问频率比较高,对性能的要求较高。因此往往需要在某些Servlet初始化的时候,就将一些对象预加载。
<beans>
<bean id="itemDao" name="com.bjpowernode.drp.basedata.dao.ItemDao4OracleImpl"></bean>
<bean id="itemManager" name="com.bjpowernode.drp.basedata.manager.ItemManagerImpl"></bean>
</beans>
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>com.bjpowernode.drp.basedata.web.FileUploadServlet</servlet-class>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/servlet/item/FileUploadServlet</url-pattern>
</servlet-mapping>
load-on-startup标签就是在初始化的时候的预加载,这里的10表示是Servlet初始化顺序的级别,数值越小越优先,但要是正整数。
值得注意的是,如果其他的servlet在初始化函数中需要用到其他servlet,往往需要显示调用super方法,否则可能会出现空指针。
3、跨平台数据交流格式:以上是java程序中常用到xml的地方,在多个语言中,xml还是数据交流的一种数据格式,当然完全可以是跨平台的。
4、可以作为小数据量的存储。
三、不得不说的XMLHttpRequest对象:
如果单说这个对象可能会觉得陌生,但是如果提到异步交互,大家就不会觉得陌生了,因为异步交互主要就是靠这个对象来完成的。应该说当前所有的浏览器都已经支持这个对象引擎了。 他的强大在于:
- 不重新加载页面的情况下更新页面
- 在页面已加载后,从服务器请求、发送、接收数据
Ajax使用最多的异步和数据库交互,除了这个最常见的应用,还可以使用XMLHttpRequest对象从xml数据源中读取数据,然后动态的填充到网页上,当然少不了js的支持。http://www.w3school.com.cn/tiy/t.asp?f=xdom_httprequest_js_4
四、使用dom4j解析xml实现数据库访问:
1.首先添加dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar的引用。将这两个jar包复制到WEB-INF的子目录lib下。
2.sys-config.xml中配置:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<db-info>
<driver-name>oracle.jdbc.driver.OracleDriver</driver-name>
<url>jdbc:oracle:thin:@localhost:1521:orcl</url>
<user-name>XXX</user-name>
<password>XXX</password>
</db-info>
</config>
3.XmlConfigReader类中封装访问数据库的方法:(JdbcConfig是一个封装了数据库连接信息的自定义类)。
public class XmlConfigReader {
//懒汉式(延迟加载lazy)
private static XmlConfigReader instance = null;
//保存jdbc相关配置信息
private JdbcConfig jdbcConfig = new JdbcConfig();
private XmlConfigReader() {
SAXReader reader = new SAXReader();
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
try {
Document doc = reader.read(in);
//取得jdbc相关配置信息
Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
Element urlElt = (Element)doc.selectObject("/config/db-info/url");
Element userNameElt = (Element)doc.selectObject("/config/db-info/user-name");
Element passwordElt = (Element)doc.selectObject("/config/db-info/password");
//设置jdbc相关的配置
jdbcConfig.setDriverName(driverNameElt.getStringValue());
jdbcConfig.setUrl(urlElt.getStringValue());
jdbcConfig.setUserName(userNameElt.getStringValue());
jdbcConfig.setPassword(passwordElt.getStringValue());
System.out.println("读取jdbcConfig-->>" + jdbcConfig);
} catch (DocumentException e) {
e.printStackTrace();
}
}
public static synchronized XmlConfigReader getInstance() {
if (instance == null) {
instance = new XmlConfigReader();
}
return instance;
}
/**
* 返回jdbc相关配置
* @return
*/
public JdbcConfig getJdbcConfig() {
return jdbcConfig;
}
}
将来在使用的时候,可以使用下面的语句调用:
JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();
五、dom4j解析xml重点技术解析:
dom4j用于解析xml,xPath的作用是访问xml节点。SAXReader 对象用于读取数据,InputStream是输入流对象,首先将指定的xml文件读取到流中:
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");
再使用SAXReader 对象的read方法包装成Document对象,这样就可以使用xPath读取xml中的节点了。
读取单个节点是一个Element元素:
Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");
当然可以遍历某些节点的子节点:
假如有这样一个xml结构:
<dao-factory>
<item-dao-facotry>com.bjpowernode.drp.basedata.dao.ItemDaoFactory4Oracle</item-dao-facotry>
<user-dao-facotry>com.bjpowernode.drp.basedata.dao.UserDaoFactory4Oracle</user-dao-facotry>
</dao-factory>
通过xPath读取xml文件到document中后,可以使用document的selectNodes方法来遍历:
private Map<String, String> daoFactoryMap = new HashMap<String, String>();
//取得DaoFactory信息
List daoFactorylist = doc.selectNodes("/config/dao-factory/*");
for (int i=0; i<daoFactorylist.size(); i++) {
Element daoFactoryElt = (Element)daoFactorylist.get(i);
String tagName = daoFactoryElt.getName();
String tagText = daoFactoryElt.getText();
System.out.println("读取DaoFactory-->>" + tagText);
//放入到Map中
daoFactoryMap.put(tagName, tagText);
}
daoFactoryMap的定义:
private Map<String, String> daoFactoryMap = new HashMap<String, String>();
这里值得注意的是selectNodes("/config/dao-factory/*")和selectNodes("/config/dao-factory")的区别。如果使用/config/dao-factory路径,得不到item-dao-facotry节点对象,而是dao-factory节点。
总结:
关于xPath解析xml还有很多语法,这里只是泛泛的介绍一下xml和它在java中的应用并以封装对Oracle数据库的访问为例,熟悉了一下dom4j配合xPath解析xml的方法。
比较详细的xPath解析xml的语法参见:http://zhangjunhd.blog.51cto.com/113473/126310/