2008年12月2日

public class Singleton {
 private static Singleton instance ;
 
 public static Singleton getInstance(){
  instance = new Singleton();
  return instance;
 }
}
posted @ 2008-12-02 14:44 whatever 阅读(120) | 评论 (0)编辑 收藏
 

1. 介绍

1)DOM(JAXP Crimson解析器)
        DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。

2)SAX

        SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。
   选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说,  选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。

  DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。

  SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

3)JDOM           http://www.jdom.org/

          JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。

  JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。

  JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。

  JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。

4)DOM4J http://dom4j.sourceforge.net/ 
            
        虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。

  为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。

  在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。

  DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J。

2.. 比较

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

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

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

3. 四种xml操作方式的基本使用方法

xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<Result>
   <VALUE>
       <NO DATE="2005">A1</NO>
       <ADDR>GZ</ADDR>
   </VALUE>
   <VALUE>
       <NO DATE="2004">A2</NO>
       <ADDR>XG</ADDR>
  </VALUE>
</Result>

1)DOM

import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class MyXMLReader{
 public static void main(String arge[]){

  long lasting =System.currentTimeMillis();
  try{ 
   File f=new File("data_10k.xml");
   DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
   DocumentBuilder builder=factory.newDocumentBuilder();
   Document doc = builder.parse(f);
   NodeList nl = doc.getElementsByTagName("VALUE");
   for (int i=0;i<nl.getLength();i++){
    System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
    System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
   }
  }catch(Exception e){
   e.printStackTrace();
}

2)SAX

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class MyXMLReader extends DefaultHandler {

 java.util.Stack tags = new java.util.Stack();
 public MyXMLReader() {
  super();
   }

 public static void main(String args[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXParserFactory sf = SAXParserFactory.newInstance();
   SAXParser sp = sf.newSAXParser();
   MyXMLReader reader = new MyXMLReader();
   sp.parse(new InputSource("data_10k.xml"), reader);
  } catch (Exception e) {
   e.printStackTrace();
  }

  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}
  public void characters(char ch[], int start, int length) throws SAXException {
  String tag = (String) tags.peek();
  if (tag.equals("NO")) { 
   System.out.print("车牌号码:" + new String(ch, start, length));
    }
    if (tag.equals("ADDR")) {
  System.out.println("地址:" + new String(ch, start, length));
    }
   }

  public void startElement(String uri,String localName,String qName,Attributes attrs) {
  tags.push(qName);}

3) JDOM

import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;

public class MyXMLReader {

 public static void main(String arge[]) {
  long lasting = System.currentTimeMillis();
  try {
   SAXBuilder builder = new SAXBuilder(); 
   Document doc = builder.build(new File("data_10k.xml")); 
   Element foo = doc.getRootElement(); 
   List allChildren = foo.getChildren(); 
   for(int i=0;i<allChildren.size();i++) { 
    System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());
    System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
   }
  } catch (Exception e) {
   e.printStackTrace();
}

}

4)DOM4J

import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;

public class MyXMLReader {

 public static void main(String arge[]) {
  long lasting = System.currentTimeMillis();
  try {
   File f = new File("data_10k.xml");
   SAXReader reader = new SAXReader();
   Document doc = reader.read(f);
   Element root = doc.getRootElement();
   Element foo;
   for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
    foo = (Element) i.next();
    System.out.print("车牌号码:" + foo.elementText("NO"));
    System.out.println("车主地址:" + foo.elementText("ADDR"));
   }
  } catch (Exception e) {
   e.printStackTrace();
    }
}

转自:http://blog.chinaunix.net/u/25176/showart_379827.html

posted @ 2008-12-02 11:32 whatever 阅读(411) | 评论 (0)编辑 收藏
 

写一个基类继承HibernateDaoSupport。使用自己的基类,要脱离Spring时,只要将HibernateDaoSupport改掉

posted @ 2008-12-02 09:45 whatever 阅读(208) | 评论 (0)编辑 收藏

2008年12月1日

http://www.blogjava.net/rongxh7/archive/2008/11/29/243456.html
posted @ 2008-12-01 16:06 whatever 阅读(111) | 评论 (0)编辑 收藏

2008年11月6日

今天在开心网逛的时候发现他上传图片的时候用了一个操作
很好的解决了firefox在点击浏览文件之后不能清楚文本框里的值的问题
于是就像这个该怎么实现
结果没想出来,不过google一下终于还是找到了解决办法
不晓得是不是最好的,但可以先留着以防万一要用呢
呵呵

引于下面这个bolg:http://www.x2blog.cn/SupNate/?tid=15693
//清空文件上传框
function clearFileInput(file){
    
var form=document.createElement('form');
    document.body.appendChild(form);
    
//记住file在旧表单中的的位置
    var pos=file.nextSibling;
    form.appendChild(file);
    form.reset();
    pos.parentNode.insertBefore(file,pos);
    document.body.removeChild(form);
}

posted @ 2008-11-06 17:41 whatever 阅读(144) | 评论 (0)编辑 收藏
 
昨天晚上解决乱码的问题真的是整郁闷了
最后还是终于解决了
原因好像是从url取出的数据是“iso8859-1”,而Action中用的是uft-8,所以该先用Encoder包装了,再用utf-8解放出来,就是下面这个
property = URLEncoder.encode(property,"iso8859-1");
property = URLDecoder.decode(property,"utf-8");
不过肯定还有其他方法,先把这个方法记录下来
posted @ 2008-11-06 09:01 whatever 阅读(197) | 评论 (0)编辑 收藏

2008年11月3日

<c:set var="abc" value="dfgd"/>   
  
<table>
    
<c:if test="${ !('' eq abc) }">    

            
<tr>
                
<td>1111</td>
                
<td>1111</td>
            
</tr>
    
</c:if>  
    
<tr>
                
<td>aaa</td>
                
<td>123</td>
            
</tr> 
    
</table>

        
function selectAll(str){
            
var all = document.getElementById("all").checked;
            
var cardIds = document.getElementsByName(str);
            
var n = cardIds.length;
            
if(all == true{    
                
for (var i = 0; i < n; i++)
                    cardIds[i].checked 
= true;
            }
 else {
                
for (var i = 0; i < n; i++)
                    cardIds[i].checked 
= false;
            }

        }
posted @ 2008-11-03 15:42 whatever 阅读(6636) | 评论 (0)编辑 收藏

2008年10月28日

        先记录一下解决办法:在做修改的时候attachDirty方法改为merage方法

        我出现这个问题的时候是在修改的时候出现的,以往我用attachDirty方法没有问题,但是今天在用这个方法的时候用这个方法做修改的时候却老是报错,始终不知道这是为什么原因,看了哈网上的解决方案就试着把方法改成了merage方法。
        才仔细看了哈,好像是因为在session中有两个相同的对象才导致这个原因,具体的也不是很清楚哦,现在说多了怕误人子弟,所以就给个链接吧,有其他人具体说了一下,大家去吧看看,希望该博客的博主不要说我懒哈,呵呵

posted @ 2008-10-28 14:48 whatever 阅读(228) | 评论 (0)编辑 收藏

2008年10月27日

        其实只是blog搬家而已,其实说到搬家自己的blog从来就没有过家,从最初的中国的博客网到新浪到qq空间,在这些对方都曾有过我的足迹,可那些都只是感情上和生活上的一些事情,今天终于跑到blogjava上开辟个小小的空间记录一些应该记住的东西,多学习更要多沉淀。
        其实毕业一年多了真的什么都没有学到,但却受到很多打击,所以这一年活得相当失败也相当郁闷,或许是我真的入错了行吧,可我始终记住我们高中班主任的一句话“事在人为”,虽然我每次都会鄙视他写的这四个字有多难看,可这句话却是他说的很多话中我唯一记住的一句。所以我就在想啊自己肯定会跟别人做的一样好的。
        自信一点,我还是那个可以不眨眼就可以把两个长长的多项式相乘的结果一口气说出来的孩子(这是初中唯一让我仍记忆犹新的事情),我还是那个可以把议论文写的多好似乎无懈可击的年青人(这事咱班主任应该可以证明吧),哈哈,纯属搞笑,过去怎么样一点都不代表什么。只有明天才会让你生活充满乐趣充满激情,一味的活在过去的生活里会让你成为一个懦夫,我不是懦夫所以我会好好对待明天!
       每天也都去发现自己的缺点然后close掉,每天都向别人展示自己的优点,  每天都去发现自己的进步,每天都去向着一个美好的明天迈进!
        come on!nothing is impossible
posted @ 2008-10-27 19:10 whatever 阅读(237) | 评论 (3)编辑 收藏
仅列出标题