一、JDOM解析

  特征:

  1、仅使用具体类,而不使用接口。

  2、API大量使用了Collections类。

  Jdom由6个包构成:

  • Element类表示XML文档的元素
  • org.jdom:      解析xml文件所要用到的基础类
  • org.jdom.adapters:   包含DOM适配的Java类
  • org.jdom.filter:      包含xml文档的过滤类
  • org.jdom.input:     包含读取XML文档的Java类
  • org.jdom.output:      包含输出XML文档的类
  • org.jdom.trans form: 包含将Jdom xml文档接口转换为其他XML文档接口的Java类

  以下是实例:

  • 下载jdom包,解压文件jdom-2.0.6.jar,将包导入项目。

  

  • 使用jdom创建一个xml文件,名字为people.xml
package cn.XmlFile;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter; //生成xml文件
public class CreateJdom { public static void main(String[] args) {
//定义元素
Element people,student;
people = new Element("people");
student = new Element("student");
//设置属性
student.setAttribute("name", "张三");
student.setAttribute("salary","8000");
//设置文本
student.setText("呵呵");
//将其添加到根目录下
people.addContent(student); //新建一个文档。
Document doc = new Document(people);
//读取格式,赋值给当前的Format
Format format = Format.getCompactFormat();
//对当前格式进行初始化
format.setEncoding("UTF-8");
//设置xml文件缩进4个空格
format.setIndent(" ");
//建一个xml输出工厂,将格式给工厂
XMLOutputter xmlout = new XMLOutputter(format);
try {
//将其写好的文本给工厂,并且建一个文件输出流,将数据输出
xmlout.output(doc, new FileOutputStream("D:\\MyPractice01\\sources\\people.xml"));
System.out.println("成功!");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

   

  • 使用Jdom解析people.xml文件
package cn.XmlFile;

import java.io.IOException;
import java.util.List; import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder; //读取people.xml文档
public class ReadxmlByJDOM { public static void main(String[] args) {
//新建构造器解析xml
SAXBuilder sax = new SAXBuilder();
//建一个文档去接受数据
Document doc;
try {
//获取people.xml文档
doc = sax.build("D:\\MyPractice01\\sources\\people.xml");
//获得根节点
Element people = doc.getRootElement();
//获得根节点下的节点数据
List<Element> list = people.getChildren();
for(int i = 0;i<list.size();i++){
Element e = list.get(i);
//获得属性值
System.out.println("name:"+e.getAttributeValue("name")+" salary:"+e.getAttributeValue("salary"));
//获得文本值
System.out.println(e.getText());
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

  

二、DOM4J解析

  DOM4J是dom4j.org出品的一个开源XML解析包,它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

  DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。DOM4J最大的特色是使用大量的接口,这也是它被认为比JDOM灵活的主要原因。

  特征:

  • JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能。
  • 它使用接口和抽象基本类方法。
  • 具有性能优异、灵活性好、功能强大和极端易用的特点。
  • 是一个开放源码的文件。

  它的主要接口都在org.dom4j这个包里定义:

  

  1、读取并解析XML文档: 

  读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。

// 从文件读取XML,输入文件名,返回XML文档
public Document read(String fileName) throws MalformedURLException, DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(fileName));
return document;
}

  其中,reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取。得到的Document对象就带表了整个XML。

  注意,读取的字符编码是按照XML文件头定义的编码来转换。如果遇到乱码问题,注意要把各处的编码名称保持一致即可。

  2、 取得Root节点 

  读取后的第二步,就是得到Root节点,一切XML分析都是从Root元素开始的。

public Element getRootElement(Document doc){
return doc.getRootElement();
}

  3、 遍历XML树 

  DOM4J提供至少3种遍历节点的方法:

  1) 枚举(Iterator)

// 枚举所有子节点
for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
Element element = (Element) i.next();
// do something
}
// 枚举名称为foo的节点
for ( Iterator i = root.elementIterator(foo); i.hasNext();) {
Element foo = (Element) i.next();
// do something
}
// 枚举属性
for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
Attribute attribute = (Attribute) i.next();
// do something
}

  2)递归 

  递归也可以采用Iterator作为枚举手段,但文档中提供了另外的做法。  

public void treeWalk() {
treeWalk(getRootElement());
}
public void treeWalk(Element element) {
for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
} else { // do something....
}
}
} 

  3) Visitor模式 

  最令人兴奋的是DOM4J对Visitor的支持,这样可以大大缩减代码量,并且清楚易懂。了解设计模式的人都知道,Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。我们来看DOM4J中的Visitor模式(快速文档中没有提供) 。

  只需要自定一个类实现Visitor接口即可。  

public class MyVisitor extends VisitorSupport {
  public void visit(Element element){
    System.out.println(element.getName());
  }
  public void visit(Attribute attr){
    System.out.println(attr.getName());
  }
}

  调用:root.accept(new MyVisitor())

  Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。

  4、 XPath支持 

  DOM4J对XPath有良好的支持,如访问一个节点,可直接用XPath选择。

public void bar(Document document) {
List list = document.selectNodes( //foo/bar );
Node node = document.selectSingleNode(//foo/bar/author);
String name = node.valueOf( @name );
}

  例如,如果你想查找XHTML文档中所有的超链接,下面的代码可以实现。

public void findLinks(Document document) throws DocumentException {
List list = document.selectNodes( //a/@href );
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
Attribute attribute = (Attribute) iter.next();
String url = attribute.getValue();
}
}

  5、 字符串与XML的转换 

// XML转字符串
Document document = ...;
String text = document.asXML();
// 字符串转XML
String text = James ;
Document document = DocumentHelper.parseText(text);

  6 、用XSLT转换XML

public Document styleDocument(
Document document,
String stylesheet
) throws Exception {
// load the transformer using JAXP
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(
new StreamSource( stylesheet )
);
// now lets style the given document
DocumentSource source = new DocumentSource( document );
DocumentResult result = new DocumentResult();
transformer.transform( source, result );
// return the transformed document
Document transformedDoc = result.getDocument();
return transformedDoc;
}

  7、 创建XML 

  一般创建XML是写文件前的工作,这就像StringBuffer一样容易。

public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement(root);
Element author1 =
root
.addElement(author)
.addAttribute(name, James)
.addAttribute(location, UK)
.addText(James Strachan);
Element author2 =
root
.addElement(author)
.addAttribute(name, Bob)
.addAttribute(location, US)
.addText(Bob McWhirter);
return document;
}

  8、文件输出 
  一个简单的输出方法是将一个Document或任何的Node通过write方法输出。

FileWriter out = new FileWriter( foo.xml );
document.write(out);

  如果你想改变输出的格式,比如美化输出或缩减格式,可以用XMLWriter类。

public void write(Document document) throws IOException {
// 指定文件
XMLWriter writer = new XMLWriter(
new FileWriter( output.xml )
);
writer.write( document );
writer.close();
// 美化格式
OutputFormat format = OutputFormat.createPrettyPrint();
writer = new XMLWriter( System.out, format );
writer.write( document );
// 缩减格式
format = OutputFormat.createCompactFormat();
writer = new XMLWriter( System.out, format );
writer.write( document );
}

  9、操作XML文档

  1)建立一个XML文档

/**
* 建立一个XML文档,文档名由输入属性决定
* @param filename 需建立的文件名
* @return 返回操作结果, 0表失败, 1表成功
*/
public int createXMLFile(String filename){
/** 返回操作结果, 0表失败, 1表成功 */
int returnValue = 0;
/** 建立document对象,定义一个XML文档对象。*/
Document document = DocumentHelper.createDocument();
/** 建立XML文档的根books */
Element booksElement = document.addElement("books");
/** 加入一行注释 */
booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
/** 加入第一个book节点,这句定义一个XML元素,这里添加的是根节点*/
Element bookElement = booksElement.addElement("book");
/** 加入show属性内容 */
bookElement.addAttribute("show","yes");
/** 加入title节点 */
Element titleElement = bookElement.addElement("title");
/** 为title设置内容 */
titleElement.setText("Dom4j Tutorials"); /** 类似的完成后两个book */
bookElement = booksElement.addElement("book");
bookElement.addAttribute("show","yes");
titleElement = bookElement.addElement("title");
titleElement.setText("Lucene Studing");
bookElement = booksElement.addElement("book");
bookElement.addAttribute("show","no");
titleElement = bookElement.addElement("title");
titleElement.setText("Lucene in Action"); /** 加入owner节点 */
Element ownerElement = booksElement.addElement("owner");
ownerElement.setText("O'Reilly"); try{
/** 将document中的内容写入文件中。通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法
       * 格式化输出,默认采用createCompactFormat()方法,显示比较紧凑
       */
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
writer.write(document);
writer.close();
/** 执行成功,需返回1 */
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
} return returnValue;
}

  2)修改XML文件中内容

   /**
* 修改XML文件中内容,并另存为一个新文件
* 重点掌握dom4j中如何添加节点,修改节点,删除节点
* @param filename 修改对象文件
* @param newfilename 修改后另存为该文件
* @return 返回操作结果, 0表失败, 1表成功
*/
public int ModiXMLFile(String filename,String newfilename){
int returnValue = 0;
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filename));
/** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */
/**通过xpath查找到相应内容。通过setValue()、setText()修改节点内容。通过remove()删除节点或属性。*/
           List list = document.selectNodes("/books/book/@show" );
Iterator iter = list.iterator();
while(iter.hasNext()){
Attribute attribute = (Attribute)iter.next();
if(attribute.getValue().equals("yes")){
attribute.setValue("no");
}
} /**
     * 修改内容之二: 把owner项内容改为Tshinghua
* 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type
*/
list = document.selectNodes("/books/owner" );
iter = list.iterator();
if(iter.hasNext()){
Element ownerElement = (Element)iter.next();
ownerElement.setText("Tshinghua");
Element dateElement = ownerElement.addElement("date");
dateElement.setText("2004-09-11");
dateElement.addAttribute("type","Gregorian calendar");
} /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
list = document.selectNodes("/books/book");
iter = list.iterator();
while(iter.hasNext()){
Element bookElement = (Element)iter.next();
Iterator iterator = bookElement.elementIterator("title");
while(iterator.hasNext()){
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("Dom4j Tutorials")){
bookElement.remove(titleElement);
}
}
} try{
/** 将document中的内容写入文件中 */
XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
writer.write(document);
writer.close();
/** 执行成功,需返回1 */
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
} }catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}

  3)格式化输出和指定编码

  默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。

/**
* 格式化XML文档,并解决中文问题
* @param filename
* @return
*/
public int formatXMLFile(String filename){
int returnValue = 0;
try{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filename));
XMLWriter writer = null;
/** 格式化输出,类型IE浏览一样 */
OutputFormat format = OutputFormat.createPrettyPrint();
/** 指定XML编码 */
format.setEncoding("GBK");
writer= new XMLWriter(new FileWriter(new File(filename)),format);
writer.write(document);
writer.close();
/** 执行成功,需返回1 */
returnValue = 1;
}catch(Exception ex){
ex.printStackTrace();
}
return returnValue;
}

  以下是实例代码:

  student.xml:

<?xml version="1.0" encoding="utf-8"?>
<students>
<student age="25">
<name>张三</name>
<college>信息学院</college>
<telphone>13610262187</telphone>
<notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
</student>
<student >
<name>李四</name>
<college leader="leader">PC学院</college>
<telphone>13610262187</telphone>
<notes>男,1983年生,硕士,现就读于中国农业大学</notes>
</student> </students>

  StudentDom4j.java:

package cn.DOM4JDemo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List; import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.Document;
import org.dom4j.Element; /*
* 使用Dom4j解析XML文档
*/
public class StudentDom4j {
private Document document;
public void getDom(File file){
//创建SAXReader creates a DOM4J tree from SAX parsing events. 创建SAX解析器
SAXReader sax=new SAXReader();
try {
//生成DOM树
document=sax.read(file);
} catch (DocumentException e) {
e.printStackTrace();
} } // 读取student.xml文件中的信息
public void showXML(File file){
//获取XML的根节点
Element root=document.getRootElement();
System.out.println("Root:"+root.getName()); //获取所有子元素
List<Element> childlist=root.elements();
System.out.println("total child count:"+childlist.size()); //获取特定名称的子元素
List<Element> student=root.elements("student");
System.out.println(student.size());
for(Iterator it=student.iterator();it.hasNext();){
Element studentele=(Element)it.next();
String age=studentele.attributeValue("age");
if(age!=null){
System.out.println("<"+studentele.getName()+" "+"age="+studentele.attributeValue("age")+">");
}else{
System.out.println("<"+studentele.getName()+">");
} //取name的文本
List<Element> names=studentele.elements("name");
for(Iterator nameit=names.iterator();nameit.hasNext();){
Element name=(Element)nameit.next();
System.out.println("\t"+"name="+name.getText());
}
//取college的文本值
List<Element> colleges=studentele.elements("college");
for(Iterator collegeit=colleges.iterator();collegeit.hasNext();){
Element college=(Element)collegeit.next();
//判断有没有属性,如果有就取属性值isTextOnly()如果这个元素只有文本内容则返回true String leader=college.attributeValue("leader");
String text=college.getText();
if(leader!=null){
System.out.println("\t"+college.getName()+" "+"leader="+leader);
}else{
System.out.println("\t"+"college:"+college.getText());
} }
//获取telphone文本值
List<Element> tel=studentele.elements("telphone");
for(Iterator telit=tel.iterator();telit.hasNext();){
Element telele=(Element) telit.next();
System.out.println("\t"+"telphone:"+telele.getText());
} //获取notes文本值
List<Element> notes=studentele.elements("notes");
for(Iterator noteit=notes.iterator();noteit.hasNext();){
Element noteele=(Element) noteit.next();
System.out.println("\tnoteele:"+noteele.getText());
}
} }
//保存
public void saveXML(File tofile){
// 以XML格式输出createPrettyPrint()创建默认的打印格式
OutputFormat of=OutputFormat.createPrettyPrint();
//设置编码
of.setEncoding("utf-8");
try {
//以XML格式输出到dom4j.xml中
XMLWriter writer=new XMLWriter(new FileOutputStream(tofile),of);
//把源树DOM树输出写进dom4j.xml中
writer.write(document);
writer.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//修改XML元素
public void updateEle(){
//先要获取到age
//得到根元素
Element root=document.getRootElement();
//得到 student元素
List<Element> students=root.elements("student");
//修改<student age="25">的age属性为22
for(Iterator stuit=students.iterator();stuit.hasNext();){
Element stu=(Element) stuit.next();
String age=stu.attributeValue("age");
if(age!=null){
//就是要替换的,修改属性值
stu.attribute("age").setText("22");
}
//修改<name>李四</name> 的name文本为sb
List<Element> names=stu.elements("name");
for(Iterator name=names.iterator();name.hasNext();){
Element nameele=(Element) name.next();
String nametext=nameele.getText();
if(nametext.equals("李四")){
//替换
nameele.setText("sb");
}
}
//修改<college leader="leader">的leader值为否
List<Element> colleges=stu.elements("college");
for(Iterator collegeit=colleges.iterator();collegeit.hasNext();){
Element college=(Element) collegeit.next();
String leader=college.attributeValue("leader");
if(leader!=null){
//替换
college.attribute("leader").setText("否");
}
}
}
} //新增元素
public void addEle(){
/* <student >
<name>杜和雨</name>
<college leader="leader">PC学院</college>
</student>*/
//创建根节点
Element root=document.getRootElement();
//创建student标签
Element student=root.addElement("student");
//创建student子标签name
Element name=student.addElement("name");
//给name添加文本
name.setText("杜和雨");
//创建student的子标签college
Element college=student.addElement("college");
//给college添加文本值
college.addAttribute("leader", "big boss"); }
// 删除元素
public void deleteEle(){
/* <student >
<name>李四</name>
<college leader="leader">PC学院</college>
<telphone>13610262187</telphone>
<notes>男,1983年生,硕士,现就读于中国农业大学</notes>
</student>*/ //得到 根节点
Element root=document.getRootElement();
//找到 student节点
List<Element> students=root.elements();
//删除第1个student节点的所有子节点
//students.remove(0); //删除college的属性leader
for(Iterator<Element> stuit=students.iterator();stuit.hasNext();){
Element stu=stuit.next();
List<Element> colleges=stu.elements();
for(Iterator<Element> collit=colleges.iterator();collit.hasNext();){
Element coll=collit.next();
String leader=coll.attributeValue("leader");
if(leader!=null){
coll.remove(coll.attribute("leader"));
}
}
} } // 主函数,测试
public static void main(String[] args){
StudentDom4j sd=new StudentDom4j();
File file=new File("D:\\MyPractice01\\sources\\student.xml");
File tofile=new File("D:\\MyPractice01\\sources\\dom4j_student.xml");
sd.getDom(file);
sd.showXML(file);
sd.updateEle();
sd.addEle();
sd.deleteEle();
sd.saveXML(tofile);
} }

  

三、总结

  DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。

JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。

SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。

Java高级特性 第15节 解析XML文档(3) - JDOM和DOM4J技术的更多相关文章

  1. Java高级特性 第13节 解析XML文档(1) - DOM和XPath技术

    一.使用DOM解析XML文档 DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树 ...

  2. Java高级特性 第14节 解析XML文档(2) - SAX 技术

    一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用S ...

  3. 使用DOM4J解析XML文档,以及使用XPath提取XML文档

    使用DOM4J解析XML文档 需要首先下载DOM4J工具包.这是个第三方工具包 在使用DOM4J解析的时候需要导入 DOM4J的JAR包 下载DOM4J工具包->在MyEclipse中新建lib ...

  4. Java高级特性 第12节 XML技术

    一.XML简介 1. XML介绍 XML是可扩展标记语言(Extensible Markup Language ),XML是一种数据格式,类似 HTML,是使用标签进行内容描述的技术,与HTML不同的 ...

  5. 浅谈用java解析xml文档(四)

    继续接上一文,这一阵子因为公司项目加紧,导致最后一个解析xml文档的方式,还没有总结,下面总结使用dom4J解析xml. DOM4J(Document Object Model for Java) 使 ...

  6. 浅谈用java解析xml文档(三)

    接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作 ...

  7. java解析xml文档(dom)

    DOM解析XML文档 读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵. DOM解析的特性就是读取xml文件 ...

  8. java 解析XML文档

    Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...

  9. 浅谈用java解析xml文档(二)

    上一文中总结了dom解析xml文档的方式,本文开始总结使用SAX解析xml 的方式及它的优缺点! SAX(Simple API for XML),是指一种接口,或者一个软件包. 首先我们应该知道SAX ...

随机推荐

  1. Oracle 遇到的问题 (1)

    1.ORA-01502:索引'DBEPMS.SYS_C009390'或这类索引的分区处于不可用状态 解决方法:[注 索引命名规则 IX_表名简称_列名简称/IX_表名简称_序号(索引长度在30字符以内 ...

  2. spring学习遇到的问题汇总

    1.spring注解路由方面的误解 我一直以为在web.xml中配置拦截*.action后,在注解路由的时候必须要xxxx.action. 刚才发现,访问的时候xxxx.action,然后@Reque ...

  3. 一步一步学android之布局管理器——RelativeLayout

    今天开始学习RelativeLayout(相对布局),相对布局在平时布局的时候用的较多,因为Android适配方面的原因.相对布局可以控制组件摆放的位置(放在任一组件的上下左右等位置),下面来看看类的 ...

  4. Zookeeper Watcher 解析

    1.Watcher 接口源码 1. 当客户端向zookeeper注册了watcher时,当服务器向客户端发送一个watcher事件通知时,客户端会调用回调方法process(WatchedEvent ...

  5. iOS9下App Store新应用提审攻略

    博文转载 CocoaChina 文/文公子 公子在第十讲中提到应用更新时需要注意的细节和苹果便捷通道的利用.今天,公子将进一步深扒iTunes Connect的面纱,为大家呈现新应用在提审前需要准备的 ...

  6. POJ 1142:Smith Numbers(分解质因数)

                                   Smith Numbers Time Limit: 1000MS   Memory Limit: 10000K Total Submiss ...

  7. Oracle 关于WKT构造SDO_GEOMETRY的问题。

    由于系统前端使用OpenLayers框架,后台数据库使用oracle spatial.大家知道Oracle spatial的SDO_GEOMETRY十分复杂,如果使用期java api ,那就坑爹了, ...

  8. PHP array_diff 计算数组的差集

    array_diff (PHP 4 >= 4.0.1, PHP 5) array_diff — 计算数组的差集 说明 array array_diff ( array $array1 , arr ...

  9. 页面返回刷新或H5监听(手机的)返回键

    1. pushHistory(); window.addEventListener("popstate", function(e) { alert("我监听到了浏览器的返 ...

  10. 基于CentOS7系统一键配置Aria2 实现服务器离线下载工具

    我们有些网友购买的海外VPS主机并不是用来做网站的,而是用来作为下载资源工具使用的.确实用这样的工具搭建之后是比本地下载速度快,因为有些资源.软件等是海外资源,而且挂载在服务器上不占用本地的资源.在这 ...