<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>jiake0504</title>
    <description></description>
    <link>http://jiake0504.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>javascript GB2312转UTF8</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/214656" style="color:red;">http://jiake0504.javaeye.com/blog/214656</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
/*
 * GB2312转UTF8
 * 例：
 * var xx=new GB2312UTF8();
 * var Utf8=xx.Gb2312ToUtf8("你aaa好aaaaa");
 * var Gb2312=xx.Utf8ToGb2312(Utf8);
 * alert(Gb2312);
 */

function GB2312UTF8(){
  this.Dig2Dec=function(s){
      var retV = 0;
      if(s.length == 4){
          for(var i = 0; i &lt; 4; i ++){
              retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
          }
          return retV;
      }
      return -1;
  } 
  this.Hex2Utf8=function(s){
     var retS = "";
     var tempS = "";
     var ss = "";
     if(s.length == 16){
         tempS = "1110" + s.substring(0, 4);
         tempS += "10" +  s.substring(4, 10); 
         tempS += "10" + s.substring(10,16); 
         var sss = "0123456789ABCDEF";
         for(var i = 0; i &lt; 3; i ++){
            retS += "%";
            ss = tempS.substring(i * 8, (eval(i)+1)*8);
            retS += sss.charAt(this.Dig2Dec(ss.substring(0,4)));
            retS += sss.charAt(this.Dig2Dec(ss.substring(4,8)));
         }
         return retS;
     }
     return "";
  } 
  this.Dec2Dig=function(n1){
      var s = "";
      var n2 = 0;
      for(var i = 0; i &lt; 4; i++){
         n2 = Math.pow(2,3 - i);
         if(n1 >= n2){
            s += '1';
            n1 = n1 - n2;
          }
         else
          s += '0';
      }
      return s;      
  }

  this.Str2Hex=function(s){
      var c = "";
      var n;
      var ss = "0123456789ABCDEF";
      var digS = "";
      for(var i = 0; i &lt; s.length; i ++){
         c = s.charAt(i);
         n = ss.indexOf(c);
         digS += this.Dec2Dig(eval(n));
      }
      return digS;
  }
  this.Gb2312ToUtf8=function(s1){
    var s = escape(s1);
    var sa = s.split("%");
    var retV ="";
    if(sa[0] != ""){
      retV = sa[0];
    }
    for(var i = 1; i &lt; sa.length; i ++){
      if(sa[i].substring(0,1) == "u"){
        retV += this.Hex2Utf8(this.Str2Hex(sa[i].substring(1,5)));
		if(sa[i].length){
		  retV += sa[i].substring(5);
		}
      }
      else{
	    retV += unescape("%" + sa[i]);
		if(sa[i].length){
		  retV += sa[i].substring(5);
		}
	  }
    }
    return retV;
  }
  this.Utf8ToGb2312=function(str1){
        var substr = "";
        var a = "";
        var b = "";
        var c = "";
        var i = -1;
        i = str1.indexOf("%");
        if(i==-1){
          return str1;
        }
        while(i!= -1){
		  if(i&lt;3){
                substr = substr + str1.substr(0,i-1);
                str1 = str1.substr(i+1,str1.length-i);
                a = str1.substr(0,2);
                str1 = str1.substr(2,str1.length - 2);
                if(parseInt("0x" + a) & 0x80 == 0){
                  substr = substr + String.fromCharCode(parseInt("0x" + a));
                }
                else if(parseInt("0x" + a) & 0xE0 == 0xC0){ //two byte
                        b = str1.substr(1,2);
                        str1 = str1.substr(3,str1.length - 3);
                        var widechar = (parseInt("0x" + a) & 0x1F) &lt;&lt; 6;
                        widechar = widechar | (parseInt("0x" + b) & 0x3F);
                        substr = substr + String.fromCharCode(widechar);
                }
                else{
                        b = str1.substr(1,2);
                        str1 = str1.substr(3,str1.length - 3);
                        c = str1.substr(1,2);
                        str1 = str1.substr(3,str1.length - 3);
                        var widechar = (parseInt("0x" + a) & 0x0F) &lt;&lt; 12;
                        widechar = widechar | ((parseInt("0x" + b) & 0x3F) &lt;&lt; 6);
                        widechar = widechar | (parseInt("0x" + c) & 0x3F);
                        substr = substr + String.fromCharCode(widechar);
                }
			  }
			  else {
			   substr = substr + str1.substring(0,i);
			   str1= str1.substring(i);
			  }
              i = str1.indexOf("%");
        }

        return substr+str1;
  }
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/214656#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 18:05:18 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/214656</link>
        <guid>http://jiake0504.javaeye.com/blog/214656</guid>
      </item>
      <item>
        <title>javascript 对时间对象的格式化</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/214654" style="color:red;">http://jiake0504.javaeye.com/blog/214654</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
&lt;script language="JavaScript">
Date.prototype.format = function(format) //author: meizz
{
  var o = {
    "M+" : this.getMonth()+1, //month
    "d+" : this.getDate(),    //day
    "h+" : this.getHours(),   //hour
    "m+" : this.getMinutes(), //minute
    "s+" : this.getSeconds(), //second
    "q+" : Math.floor((this.getMonth()+3)/3),  //quarter
    "S" : this.getMilliseconds() //millisecond
  }
  if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
    (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  for(var k in o)if(new RegExp("("+ k +")").test(format))
    format = format.replace(RegExp.$1,
      RegExp.$1.length==1 ? o[k] : 
        ("00"+ o[k]).substr((""+ o[k]).length));
  return format;
}
alert(new Date().format("yyyy-MM-dd hh:mm:ss"));
&lt;/script>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/214654#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jul 2008 18:00:39 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/214654</link>
        <guid>http://jiake0504.javaeye.com/blog/214654</guid>
      </item>
      <item>
        <title>Comparator使用小结收藏</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/214068" style="color:red;">http://jiake0504.javaeye.com/blog/214068</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
java.util.Comparator
 
１：java.util.Comparator是一个接口，只包含两个方法：

方法摘要
 int
	
compare(T o1, T o2)
          比较用来排序的两个参数。
 boolean
	
equals(Object obj)
          指示是否其他对象“等于”此 Comparator。
 
２：在JDK中对java.util.Comparator的功能的解释为：“强行对某些对象 collection 进行整体排序”。
具体的实现是在compare(T o1, T o2) 方法中自定义排序算法，然后将Comparator对象（实现了java.util.Comparator接口的对象）作为一个参数传递给欲排序对象 collection的某些排序方法。某些排序方法指的是能够接受java.util.Comparator参数的方法，比如：java.util. Arrays的public static void sort(Object[] a, Comparator c)
 
３：典型例程：

import java.util.Comparator;

 

public class ByWeightComparator implements Comparator

   {

 

   /**

   * Compare two Trucks by weight. Callback for sort or TreeMap.

   * effectively returns a-b; orders by ascending weight

   *

   * @param pFirst first object a to be compared

   *

   * @param pSecond second object b to be compared

   *

   * @return +1 if a>b, 0 if a=b, -1 if a&lt;b

   */

   public final int compare ( Object pFirst, Object pSecond )

      {

      long aFirstWeight = ( (Truck)pFirst ).weight;

      long aSecondWeight = ( (Truck)pSecond ).weight;

      /* need signum to convert long to int, (int)will not do! */

      return signum( aFirstWeight - aSecondWeight );

      } // end compare

   /**

   * Collapse number down to +1 0 or -1 depending on sign.

   * Typically used in compare routines to collapse a difference

   * of two longs to an int.

   *

   * @param diff usually represents the difference of two long.

   *

   * @return signum of diff, +1, 0 or -1.

   */

   public static final int signum ( long diff )

      {

      if ( diff > 0 ) return 1;

      if ( diff &lt; 0 ) return -1;

      else return 0;

      } // end signum

 

   } // end class ByWeight
程序来源：http://mindprod.com/jgloss/comparator.html
 

4：以下程序演示了如何对自定义对象进行排序：

package mypack;

 

import java.util.Arrays;

import java.util.Comparator;

 

public class ComparatorTest {

 

    @SuppressWarnings("unchecked")

    public static void main(String[] args) {

       Dog o1 = new Dog("dog1", 1, 5);

       Dog o2 = new Dog("dog2", 2, 4);

       Dog o3 = new Dog("dog3", 3, 3);

       Dog o4 = new Dog("dog4", 4, 2);

       Dog o5 = new Dog("dog5", 5, 1);

 

       Dog[] dogs = new Dog[] { o1, o4, o3, o5, o2 };

 

       System.out.println("未排序前");

       for (int i = 0; i &lt; dogs.length; i++) {

           Dog dog = dogs[i];

           System.out.println(dog.getName());

       }

 

       Arrays.sort(dogs, new ByHeightComparator());

       System.out.println("使用高度排序之后：");

       for (int i = 0; i &lt; dogs.length; i++) {

           Dog dog = dogs[i];

           System.out.println(dog.getName());

       }

 

       Arrays.sort(dogs, new ByWeightComparator());

       System.out.println("使用重量排序之后：");

       for (int i = 0; i &lt; dogs.length; i++) {

           Dog dog = dogs[i];

           System.out.println(dog.getName());

       }

 

    }

}

 

class Dog {

 

    private String name;

 

    private int weight;

 

    private int height;

 

    public Dog(String name, int weight, int height) {

       this.setName(name);

       this.weight = weight;

       this.height = height;

    }

 

    public int getHeight() {

       return height;

    }

 

    public void setHeight(int height) {

       this.height = height;

    }

 

    public int getWeight() {

       return weight;

    }

 

    public void setWeight(int weight) {

       this.weight = weight;

    }

 

    public void setName(String name) {

       this.name = name;

    }

 

    public String getName() {

       return name;

    }

}

 

class ByWeightComparator implements Comparator {

 

    public int compare(Object firstDog, Object secondDog) {

       int firstWeight = ((Dog) firstDog).getWeight();

       int secondWeight = ((Dog) secondDog).getWeight();

       return signum(firstWeight - secondWeight);

    }

 

    public static final int signum(int diff) {

       if (diff > 0)

           return 1;

       if (diff &lt; 0)

           return -1;

       else

           return 0;

    }

 

}

 

class ByHeightComparator implements Comparator {

 

    public int compare(Object firstDog, Object secondDog) {

       int firstHeight = ((Dog) firstDog).getHeight();

       int secondHeight = ((Dog) secondDog).getHeight();

       return signum(firstHeight - secondHeight);

    }

 

    public static final int signum(int diff) {

       if (diff > 0)

           return 1;

       if (diff &lt; 0)

           return -1;

       else

           return 0;

    }

 

}

5：以下程序演示了如何对中文进行排序

package mypack;

 

import java.text.Collator;

import java.text.RuleBasedCollator;

import java.util.Arrays;

import java.util.Locale;

 

public class Test {

    public static void main(String[] args) {

       String[] test = new String[] { "的", "波", "次", "啊"};

       Arrays.sort(test, (RuleBasedCollator) Collator.getInstance(Locale.CHINA));

       for (String key : test)

           System.out.println(key);

    }

 

}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/214068#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 22:53:20 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/214068</link>
        <guid>http://jiake0504.javaeye.com/blog/214068</guid>
      </item>
      <item>
        <title>jsl的用法</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/213701" style="color:red;">http://jiake0504.javaeye.com/blog/213701</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
作者的网站上对它的特征有如下描述：
● 支持Excel 95-2000的所有版本
● 生成Excel 2000标准格式
● 支持字体、数字、日期操作
● 能够修饰单元格属性
● 支持图像和图表
应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的，并不依赖Windows系统，即使运行在Linux下，它同样能够正确的处理Excel文件。另外需要说明的是，这套API对图形和图表的支持很有限，而且仅仅识别PNG格式。
搭建环境
将下载后的文件解包，得到jxl.jar，放入classpath，安装就完成了。
基本操作
一、创建文件
拟生成一个名为“测试数据.xls”的Excel文件，其中第一个工作表被命名为“第一页”，大致效果如下：
代码（CreateXLS.java）：
//生成Excel的类
import java.io.*;
import jxl.*;
import jxl.write.*;
public class CreateXLS
{
public static void main(String args[])
{
try
{
//打开文件
WritableWorkbook book=
Workbook.createWorkbook(new File(“测试.xls”));
//生成名为“第一页”的工作表，参数0表示这是第一页
WritableSheet sheet=book.createSheet(“第一页”,0);
//在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
//以及单元格内容为test
Label label=new Label(0,0,”test”);
//将定义好的单元格添加到工作表中
sheet.addCell(label);

jxl.write.Number number = new jxl.write.Number(1,0,789.123);
sheet.addCell(number);
//写入数据并关闭文件
book.write();
book.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
编译执行后，会在当前位置产生一个Excel文件。
三、读取文件
以刚才我们创建的Excel文件为例，做一个简单的读取操作，程序代码如下：
//读取Excel的类
import java.io.*;
import jxl.*;
public class ReadXLS
{
public static void main(String args[])
{
try
{
Workbook book=
Workbook.getWorkbook(new File(“测试.xls”));
//获得第一个工作表对象
Sheet sheet=book.getSheet(0);
//得到第一列第一行的单元格
Cell cell1=sheet.getCell(0,0);
String result=cell1.getContents();
System.out.println(result);
book.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
程序执行结果：test
四、修改文件
利用jExcelAPI可以修改已有的Excel文件，修改Excel文件的时候，除了打开文件的方式不同之外，其他操作和创建Excel是一样的。下面的例子是在我们已经生成的Excel文件中添加一个工作表：
//修改Excel的类，添加一个工作表
import java.io.*;
import jxl.*;
import jxl.write.*;
public class UpdateXLS
{
public static void main(String args[])
{
try
{
//Excel获得文件
Workbook wb=Workbook.getWorkbook(new File(“测试.xls”));
//打开一个文件的副本，并且指定数据写回到原文件
WritableWorkbook book=
Workbook.createWorkbook(new File(“测试.xls”),wb);
//添加一个工作表
WritableSheet sheet=book.createSheet(“第二页”,1);
sheet.addCell(new Label(0,0,”第二页的测试数据”));
book.write();
book.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
执行结果如图：
高级操作
一、 数据格式化
在Excel中不涉及复杂的数据类型，能够比较好的处理字串、数字和日期已经能够满足一般的应用。
1、 字串格式化
字符串的格式化涉及到的是字体、粗细、字号等元素，这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时，使用如下语句，为方便叙述，我们为每一行命令加了编号：

WritableFont font1=
new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD); 或//设置字体格式为excel支持的格式 WritableFont font3=new WritableFont(WritableFont.createFont("楷体_GB2312"),12,WritableFont.NO_BOLD );① WritableCellFormat format1=new WritableCellFormat(font1); ② Label label=new Label(0,0,”data 4 test”,format1) ③ 其中①指定了字串格式：字体为TIMES，字号16，加粗显示。WritableFont有非常丰富的构造子，供不同情况下使用，jExcelAPI的java-doc中有详细列表，这里不再列出。 ②处代码使用了WritableCellFormat类，这个类非常重要，通过它可以指定单元格的各种属性，后面的单元格格式化中会有更多描述。 ③处使用了Label类的构造子，指定了字串被赋予那种格式。在WritableCellFormat类中，还有一个很重要的方法是指定数据的对齐方式，比如针对我们上面的实例，可以指定：

 //把水平对齐方式指定为居中

format1.setAlignment(jxl.format.Alignment.CENTRE);

//把垂直对齐方式指定为居中

format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

//设置自动换行
 format1.setWrap(true);


 
二、单元格操作
Excel中很重要的一部分是对单元格的操作，比如行高、列宽、单元格合并等，所幸jExcelAPI提供了这些支持。这些操作相对比较简单，下面只介绍一下相关的API。
1、 合并单元格
WritableSheet.mergeCells(int m,int n,int p,int q);
作用是从(m,n)到(p,q)的单元格全部合并，比如：
WritableSheet sheet=book.createSheet(“第一页”,0);
//合并第一列第一行到第六列第一行的所有单元格
sheet.mergeCells(0,0,5,0);
合并既可以是横向的，也可以是纵向的。合并后的单元格不能再次进行合并，否则会触发异常。
2、 行高和列宽
WritableSheet.setRowView(int i,int height);
作用是指定第i+1行的高度，比如：
//将第一行的高度设为200
sheet.setRowView(0,200);
WritableSheet.setColumnView(int i,int width);
作用是指定第i+1列的宽度，比如：
//将第一列的宽度设为30
sheet.setColumnView(0,30);
五、操作图片
public static void write()throws Exception{
        WritableWorkbook wwb=Workbook.createWorkbook(new File("c:/1.xls"));
        WritableSheet ws=wwb.createSheet("Test Sheet 1",0);
        File file=new File("C:\\jbproject\\PVS\\WebRoot\\weekhit\\1109496996281.png");
        WritableImage image=new WritableImage(1, 4, 6, 18,file);
        ws.addImage(image);
        wwb.write();
        wwb.close();
    }
很简单和插入单元格的方式一样，不过就是参数多了些，WritableImage这个类继承了Draw，上面只是他构造方法的一种，最后一个参数不用了说了，前面四个参数的类型都是double，依次是 x, y, width, height,注意，这里的宽和高可不是图片的宽和高，而是图片所要占的单位格的个数，因为继承的Draw所以他的类型必须是double，具体里面怎么实现的我还没细看：）因为着急赶活，先完成功能，其他的以后有时间慢慢研究。以后会继续写出在使用中的心得给大家。
   读:
读的时候是这样的一个思路,先用一个输入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet从工作薄中得到工作表,用Cell得到工作表中得某个单元格.
InputStream->Workbook->Sheet->Cell,就得到了excel文件中的单元格
代码:
String path="c:\\excel.xls";//Excel文件URL
InputStream is = new FileInputStream(path);//写入到FileInputStream
jxl.Workbook wb = Workbook.getWorkbook(is); //得到工作薄
jxl.Sheet st = wb.getSheet(0);//得到工作薄中的第一个工作表
Cell cell=st.getCell(0,0);//得到工作表的第一个单元格,即A1
String content=cell.getContents();//getContents()将Cell中的字符转为字符串
wb.close();//关闭工作薄
is.close();//关闭输入流

我们可以通过Sheet的getCell(x,y)方法得到任意一个单元格,x,y和excel中的坐标对应.
例如A1对应(0,0),A2对应(0,1),D3对应(3,2).Excel中坐标从A,1开始,jxl中全部是从0开始.
还可以通过Sheet的getRows(),getColumns()方法得到行数列数,并用于循环控制,输出一个sheet中的所有内容.
写:
往Excel中写入内容主要是用jxl.write包中的类.
思路是这样的:
OutputStream&lt;-WritableWorkbook&lt;-WritableSheet&lt;-Label
这里面Label代表的是写入Sheet的Cell位置及内容.
代码:
OutputStream os=new FileOutputStream("c:\\test.xls");//输出的Excel文件URL
WritableWorkbook wwb = Workbook.createWorkbook(os);//创建可写工作薄
WritableSheet ws = wwb.createSheet("sheet1", 0);//创建可写工作表
Label labelCF=new Label(0, 0, "hello");//创建写入位置和内容
ws.addCell(labelCF);//将Label写入sheet中
Label的构造函数Label(int x, int y,String aString)xy意同读的时候的xy,aString是写入的内容.
WritableFont wf = new WritableFont(WritableFont.TIMES, 12, WritableFont.BOLD, false);//设置写入字体
WritableCellFormat wcfF = new WritableCellFormat(wf);//设置CellFormat
Label labelCF=new Label(0, 0, "hello");//创建写入位置,内容和格式
Label的另一构造函数Label(int c, int r, String cont, CellFormat st)可以对写入内容进行格式化,设置字体及其它的属性.
现在可以写了
wwb.write();
写完后关闭
wwb.close();
输出流也关闭吧
os.close;
OK,只要把读和写结合起来,就可以在N个Excel中读取数据写入你希望的Excel新表中,还是比较方便的.

下面是程序一例:

程序代码:sql = "select * from tablename";
    rs = stmt.executeQuery(sql);

//新建Excel文件
String filePath=request.getRealPath("aaa.xls");
File myFilePath=new File(filePath);
if(!myFilePath.exists())
myFilePath.createNewFile();
FileWriter resultFile=new FileWriter(myFilePath);
PrintWriter myFile=new PrintWriter(resultFile);
resultFile.close();

        //用JXL向新建的文件中添加内容
    OutputStream outf = new FileOutputStream(filePath);
        jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(outf);
        jxl.write.WritableSheet ws = wwb.createSheet("sheettest", 0);

int i=0;
        int j=0;

for (int k = 0; k &lt; rs.getMetaData().getColumnCount(); k++) {
    ws.addCell(new Label(k,0,rs.getMetaData().getColumnName(k+1)));
}

while(rs.next()){
    out.println(rs.getMetaData().getColumnCount());

for (int k = 0; k &lt; rs.getMetaData().getColumnCount(); k++) {
ws.addCell(new Label(k,j+i+1,rs.getString(k+1)));
    } 

 i++;
}
wwb.write();
    wwb.close();
}catch(Exception e){e.printStackTrace();}
finally{

rs.close();
conn.close();
}

response.sendRedirect("aaa.xls");
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/213701#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jul 2008 21:57:22 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/213701</link>
        <guid>http://jiake0504.javaeye.com/blog/213701</guid>
      </item>
      <item>
        <title>hibernate的like用法</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/212346" style="color:red;">http://jiake0504.javaeye.com/blog/212346</a>&nbsp;
          发表时间: 2008年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原本我的写法：Query repeatClientQuery=querysession.createQuery("from ClientInfo as a "<br />                                          +"where a.client_name like :name" );<br />                repeatClientQuery.setParameter("name",clientname);<br />查询无结果.<br /><br />LIKE 'Mc%' 将搜索以字母 Mc 开头的所有字符串（如 McBadden）。<br />LIKE '%inger' 将搜索以字母 inger 结尾的所有字符串（如 Ringer、Stringer）。<br />LIKE '%en%' 将搜索在任何位置包含字母 en 的所有字符串（如 Bennet、Green、McBadden）。<br />LIKE '_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称（如 Cheryl、Sheryl）。<br />LIKE '[CK]ars[eo]n' 将搜索下列字符串：Carsen、Karsen、Carson 和 Karson（如 Carson）。<br />LIKE '[M-Z]inger' 将搜索以字符串 inger 结尾、以从M到Z的任何单个字母开头的所有名称如 。<br />LIKE 'M[^c]%' 将搜索以字母 M 开头，并且第二个字母不是 c 的所有名称（如 MacFeather）。<br /><br />直接写<br />String sql = "from ClientInfo as a where a.client_name like '%"+ clientname+"%'");<br />Query repeatClientQuery=querysession.createQuery(sql);<br />成功.<br /><br />但是却不能查询中文，假如clientname是客户1名字的话，那么将查不到结构，解决办法：<br /><br />1.用占位符：<br /><br />                  Query query = session<br />                        .createQuery("select count(*) from Privilege p where p.name like ?");<br />                query.setString(0, "%" + name + "%");// 注意这里不能写成setString(0," '%" + name + "%' ";否则查不出来结果，不能加‘单引号<br /><br />2.修改查询编译器：<br /><br />Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器，在Hibernate的配置文件中，hibernate.query.factory_class属性用来选择查询翻译器。<br />（1）选择Hibernate3.0的查询翻译器：<br />hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory<br />（2）选择Hibernate2.1的查询翻译器<br />hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory<br />为了使用3.0的批量更新和删除功能，只能选择（1）否则不能解释批量更新的语句，当使用的时候出现了不支持条件输入中文的情况。选择（2）可以支持输入中文，但没法解释批量更新语句了。
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/212346#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Jul 2008 15:00:25 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/212346</link>
        <guid>http://jiake0504.javaeye.com/blog/212346</guid>
      </item>
      <item>
        <title>JavaScript中去除字符串的左右空格</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/211816" style="color:red;">http://jiake0504.javaeye.com/blog/211816</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
&lt;script>  
  function   jsTrim(){  
  var   str=strText.value  
  str   =   str.replace(/^\s*/g,"")  
  str   =   str.replace(/\s*$/g,"")  
  strText.value=str  
  }  
  &lt;/script>  
  &lt;input   id=strText   value="           abd         ">&lt;input   type=button   value=去掉字符串前后空格   onclick=jsTrim()>

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/211816#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 10:00:59 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/211816</link>
        <guid>http://jiake0504.javaeye.com/blog/211816</guid>
      </item>
      <item>
        <title>Collections.sort() 对 List &lt;对象&gt;排序</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/207038" style="color:red;">http://jiake0504.javaeye.com/blog/207038</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          mport java.util.Comparator;<br />import java.util.List;<br />import java.util.ArrayList;<br />import java.util.Collections;<br /><br />class User {<br /> String name;<br /> String age;<br /> <br /> public User(String name,String age){<br />  this.name=name;<br />  this.age=age;<br /> }<br /> public String getAge() {<br />  return age;<br /> }<br /> public void setAge(String age) {<br />  this.age = age;<br /> }<br /> public String getName() {<br />  return name;<br /> }<br /> public void setName(String name) {<br />  this.name = name;<br /> } <br />}<br /><br />class ComparatorUser implements Comparator{<br /><br /> public int compare(Object arg0, Object arg1) {<br />  User user0=(User)arg0;<br />  User user1=(User)arg1;<br />  //首先比较年龄，如果年龄相同，则比较名字<br />  int flag=user0.getAge().compareTo(user1.getAge());<br />  if(flag==0){<br />   return user0.getName().compareTo(user1.getName());<br />  }else{<br />   return flag;<br />  }  <br /> }<br /> <br />}<br /><br />public class SortTest {<br /><br /> <br /> public static void main(String[] args){<br />  List userlist=new ArrayList();<br />  userlist.add(new User("dd","4"));<br />  userlist.add(new User("aa","1"));<br />  userlist.add(new User("ee","5"));<br />  userlist.add(new User("bb","2"));  <br />  userlist.add(new User("ff","5"));<br />  userlist.add(new User("cc","3"));<br />  userlist.add(new User("gg","6"));<br />  <br />  ComparatorUser comparator=new ComparatorUser();<br />  Collections.sort(userlist, comparator);<br />   <br />  for (int i=0;i&lt;userlist.size();i++){<br />   User user_temp=(User)userlist.get(i);<br />      System.out.println(user_temp.getName()+","+user_temp.getAge()); <br />  }<br />  <br /> }<br />}<br /><br /><br />结果:<br />aa,1<br />bb,2<br />cc,3<br />dd,4<br />ee,5<br />ff,5<br />gg,6
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/207038#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jun 2008 11:15:37 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/207038</link>
        <guid>http://jiake0504.javaeye.com/blog/207038</guid>
      </item>
      <item>
        <title>Java 集合排序问题</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/206760" style="color:red;">http://jiake0504.javaeye.com/blog/206760</a>&nbsp;
          发表时间: 2008年06月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Java Collection Framework中定义的List实现有Vector，ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而，它们并没有内置的元素排序支持。<br />　　你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递一个List对象，也可以传递一个List和一个Comparator。如果列表中的元素全都是相同类型的类，并且这个类实现了Comparable接口，你可以简单的调用 Collections.sort()。如果这个类没有实现Comparator，你也可以传递一个Comparator到方法sort()中，进行排序。如果你不想使用缺省的分类顺序进行排序，你同样可以传递一个Comparator到方法sort()中来进行排序。如果列表中的元素并不都是相同类型的类，你在进行排序的时候就不是这样幸运了。除非你编写一个专用的跨类的Comparator。<br /><br />　　排序的顺序怎么样呢？如果元素是 String对象，却省的排序顺序是按照字符编码进行的，基本上是每个字符的ASCII/Unicode值。如果严格的限制在处理英文，却省的排序顺序通常是足够的，因为它首先排A-Z，然后是小写字母a-z。然而如果你处理非英文字，或者你只是想使用不同的排序顺序，这样 Collections.sort()就出现了第二种变化。例如，你想使用字符串的反序进行排序。为了实现这个功能，你可以在Collections类中通过reverseOrder()来获取一个反序Comparator。然后，你将反序Comparator传递给sort()方法。换句话说，你作如下工作：<br /><br />List list = ...;<br />Comparator comp = Collections.reverseOrder();<br />Collections.sort(list, comp);<br /><br />　　如果列表包含项目：Man, man, Woman, 和woman，排序好的列表将是Man, Woman, man, woman。这里没有什么复杂的。需要注意的非常重要的一点是Collections.sort()是进行原位排序。如果你需要保留原序，需要先对原集合进行复制，在排序，就像这样：<br /><br />List list = ...;<br />List copyOfList = new ArrayList(list);<br />Collections.sort(copyOfList);<br /><br />　　这里，排好序的列表是：Man, Woman, man, woman，但是原始列表（Man, man, Woman, woman）被保留了。<br /><br />　　到目前为止，排序是区分大小写的。你如何进行不去分大小写的排序呢？一种实现方式是象这样实现Comparator:<br /><br />public static class CaseInsensitiveComparator<br />implements Comparator {<br />public int compare(Object element1,<br />Object element2) {<br />String lower1 =<br />element1.toString().toLowerCase();<br />String lower2 =<br />element2.toString().toLowerCase();<br />return lower1.compareTo(lower2);<br />}<br />}<br /><br />　　你确实不需要手工的创建这个类。而是，你可以是用以存在的Comparator，CASE_INSENSIVTIVE_ORDER，它是在String类中定义的。<br /><br />　　这种实现方式有一点小小的问题。Sort()算法提供稳定的排序，并保持与原有序列相同的元素。这意味着一个包含两个元素”woman”和”Woman”的列表将有不同的排序，而这种不同是根据两个元素在列表中出现的先后次序决定的。<br /><br />　　语言的不同又会怎么样呢？java.text包提供了Collector和CollectionKey类来进行区分语言的排序。这里是例子:<br /><br />　　注意，如果你的文本是本地语言，而不是缺省语言，你需要传递一个本地语种给getInstance()方法，就象:<br /><br />public static class CollatorComparator<br />implements Comparator {<br />Collator collator = Collator.getInstance();<br />public int compare(Object element1,<br />Object element2) {<br />CollationKey key1 = collator.getCollationKey(<br />element1.toString());<br />CollationKey key2 = collator.getCollationKey(<br />element2.toString());<br />return key1.compareTo(key2);<br />}<br />}<br /><br />　　你是在对集合关键字进行排序，而不是实际的字符串。这不仅提供固定的不区分大小写的排序，而且它是跨语种的排序。换句话说，如果你对西班牙文和非西班牙文的混合词进行排序，词ma?ana (tomorrow)将排在mantra的前面。如果你不使用Collector，ma?ana将排在mantra的后面。<br /><br />　　下面这个程序对一个列表进行不同类型的排序（缺省的、区分大小写的、区分语种的）：<br /><br />import java.awt.BorderLayout;<br />import java.awt.Container;<br />import java.io.*;<br />import java.text.*;<br />import java.util.*;<br />import javax.swing.*;<br /><br />public class SortIt {<br /><br />public static class CollatorComparator<br />implements Comparator {<br />Collator collator = Collator.getInstance();<br />public int compare(Object element1,<br />Object element2) {<br />CollationKey key1 = collator.getCollationKey(<br />element1.toString());<br />CollationKey key2 = collator.getCollationKey(<br />element2.toString());<br />return key1.compareTo(key2);<br />}<br />}<br /><br />public static class CaseInsensitiveComparator<br />implements Comparator {<br />public int compare(Object element1,<br />Object element2) {<br />String lower1 = element1.toString().<br />toLowerCase();<br />String lower2 = element2.toString().<br />toLowerCase();<br />return lower1.compareTo(lower2);<br />}<br />}<br /><br />public static void main(String args[]) {<br />String words[] =<br />{"man", "Man", "Woman", "woman",<br />"Manana", "manana", "ma?ana", "Ma?ana",<br />"Mantra", "mantra", "mantel", "Mantel"<br />};<br /><br />// Create frame to display sortings<br />JFrame frame = new JFrame("Sorting");<br />frame.setDefaultCloseOperation(<br />JFrame.EXIT_ON_CLOSE);<br />Container contentPane = frame.getContentPane();<br />JTextArea textArea = new JTextArea();<br />JScrollPane pane = new JScrollPane(textArea);<br />contentPane.add(pane, BorderLayout.CENTER);<br /><br />// Create buffer for output<br />StringWriter buffer = new StringWriter();<br />PrintWriter out = new PrintWriter(buffer);<br /><br />// Create initial list to sort<br />List list = new ArrayList(Arrays.asList(words));<br />out.println("Original list:");<br />out.println(list);<br />out.println();<br /><br />// Perform default sort<br />Collections.sort(list);<br />out.println("Default sorting:");<br />out.println(list);<br />out.println();<br /><br />// Reset list<br />list = new ArrayList(Arrays.asList(words));<br /><br />// Perform case insensitive sort<br />Comparator comp = new CaseInsensitiveComparator();<br />Collections.sort(list, comp);<br />out.println("Case insensitive sorting:");<br />out.println(list);<br />out.println();<br /><br />// Reset list<br />list = new ArrayList(Arrays.asList(words));<br /><br />// Perform collation sort<br />comp = new CollatorComparator();<br />Collections.sort(list, comp);<br />out.println("Collator sorting:");<br />out.println(list);<br />out.println();<br /><br />// Fill text area and display<br />textArea.setText(buffer.toString());<br />frame.pack();<br />frame.show();<br />}<br />}<br /><br />　　如果你的主要问题是顺序访问，可能列表不是你的好的数据结构选择。只要你的集合没有重复，你可以在树（TreeSet）中保存你的元素（提供或不提供Comparator）。这样，元素将总是排序形式的。
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/206760#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Jun 2008 22:47:43 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/206760</link>
        <guid>http://jiake0504.javaeye.com/blog/206760</guid>
      </item>
      <item>
        <title>javaScript页面刷新</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/198061" style="color:red;">http://jiake0504.javaeye.com/blog/198061</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          //--让打开本窗口的父页面重新刷新(在同一个窗口)--><br /> location.replace(document.referrer);<br />//--让打开本窗口的父窗口重新刷新(两个窗口)--><br /> window.opener.location.reload();<br />//<br /> location.reload(true);<br />//当前窗口刷新。<br /> window.parent.location.reload();<br /><br />强制载入后刷新一次<br />加入以下代码:<br /><br />&lt;script><br />if(window.name != "bencalie"){<br />    location.reload();<br />    window.name = "bencalie";<br />}<br />else{<br />    window.name = "";<br />}<br />&lt;/script><br /><br /><br />也可禁止缓存，重新进入页面<br /><br />&lt;meta http-equiv="Expires" CONTENT="0"><br />&lt;meta http-equiv="Cache-Control" CONTENT="no-cache"><br />&lt;meta http-equiv="Pragma" CONTENT="no-cache">
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/198061#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 01:00:33 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/198061</link>
        <guid>http://jiake0504.javaeye.com/blog/198061</guid>
      </item>
      <item>
        <title>javascript--url传递中文乱码.</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/198056" style="color:red;">http://jiake0504.javaeye.com/blog/198056</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          javascript 中对于参数编码:<br /><br /><pre name="code" class="java">
url=encodeURI(url);
</pre><br /><br />服务器端获取参数后解码:<br /><br /><pre name="code" class="java">
String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8"); 
</pre><br /><br />或:<br /><pre name="code" class="java">
url=encodeURI(encodeURI(url)); //用了2次encodeURI 
</pre><br /><br />服务器端获取:<br /><br /><pre name="code" class="java">
String linename = request.getParameter(name);
//java  : 字符解码
linename = java.net.URLDecoder.decode(linename , "UTF-8");
</pre><br />OK,输出正常.
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/198056#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 May 2008 00:27:57 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/198056</link>
        <guid>http://jiake0504.javaeye.com/blog/198056</guid>
      </item>
      <item>
        <title>javascript的URL编码和解码</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/198048" style="color:red;">http://jiake0504.javaeye.com/blog/198048</a>&nbsp;
          发表时间: 2008年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在使用url进行参数传递时，经常会传递一些中文名的参数或URL地址，在后台处理时会发生转换错误。在有些传递页面使用GB2312，而在接收页面使用UTF8，这样接收到的参数就可能会与原来发生不一致。使用服务器端的urlEncode 函数编码的URL，与使用客户端javascript的encodeURI函数编码的URL，结果就不一样。<br />javaScript中的编码方法：<br />escape() 方法：<br />采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码（xx等于该字符在字符集表里面的编码的16进制数字）。比如，空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符：  @ * / +<br /><br />英文解释：MSDN JScript Reference: The escape method returns a string value  (in Unicode format) that contains the contents of [the argument]. All spaces, punctuation, accented characters, and any other non-ASCII characters are replaced with %xx encoding, where xx is equivalent to the hexadecimal number representing the character. For example, a space is returned as "%20."<br />Edge Core Javascript Guide: The escape and unescape functions let you encode and decode strings. The escape function returns the hexadecimal encoding of an argument in the ISO Latin character set. The unescape function returns the ASCII string for the specified hexadecimal encoding value.<br /><br /><br />encodeURI() 方法：把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符：! @ # $& * ( ) = : / ; ? + '<br /><br />英文解释：MSDN JScript Reference:  The encodeURI method returns an encoded URI. If you pass the result to decodeURI, the original string is returned. The encodeURI method does not encode the following characters: ":", "/", ";", and "?". Use encodeURIComponent to encode these characters. Edge Core Javascript Guide: Encodes a Uniform Resource Identifier (URI) by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF-8 encoding of the character<br /><br /><br />encodeURIComponent() 方法：把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比，这个方法将对更多的字符进行编码，比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话，不能用这个方法来进行编码，否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符：! * ( ) <br /><br />英文解释：MSDN JScript Reference:  The encodeURIComponent method returns an encoded URI. If you pass the result to decodeURIComponent,  the original string is returned. Because the encodeURIComponent method encodes all characters,  be careful if the string represents a path such as /folder1/folder2/default.html. The slash characters will be encoded and will not be valid if sent as a request to a web server. Use the encodeURI method if the string contains more than a single URI component. Mozilla Developer Core Javascript Guide：  Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF-8 encoding of the character.<br /><br /><br /> <br />因此，对于中文字符串来说，如果不希望把字符串编码格式转化成UTF-8格式的（比如原页面和目标页面的charset是一致的时候），只需要使用escape。如果你的页面是GB2312或者其他的编码，而接受参数的页面是UTF-8编码的，就要采用 encodeURI或者encodeURIComponent。<br /><br />      另外，encodeURI/encodeURIComponent是在javascript1.5之后引进的，escape则在javascript1.0版本就有。<br /><br />英文注释：The escape() method does not encode the +  character which is interpreted as a space on the server side as well as generated by forms with spaces in their fields. Due to this shortcoming, you should avoid use of escape() whenever possible. The best alternative is usually encodeURIComponent().Use of the encodeURI() method is a bit more specialized than escape() in that it encodes for URIs [REF] as opposed to the querystring, which is part of a URL. Use this method when you need to encode a string to be used for any resource that uses URIs and needs certain characters to remain un-encoded. Note that this method does not encode the ' character, as it is a valid character within URIs.Lastly, the encodeURIComponent() method should be used in most cases when encoding a single component of a URI. This method will encode certain chars that would normally be recognized as special chars for URIs so that many components may be included. Note that this method does not encode the ' character, as it is a valid character within URIs.<br /> <br />1.编码处理函数<br />1） encodeURI 返回一个对URI字符串编码后的结果。URL是最常见的一种URI；<br /> 2） decodeURI 将一个已编码的URI字符串解码成最原始的字符串返回；<br /> 3） 举例： &lt; Script language = " javascript " > 输出结果如下： encodeStr: http://www.amigoxie.com/index.jsp?name=%E9%98%BF%E8%9C%9C%E6%9E%9C decodeStr: http://www.amigoxie.com/index.jsp?name=xind<br /> <br />2. 数值处理函数<br />1） parseInt 将一个字符串指定的进制转换为一个整数，语法格式为： parseInt(numString, [radix]) 第一个参数是要进行转换的字符串，是介于2到36之间的数值，用于指定进行字符串转换时所用的进制。 举例如下： 输出结果如下：默认情况下的结果：32:32;032:26;0x32:50 转为2进制的结果：32:NaN;032:0;0x32:0 转为8进制的结果：32:26;032:26;0x32:0 转为16进制的结果：32:50;032:50;0x32:50 11001010转换后的结果： 2进制:202;16进制:285216784 8进制:2359816;10进制:11001010 43abc转换后:43;abc43转换后:NaN;abc转换后:NaN<br /> 2） parseFloat方法 该方法将一个字符串转换成对应的小数。 eg. 输出结果如下： 4.11 5.1 3） isNaN方法 该方法用于检测前两个方法返回值是否为非数值型，如果是，返回true，否则，反回false<br /><br />最多使用的应为encodeURIComponent，它是将中文、韩文等特殊字符转换成utf-8格式的url编码，所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持（form中的编码方式和当前页面编码方式相同）<br /><br /><br />escape不编码字符有69个：*，+，-，.，/，@，_，0-9，a-z，A-Z<br /><br />encodeURI不编码字符有82个：!，#，$，&，'，(，)，*，+，,，-，.，/，:，;，=，?，@，_，~，0-9，a-z，A-Z<br /><br />encodeURIComponent不编码字符有71个：!， '，(，)，*，-，.，_，~，0-9，a-z，A-Z
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/198048#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 May 2008 23:43:27 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/198048</link>
        <guid>http://jiake0504.javaeye.com/blog/198048</guid>
      </item>
      <item>
        <title>利用c3p0配置数据库连接</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/196964" style="color:red;">http://jiake0504.javaeye.com/blog/196964</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一.连接mysql数据库<br /><br /><pre name="code" class="java">
&lt;bean id="dataSource"
        class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close" abstract="false" singleton="true"
        lazy-init="default" autowire="default" dependency-check="default">
        &lt;property name="driverClass">
            &lt;value>com.mysql.jdbc.Driver&lt;/value>
        &lt;/property>
        &lt;property name="jdbcUrl">
            &lt;value>jdbc:mysql://192.168.0.1/databasename?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true&lt;/value>
        &lt;/property>
        &lt;property name="user">
            &lt;value>username&lt;/value>
        &lt;/property>
        &lt;property name="password">
            &lt;value>password&lt;/value>
        &lt;/property>
        &lt;property name="minPoolSize">
            &lt;value>10&lt;/value>
        &lt;/property>
        &lt;property name="maxPoolSize">
            &lt;value>20&lt;/value>
        &lt;/property>
        &lt;property name="initialPoolSize">
            &lt;value>10&lt;/value>
        &lt;/property>
    &lt;/bean>
    &lt;bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        &lt;property name="dataSource">
            &lt;ref bean="dataSource">&lt;/ref>
        &lt;/property>
        &lt;property name="hibernateProperties">
            &lt;props>
                &lt;prop key="hibernate.dialect">
                    org.hibernate.dialect.MySQLDialect
                &lt;/prop>
                &lt;prop key="hibernate.show_sql">
                    false
                &lt;/prop>
                &lt;prop key="hibernate.generate_statistics">true&lt;/prop>
                &lt;prop key="hibernate.cache.use_query_cache">
                    true
                &lt;/prop>
                &lt;prop key="hibernate.cache.use_second_level_cache">
                    true
                &lt;/prop>
                &lt;prop key="hibernate.cache.provider_class">
                    net.sf.ehcache.hibernate.EhCacheProvider
                &lt;/prop>
                &lt;prop key="hibernate.connection.provider_class">
                    org.hibernate.connection.C3P0ConnectionProvider
                &lt;/prop>
                &lt;prop key="hibernate.query.substitutions">
                    true 1, false 0, yes 'Y', no 'N'
                &lt;/prop>
                &lt;prop
                    key="hibernate.bytecode.use_reflection_optimizer">
                    true
                &lt;/prop>
                &lt;prop key="hibernate.use_outer_join">true&lt;/prop>
                &lt;prop key="hibernate.prepare_sql">true&lt;/prop>
                &lt;prop key="hibernate.query.factory_class">
                    org.hibernate.hql.ast.ASTQueryTranslatorFactory
                &lt;/prop>
            &lt;/props>
        &lt;/property>

        &lt;property name="mappingResources">
            &lt;list>
                &lt;value>xxx/xx/xx.hbm.xml&lt;/value>
                &lt;value>xxx/xx/xx.hbm.xml&lt;/value>
            &lt;/list>
        &lt;/property>
    &lt;/bean>
</pre><br /><br />二.连接Oracle数据库<br /><br /><pre name="code" class="java">
&lt;bean id="dataSource"
        class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close" abstract="false" singleton="true"
        lazy-init="default" autowire="default" dependency-check="default">
        &lt;property name="driverClass">
            &lt;value>oracle.jdbc.driver.OracleDriver&lt;/value>
        &lt;/property>
        &lt;property name="jdbcUrl">
            &lt;value>jdbc:oracle:thin:@192.168.0.1:1521:orcl&lt;/value>
        &lt;/property>
        &lt;property name="user">
            &lt;value>username&lt;/value>
        &lt;/property>
        &lt;property name="password">
            &lt;value>password&lt;/value>
        &lt;/property>
        &lt;property name="minPoolSize">
            &lt;value>10&lt;/value>
        &lt;/property>
        &lt;property name="maxPoolSize">
            &lt;value>20&lt;/value>
        &lt;/property>
        &lt;property name="initialPoolSize">
            &lt;value>10&lt;/value>
        &lt;/property>
    &lt;/bean>

    &lt;bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        &lt;property name="dataSource">
            &lt;ref bean="dataSource">&lt;/ref>
        &lt;/property>
        &lt;property name="hibernateProperties">
            &lt;props>
                &lt;prop key="hibernate.dialect">
                    org.hibernate.dialect.OracleDialect
                &lt;/prop>
                &lt;prop key="hibernate.show_sql">
                    false
                &lt;/prop>
                &lt;prop key="hibernate.generate_statistics">true&lt;/prop>
                &lt;prop key="hibernate.cache.use_query_cache">
                    true
                &lt;/prop>
                &lt;prop key="hibernate.cache.use_second_level_cache">
                    true
                &lt;/prop>
                &lt;prop key="hibernate.cache.provider_class">
                    net.sf.ehcache.hibernate.EhCacheProvider
                &lt;/prop>
                &lt;prop key="hibernate.connection.provider_class">
                    org.hibernate.connection.C3P0ConnectionProvider
                &lt;/prop>
                &lt;prop key="hibernate.query.substitutions">
                    true 1, false 0, yes 'Y', no 'N'
                &lt;/prop>
                &lt;prop
                    key="hibernate.bytecode.use_reflection_optimizer">
                    true
                &lt;/prop>
                &lt;prop key="hibernate.use_outer_join">true&lt;/prop>
                &lt;prop key="hibernate.prepare_sql">true&lt;/prop>
                &lt;prop key="hibernate.query.factory_class">
                    org.hibernate.hql.ast.ASTQueryTranslatorFactory
                &lt;/prop>
            &lt;/props>
        &lt;/property>

        &lt;property name="mappingResources">
            &lt;list>
                &lt;value>xxx/xx/xx.hbm.xml&lt;/value>
                &lt;value>xxx/xx/xx.hbm.xml&lt;/value>
            &lt;/list>
        &lt;/property>
    &lt;/bean>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/196964#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 11:37:40 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/196964</link>
        <guid>http://jiake0504.javaeye.com/blog/196964</guid>
      </item>
      <item>
        <title>关于XPath的用法</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/193701" style="color:red;">http://jiake0504.javaeye.com/blog/193701</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          节点匹配路径Xpath <br /><br />    在利用XSL进行转换的过程中，匹配的概念非常重要。在模板声明语句xsl:template match = ""和模板应用语句 xsl:apply-templates select = ""中，用引号括起来的部分必须能够精确地定位节点。具体的定位方法则在XPath中给出。  <br /><br />   另外，也可以使用Xpath对XML文档进行搜索、定位。 <br /><br />之所以要引入XPath的概念，目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素。可以把XPath比作文件管理路径：通过文件管理路径，可以按照一定的规则查找到所需要的文件；同样，依据XPath所制定的规则，也可以很方便地找到XML结构文档树中的任何一个节点。 <br /><br />在介绍XPath的匹配规则之前，我们先来看一些有关XPath的基本概念。首先要说的是XPath数据类型。XPath可分为四种数据类型：  <br /><br />节点集（node-set） <br />节点集是通过路径匹配返回的符合条件的一组节点的集合。其它类型的数据不能转换为节点集。  <br /><br />布尔值(boolean) <br />由函数或布尔表达式返回的条件匹配值，与一般语言中的布尔值相同，有true和false两个值。布尔值可以和数值类型、字符串类型相互转换。  <br /><br />字符串(string) <br />字符串即包含一系列字符的集合，XPath中提供了一系列的字符串函数。字符串可与数值类型、布尔值类型的数据相互转换。  <br /><br />数值(number) <br />在XPath中数值为浮点数，可以是双精度64位浮点数。另外包括一些数值的特殊描述，如非数值NaN（Not-a-Number）、正无穷大 infinity、负无穷大-infinity、正负0等等。number的整数值可以通过函数取得，另外，数值也可以和布尔类型、字符串类型相互转换。  <br /><br />其中后三种数据类型与其它编程语言中相应的数据类型差不多，只是第一种数据类型是XML文档树的特有产物。另外，由于XPath包含的是对文档结构树的一系列操作，因此搞清楚XPath节点类型也是很必要的。由于XML文档的逻辑结构，一个XML文件可以包含元素、CDATA、注释、处理指令等逻辑要素，其中元素还可以包含属性，并可以利用属性来定义命名空间。相应地，在XPath中，将节点划分为七种节点类型：  <br /><br />根节点（Root Node） <br />根节点是一棵树的最上层，根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。  <br /><br />元素节点（Element Nodes） <br />元素节点对应于文档中的每一个元素，一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。 <br />元素节点都可以有扩展名，它是由两部分组成的：一部分是命名空间URI，另一部分是本地的命名。  <br /><br />文本节点（Text Nodes） <br />文本节点包含了一组字符数据，即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点，而且文本节点没有扩展名。  <br /><br />属性节点（Attribute Nodes） <br />每一个元素节点有一个相关联的属性节点集合，元素是每个属性节点的父节点，但属性节点却不是其父元素的子节点。这就是说，通过查找元素的子节点可以匹配出元素的属性节点，但反过来不成立，只是单向的。再有，元素的属性节点没有共享性，也就是说不同的元素节点不共有同一个属性节点。 <br />对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的，但声明为#IMPLIED，而该属性没有在元素中定义，则该元素的属性节点集中不包含该属性。 <br />此外，与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。  <br /><br />命名空间节点（Namespace Nodes） <br />每一个元素节点都有一个相关的命名空间节点集。在XML文档中，命名空间是通过保留属性声明的，因此，在XPath中，该类节点与属性节点极为相似，它们与父元素之间的关系是单向的，并且不具有共享性。  <br /><br />处理指令节点（Processing Instruction Nodes） <br />处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名，扩展名的本地命名指向处理对象，而命名空间部分为空。  <br /><br />注释节点（Comment Nodes） <br />注释节点对应于文档中的注释。下面，我们来构造一棵XML文档树： <br /><br />&lt;A id="a1"> <br />  &lt;B id="b1"> <br />    &lt;C id="c1"> <br />      &lt;B name="b"/> <br />      &lt;D id="d1"/> <br />      &lt;E id="e1"/> <br />      &lt;E id="e2"/> <br />    &lt;/C> <br />  &lt;/B> <br />  &lt;B id="b2"/> <br />  &lt;C id="c2"> <br />    &lt;B/> <br />    &lt;D id="d2"/> <br />    &lt;F/> <br />  &lt;/C> <br />  &lt;E/> <br />&lt;/A> <br />  <br /><br />现在，来实现一些利用Xpath使XML中节点匹配的基本方法。 <br /><br />路径匹配 <br />路径匹配与文件路径的表示相仿，比较好理解。有以下几个符号： <br /><br />符  号 <br /> 含  义 <br /> 举  例 <br /> 匹配结果 <br />  <br />/ <br /> 指示节点路径 <br /> /A/C/D <br /> 节点"A"的子节点"C"的子节点"D"，即id值为d2的D节点 <br />  <br />/ <br /> 根节点 <br />  <br />// <br /> 所有路径以"//"后指定的子路径结尾的元素 <br /> //E <br /> 所有E元素，结果是所有三个E元素 <br />  <br />//C/E <br /> 所有父节点为C的E元素，结果是id值为e1和e2的两个E元素 <br />  <br />* <br /> 路径的通配符 <br /> /A/B/C/* <br /> A元素→B元素→C元素下的所有子元素，即name值为b的B元素、id值为d1的D元素和id值为e1和e2的两个E元素 <br />  <br />/*/*/D <br /> 上面有两级节点的D元素，匹配结果是id值为d2的D元素 <br />  <br />//* <br /> 所有的元素 <br />  <br />| <br /> 逻辑或 <br /> //B | //C <br /> 所有B元素和C元素 <br />位置匹配 <br />对于每一个元素，它的各个子元素是有序的。如： <br /><br />举  例 <br /> 含  义 <br /> 匹配结果 <br />  <br />/A/B/C[1] <br /> A元素→B元素→C元素的第一个子元素 <br /> name值为b的B元素 <br />  <br />/A/B/C[last()] <br /> A元素→B元素→C元素的最后一个子元素 <br /> id值为e2的E元素 <br />  <br />/A/B/C[position()>1] <br /> A元素→B元素→C元素之下的位置号大于1的元素 <br /> id值为d1的D元素和两个具有id值的E元素 <br />  <br /><br />属性及属性值 <br />在XPath中可以利用属性及属性值来匹配元素，要注意的是，元素的属性名前要有"@"前缀。例如： <br /><br />举  例 <br /> 含  义 <br /> 匹配结果 <br />  <br />//B[@id] <br /> 所有具有属性id的B元素 <br /> id值为b1和b2的两个B元素 <br />  <br />//B[@*] <br /> 所有具有属性的B元素 <br /> 两个具有id属性的B元素和一个具有name属性B元素 <br />  <br />//B[not(@*)] <br /> 所有不具有属性的B元素 <br /> A元素→C元素下的B元素 <br />  <br />//B[@id="b1"] <br /> id值为b1的B元素 <br /> A元素下的B元素 <br />  <br /><br />亲属关系匹配 <br />XML文档可归结为树型结构，因此任何一个节点都不是孤立的。通常我们把节点之间的归属关系归结为一种亲属关系，如父亲、孩子、祖先、后代、兄弟等等。在对元素进行匹配时，同样可以用到这些概念。例如： <br /><br />举  例 <br /> 含  义 <br /> 匹配结果 <br />  <br />//E/parent::* <br /> 所有E节点的父节点元素 <br /> id值为a1的A元素和id值为c1的C元素 <br />  <br />//F/ancestor::* <br /> 所有F元素的祖先节点元素 <br /> id值为a1的A元素和id值为c2的C元素 <br />  <br />/A/child::* <br /> A的子元素 <br /> id值为b1、b2的B元素，id值为c2的C元素，以及没有任何属性的E元素 <br />  <br />/A/descendant::* <br /> A的所有后代元素 <br /> 除A元素以外的所有其它元素 <br />  <br />//F/self::* <br /> 所有F的自身元素 <br /> F元素本身 <br />  <br />//F/ancestor-or-self::* <br /> 所有F元素及它的祖先节点元素 <br /> F元素、F元素的父节点C元素和A元素 <br />  <br />/A/C/descendant-or-self::* <br /> 所有A元素→C元素及它们的后代元素 <br /> id值为c2的C元素、该元素的子元素B、D、F元素 <br />  <br />/A/C/following-sibling::* <br /> A元素→C元素的紧邻的后序所有兄弟节点元素 <br /> 没有任何属性的E元素 <br />  <br />/A/C/preceding-sibling::* <br /> A元素→C元素的紧邻的前面所有兄弟节点元素 <br /> id值为b1和b2的两个B元素 <br />  <br />/A/B/C/following::* <br /> A元素→B元素→C元素的后序的所有元素 <br /> id为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、无属性的E元素。 <br />  <br />/A/C/preceding::* <br /> A元素→C元素的前面的所有元素 <br /> id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为b的B元素、id为c1的C元素、id为b1的B元素 <br />  <br /><br />条件匹配 <br />条件匹配就是利用一些函数的运算结果的布尔值来匹配符合条件的节点。常用于条件匹配的函数有四大类：节点函数、字符串函数、数值函数、布尔函数。例如前面提到的last()、position()等等。这些功能函数可以帮助我们精确寻找需要的节点。  <br />    <br /><br />函数及功能 <br /> 作用 <br />  <br />count()功能 <br /> 统计计数，返回符合条件的节点的个数 <br />  <br />number()功能 <br /> 将属性的值中的文本转换为数值 <br />  <br />substring() 功能 <br /><br />语法：substring(value, start, length) <br /><br /><br /> 截取字符串 <br />  <br />sum()功能 <br />   <br /> 求和 <br /><br />  <br />  <br /><br /><br />这些功能只是XPath语法中的一部分，还有大量的功能函数没有介绍，而且目前XPath的语法仍然在不断发展中。通过这些函数我们可以实现更加复杂的查询和操作。 <br /><br />以上这些匹配方法中，用得最多的还要数路径匹配。依靠给出相对于当前路径的子路径来定位节点的。
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/193701#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 15:49:35 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/193701</link>
        <guid>http://jiake0504.javaeye.com/blog/193701</guid>
      </item>
      <item>
        <title>javascript 四舍五入</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/193592" style="color:red;">http://jiake0504.javaeye.com/blog/193592</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">　
   Math.floor()   //取小 4.8->4   4.2->4  
   Math.ceil()    //取大 4.8->5  4.2->5  
   Math.round()   //四舍五入 4.8->5   4.2->4    
   parseInt(char)  //转char为 int number</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/193592#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 12:10:54 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/193592</link>
        <guid>http://jiake0504.javaeye.com/blog/193592</guid>
      </item>
      <item>
        <title>在Spring中配置log4j</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/193202" style="color:red;">http://jiake0504.javaeye.com/blog/193202</a>&nbsp;
          发表时间: 2008年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先需要在web.xml进行声明：<br /><br />&lt;!--如果不定义webAppRootKey参数，那么webAppRootKey就是缺省的"webapp.root"--><br /> &lt;context-param><br />  &lt;param-name>webAppRootKey&lt;/param-name><br />  &lt;param-value>ssh.root&lt;/param-value><br /> &lt;/context-param><br /><br />这里的ssh是http://localhost:8080/ssh/<br /><br />而root是系统开发目录中ssh/root<br /><br />这样配置文件以及日志文件可以在spring的帮助下，放到开发环境中的任意位置<br /><br />&lt;!--由Sprng载入的Log4j配置文件位置--><br /> &lt;context-param><br />  &lt;param-name>log4jConfigLocation&lt;/param-name><br />  &lt;param-value>/WEB-INF/log4j.properties&lt;/param-value><br /> &lt;/context-param><br /><br />在这里定位配置文件，需要的是从root开始的绝对路径<br /><br />&lt;!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond--><br /> &lt;context-param><br />  &lt;param-name>log4jRefreshInterval&lt;/param-name><br />  &lt;param-value>60000&lt;/param-value><br /> &lt;/context-param><br /><br />&lt;!--Spring log4j Config loader--><br /> &lt;listener><br />  &lt;listener-class>org.springframework.web.util.Log4jConfigListener&lt;/listener-class><br /> &lt;/listener><br /><br />设置监听器<br /><br /><br /><br />/////////////////<br />之后我们就可以配置log4j配置文件了<br /><br />#先设置级别<br />log4j.rootCategory=INFO, file<br />log4j.appender.file=org.apache.log4j.RollingFileAppender<br />#在这里设置日志需要存放的位置，这里的变量就是我们在web.xml里设置的<br />log4j.appender.file.File=${ssh.root}/WEB-INF/logs/subject.log<br />log4j.appender.file.MaxFileSize=100KB<br />log4j.appender.file.MaxBackupIndex=0<br />log4j.appender.file.layout=org.apache.log4j.SimpleLayout<br />log4j.appender.file.layout.ConversionPattern=[ssh] %p %t %c - %m%n<br /><br />有了上面的配置，我们就可以查看日志了！
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/193202#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 May 2008 10:50:44 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/193202</link>
        <guid>http://jiake0504.javaeye.com/blog/193202</guid>
      </item>
      <item>
        <title>使用hibernate分页时连接池耗尽</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/192401" style="color:red;">http://jiake0504.javaeye.com/blog/192401</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Hibernate可以实现分页查询，昨天试了一下，分页效果不错。但是发现了一个问题，就是当请求超过20次的时候页面就会卡死。经检查，是卡在分页查询这一块。<br /><br />应用程序采用struts2 + spring2 + hibernate3架构<br />连接池配置使用的是c3p0，　最大池大小为20, 很显然是连接池耗尽导致的。　增加连接池大小只是饮鸩止渴，总还有耗尽的时候，必须找到根本原因。<br /><br /><br />Dao类的分页查询方法如下：<br />java 代码<br /> <br /><br />   1. public List getTopics(int perPageStartNum, int perPageShowNum, long f_id) {  <br />   2.     Query query = getSession().createQuery("from Topic where forumId=" + f_id);  <br />   3.     query.setFirstResult(perPageStartNum);  <br />   4.     query.setMaxResults(perPageShowNum);  <br />   5.     return query.list();  <br />   6. }  <br /><br /><br />我尝试在获得list之后，使用getSession().close()关闭，没有效果。<br /><br />早上来上班继续调试，问题依旧。仔细想想可能还是对于spring中集成的操作hibernate　session 的方法不熟悉。<br />查阅Spring API:<br />geSession()是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法，<br />它可以从当前事务或者一个新的事务获得一个hibernate　session.<br />通常使用releaseSession(org.hibernate.Session)方法与getSession()配合。<br />如果没有绑定线程，releaseSession关闭由这个DAO的SessionFactory创建的Hibernate Session。　<br /><br />修改后的代码为：<br />java 代码<br /> <br /><br />   1. public List getTopics(int perPageStartNum, int perPageShowNum, long f_id) {  <br />   2.     Session session = getSession();  <br />   3.   <br />   4.     List list = session.createQuery("from Topic where forumId=" + f_id)  <br />   5.            .setFirstResult(perPageStartNum)  <br />   6.            .setMaxResults(perPageShowNum)  <br />   7.            .list();  <br />   8.   <br />   9.     releaseSession(session);  <br />  10.   <br />  11.     return list;  <br />  12. }  <br /><br /><br /><br />启动服务器测试，问题解决。
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/192401#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 May 2008 22:31:33 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/192401</link>
        <guid>http://jiake0504.javaeye.com/blog/192401</guid>
      </item>
      <item>
        <title>兄弟们 脚本如何获取struts2  的 &lt;s:slect &gt; 标签选中的值,并动态设定id ？？</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/191635" style="color:red;">http://jiake0504.javaeye.com/blog/191635</a>&nbsp;
          发表时间: 2008年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在struts2.0 中有这样的用法：<br /><br /><pre name="code" class="java">
&lt;s:iterator value="XXX">
   &lt;s:select id="test" list="#{'21':'21','22':'22','23':'23'}" listKey="key" 
   listValue="value" headerKey="0" headerValue="请选择" />
&lt;/s:iterator>
</pre><br /><br /><br />大家有啥好的办法或者见议 可以把id="test" 改成动态的:<br /><br />比如随着迭代 id 会改成test1,test2.....<br /><br />能够标识出每迭代一次生成的 &lt;s:select>.<br /><br /><br />O,想到办法了,代码如下:<br /><br /><pre name="code" class="java">
&lt;s:iterator value="XXX"  status="st">
   &lt;s:select id="%{#st.count}" list="#{'21':'21','22':'22','23':'23'}" listKey="key" 
   listValue="value" headerKey="0" headerValue="请选择" />
&lt;/s:iterator>
</pre><br /><br />经测拭没有问题,id 会随着迭代 count 数来自动改变;<br />javascript 中 用document.getElementById("传入id值").value 可以获取值.
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/191635#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 May 2008 01:48:08 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/191635</link>
        <guid>http://jiake0504.javaeye.com/blog/191635</guid>
      </item>
      <item>
        <title>Java JDK 设置环境变量</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/190988" style="color:red;">http://jiake0504.javaeye.com/blog/190988</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Windows下JAVA环境变量的设置祥解<br /><br />Windows下JAVA用到的环境变量主要有3个，JAVA_HOME、CLASSPATH、PATH。下面逐个分析。<br /><br />JAVA_HOME指向的是JDK的安装路径，如x:\JDK_1.4.2，在这路径下你应该能够找到bin、lib等目录。值得一提的是，JDK 的安装路径可以选择任意磁盘目录，不过建议你放的目录层次浅一点，如果你放的目录很深，比如x:\XXXXXX\xxxxx\XXXX\xxxx\ XXXX\xxxx\XXXX\xxx……<br />那么，下面的步骤和以后的应用你都要受累了，呵呵。设置方法：<br />JAVA_HOME=x:\JDK_1.4.2<br /><br />PATH环境变量原来Windows里面就有，你只需修改一下，使他指向JDK的bin目录，这样你在控制台下面编译、执行程序时就不需要再键入一大串路径了。设置方法是保留原来的PATH的内容，并在其中加上%JAVA_HOME%\bin (注，如果你对DOS批处理不了解，你可能不明白%%引起来的内容是什么意思；其实这里是引用上一步设定好的环境变量JAVA_HOME，你写成x:\ JDK_1.4.2也是可以的；你可以打开一个控制台窗口，输入echo %JAVA_HOME%来看一下你的设置结果) ：<br />PATH=%JAVA_HOME%\bin;%PATH%<br />同样，%PATH%是引用以前你设置的PATH环境变量，你照抄以前的值就行了。<br /><br />CLASSPATH环境变量我放在最后面，是因为以后你出现的莫名其妙的怪问题80%以上都可能是由于CLASSPATH设置不对引起的，所以要加倍小心才行。<br />CLASSPATH=.\;%JAVA_HOME%\lib\tools.jar<br />首先要注意的是最前面的".\;"，如果你看不清，我给你念念——句点反斜杠分号。这个是告诉JDK，搜索CLASS时先查找当前目录的CLASS文件—— 为什么这样搞，这是由于LINUX的安全机制引起的，LINUX用户很明白，WINDOWS用户就很难理解(因为WINDOWS默认的搜索顺序是先搜索当前目录的，再搜索系统目录的，再搜索PATH环境变量设定的) ，所以如果喜欢盘根究底的朋友不妨研究一下LINUX。<br />为什么CLASSPATH后面指定了tools.jar这个具体文件？不指定行不行？显然不行，行的话我还能这么罗索嘛！:) 这个是由java语言的import机制和jar机制决定的，你可以查资料解决。<br /><br /><br />呵呵，具体的设定方法: win2k\xp用户右键点击我的电脑->属性->高级->环境变量，修改下面系统变量那个框里的值就行了。<br />win9x用户修改autoexec.bat文件，在其末尾加入:<br />set JAVA_HOME=x:\JDK_1.4.2<br />set PATH=%JAVA_HOME%\bin;%PATH%<br />set CLASSPATH=.\;%JAVA_HOME%\lib\tools.jar<br />就可以了。
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/190988#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 11:39:09 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/190988</link>
        <guid>http://jiake0504.javaeye.com/blog/190988</guid>
      </item>
      <item>
        <title>WebBrowser打印机有关代码 __摘</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/184365" style="color:red;">http://jiake0504.javaeye.com/blog/184365</a>&nbsp;
          发表时间: 2008年04月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0>&lt;/OBJECT><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(1,1) type=button value=打开><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(2,1) type=button value=关闭所有><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(4,1) type=button value=另存为><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(6,1) type=button value=打印><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(6,6) type=button value=直接打印><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(7,1) type=button value=打印预览><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(8,1) type=button value=页面设置><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(10,1) type=button value=属性><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(17,1) type=button value=全选><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(22,1) type=button value=刷新><br />&lt;input name=Button onClick=document.all.WebBrowser.ExecWB(45,1) type=button value=关闭>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/184365#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Apr 2008 11:22:09 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/184365</link>
        <guid>http://jiake0504.javaeye.com/blog/184365</guid>
      </item>
      <item>
        <title>15位和18位身份证的正则表达式及其验证</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/183419" style="color:red;">http://jiake0504.javaeye.com/blog/183419</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1、简单的正则表达式：<br /><br />（1）preg_match("/^(\d{18,18}|\d{15,15}|\d{17,17}x)$/",$id_card)<br />（2）preg_match("/^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X)?$/",$id_card)<br />（3）preg_match("/(^\d{15}$/)|(\d{17}(?:\d|x|X)$/),$id_card)<br /><br />2、复杂并且严格一些的验证：<br /><br />//这个可以验证15位和18位的身份证，并且包含生日和校验位的验证。   <br />//如果有兴趣，还可以加上身份证所在地的验证，就是前6位有些数字合法有些数字不合法。<br /><br />function isIdCardNo(num)<br />{   <br />          num = num.toUpperCase();  <br />         //身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X。   <br />          if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num)))   <br />          {<br />               alert('输入的身份证号长度不对，或者号码不符合规定！\n15位号码应全为数字，18位号码末位可以为数字或X。');<br />              return false;<br />         }<br />//校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。<br />//下面分别分析出生日期和校验位<br />var len, re;<br />len = num.length;<br />if (len == 15)<br />{<br />re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);<br />var arrSplit = num.match(re);<br /><br />//检查生日日期是否正确<br />var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);<br />var bGoodDay;<br />bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));<br />if (!bGoodDay)<br />{<br />          alert('输入的身份证号里出生日期不对！');   <br />           return false;<br />}<br />else<br />{<br />//将15位身份证转成18位<br />//校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。<br />          var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);<br />           var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');<br />           var nTemp = 0, i;   <br />            num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);<br />           for(i = 0; i &lt; 17; i ++)<br />          {<br />                nTemp += num.substr(i, 1) * arrInt[i];<br />           }<br />           num += arrCh[nTemp % 11];   <br />            return num;   <br />}   <br />}<br />if (len == 18)<br />{<br />re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);<br />var arrSplit = num.match(re);<br /><br />//检查生日日期是否正确<br />var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);<br />var bGoodDay;<br />bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));<br />if (!bGoodDay)<br />{<br />alert(dtmBirth.getYear());<br />alert(arrSplit[2]);<br />alert('输入的身份证号里出生日期不对！');<br />return false;<br />}<br />else<br />{<br />//检验18位身份证的校验码是否正确。<br />//校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。<br />var valnum;<br />var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);<br />var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');<br />var nTemp = 0, i;<br />for(i = 0; i &lt; 17; i ++)<br />{<br />nTemp += num.substr(i, 1) * arrInt[i];<br />}<br />valnum = arrCh[nTemp % 11];<br />if (valnum != num.substr(17, 1))<br />{<br />alert('18位身份证的校验码不正确！应该为：' + valnum);<br />return false;<br />}<br />return num;<br />}<br />}<br />return false;<br />}  <br />3、严格的验证：<br />&lt;script><br />var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北 ",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏 ",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外 "}<br /><br />function cidInfo(sId){<br />var iSum=0<br />var info=""<br />if(!/^d{17}(d|x)$/i.test(sId))return false;<br />sId=sId.replace(/x$/i,"a");<br />if(aCity[parseInt(sId.substr(0,2))]==null)return "Error:非法地区";<br />sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));<br />var d=new Date(sBirthday.replace(/-/g,"/"))<br />if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Error:非法生日";<br />for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)<br />if(iSum%11!=1)return "Error:非法证号";<br />return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")<br />}<br />document.write(cidInfo("380524198002300016"),"&lt;br/>");<br />document.write(cidInfo("340524198002300019"),"&lt;br/>")<br />document.write(cidInfo("340524197711111111"),"&lt;br/>")<br />document.write(cidInfo("34052419800101001x"),"&lt;br/>");<br />&lt;/script>
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/183419#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Apr 2008 15:46:30 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/183419</link>
        <guid>http://jiake0504.javaeye.com/blog/183419</guid>
      </item>
      <item>
        <title>JAVA分割字符串的方法</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/182115" style="color:red;">http://jiake0504.javaeye.com/blog/182115</a>&nbsp;
          发表时间: 2008年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          import java.util.ArrayList;<br />import java.util.List;<br /><br /><br />public class StringSplit {<br /><br />    /**<br />     * @param args<br />     */<br />    public static void main(String[] args) {<br />        String[] aa = "aaa||bbb||ccc||".split("\\|\\|");<br />       <br />        for(String a :aa){<br />            System.out.println(a);          <br />        }<br />        System.out.println(aa.length);<br />       <br />        List &lt;String> referralMessageList = new ArrayList&lt;String>();<br />        String bb = "ddd||ee||ff";<br />        String [] referealReasons = bb.split("\\|\\|");<br />        for(String b :referealReasons){<br />            referralMessageList.add(b);<br />        }<br />        <br />        for(String l :referralMessageList){<br />            System.out.println(l);          <br />        }<br />    }<br />}
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/182115#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Apr 2008 15:39:03 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/182115</link>
        <guid>http://jiake0504.javaeye.com/blog/182115</guid>
      </item>
      <item>
        <title>常用的JavaScript验证正则表达式</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/182103" style="color:red;">http://jiake0504.javaeye.com/blog/182103</a>&nbsp;
          发表时间: 2008年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          //校验是否全由数字组成 <br />[code] function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.test(s)) return false return true } [/code] <br /><br />//校验登录名：只能输入5-20个以字母开头、可带数字、“_”、“.”的字串 <br />[code] function isRegisterUserName(s) { var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/; if (!patrn.test(s)) return false return true } [/code] <br /><br />//校验用户姓名：只能输入1-30个以字母开头的字串 <br />[code] function isTrueName(s) { var patrn=/^[a-zA-Z]{1,30}$/; if (!patrn.test(s)) return false return true } }} //校验密码：只能输入6-20个字母、数字、下划线 [code] function isPasswd(s) { var patrn=/^(\w){6,20}$/; if (!patrn.test(s)) return false return true } [/code] <br /><br />//校验普通电话、传真号码：可以“+”开头，除数字外，可含有“-” <br />[code] function isTel(s) { //var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/; var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; if (!patrn.test(s)) return false return true } [/code] <br /><br />//校验手机号码：必须以数字开头，除数字外，可含有“-” <br />[code] function isMobil(s) { var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; if (!patrn.test(s)) return false return true } [/code] <br /><br />//校验邮政编码 <br />[code] function isPostalCode(s) { //var patrn=/^[a-zA-Z0-9]{3,12}$/; var patrn=/^[a-zA-Z0-9 ]{3,12}$/; if (!patrn.test(s)) return false return true } [/code] <br /><br />//校验搜索关键字 <br />[code] function isSearch(s) { var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;'\,.&lt;>/?]{1}[^`~!@$%^&()+=|\\\] [\]\{\}:;'\,.&lt;>?]{0,19}$/; if (!patrn.test(s)) return false return true } function isIP(s) //by zergling { var patrn=/^[0-9.]{1,20}$/; if (!patrn.test(s)) return false return true } [/code] <br />//检查是否含有中文<br />		function isChinese(temp) <br />		{ <br />		 var re = /[^\u4e00-\u9fa5]/; <br />		 if(re.test(temp)) <br />		 {<br />			return false; <br />		 }<br />		 else{<br />		<br />			return true; <br />		 } <br />		}
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/182103#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Apr 2008 14:56:17 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/182103</link>
        <guid>http://jiake0504.javaeye.com/blog/182103</guid>
      </item>
      <item>
        <title>Java 常用正则表达式（收集）</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/182095" style="color:red;">http://jiake0504.javaeye.com/blog/182095</a>&nbsp;
          发表时间: 2008年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          "^\d+$"　　//非负整数（正整数 + 0） <br />"^[0-9]*[1-9][0-9]*$"　　//正整数 <br />"^((-\d+)|(0+))$"　　//非正整数（负整数 + 0） <br />"^-[0-9]*[1-9][0-9]*$"　　//负整数 <br />"^-?\d+$"　　　　//整数 <br />"^\d+(\.\d+)?$"　　//非负浮点数（正浮点数 + 0） <br />"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"　　//正浮点数 <br />"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"　　//非正浮点数（负浮点数 + 0） <br />"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"　　//负浮点数 <br />"^(-?\d+)(\.\d+)?$"　　//浮点数 <br />"^[A-Za-z]+$"　　//由26个英文字母组成的字符串 <br />"^[A-Z]+$"　　//由26个英文字母的大写组成的字符串 <br />"^[a-z]+$"　　//由26个英文字母的小写组成的字符串 <br />"^[A-Za-z0-9]+$"　　//由数字和26个英文字母组成的字符串 <br />"^\w+$"　　//由数字、26个英文字母或者下划线组成的字符串 <br />"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"　　　　//email地址 <br />"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"　　//url<br />/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日<br />/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年<br />"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil<br />"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码<br />"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址<br /><br /><br /><br />匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br />匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />匹配空行的正则表达式：\n[\s| ]*\r<br />匹配HTML标记的正则表达式：/&lt;(.*)>.*&lt;\/\1>|&lt;(.*) \/>/<br />匹配首尾空格的正则表达式：(^\s*)|(\s*$)<br />匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />匹配网址URL的正则表达式：^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$<br />匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />匹配国内电话号码：(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}<br />正确格式为：“XXXX-XXXXXXX”，“XXXX-XXXXXXXX”，“XXX-XXXXXXX”，<br /><br />“XXX-XXXXXXXX”，“XXXXXXX”，“XXXXXXXX”。<br />验证身份证号（15位或18位数字）：“^d{15}|d{}18$” <br />匹配腾讯QQ号：^[1-9]*[1-9][0-9]*$<br /><br /><br />匹配中文字符的正则表达式： [u4e00-u9fa5]<br /><br />匹配双字节字符(包括汉字在内)：[^x00-xff]<br /><br />应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br /><br />String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}<br /><br />匹配空行的正则表达式：n[s| ]*r<br /><br />匹配HTML标记的正则表达式：/&lt;(.*)>.*&lt;/1>|&lt;(.*) />/ <br /><br />匹配首尾空格的正则表达式：(^s*)|(s*$)<br /><br />应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下：<br /><br />String.prototype.trim = function()<br />{<br />return this.replace(/(^s*)|(s*$)/g, "");<br />}<br /><br />利用正则表达式分解和转换IP地址：<br /><br />下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：<br /><br />function IP2V(ip)<br />{<br />re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式<br />if(re.test(ip))<br />{<br />return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />}<br />else<br />{<br />throw new Error("Not a valid IP address!")<br />}<br />}<br /><br />不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：<br /><br />var ip="10.100.20.168"<br />ip=ip.split(".")<br />alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))<br /><br />匹配Email地址的正则表达式：w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*<br /><br />匹配网址URL的正则表达式：http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?<br /><br />利用正则表达式去除字串中重复的字符的算法程序：<br /><br />var s="abacabefgeeii"<br />var s1=s.replace(/(.).*1/g,"$1")<br />var re=new RegExp("["+s1+"]","g")<br />var s2=s.replace(re,"") <br />alert(s1+s2) //结果为：abcefgi<br /><br />得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1<br /><br />s="http://www.9499.net/page1.htm"<br />s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2")<br />alert(s)<br /><br />利用正则表达式限制网页表单里的文本框输入内容：<br /><br />用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"<br /><br />用正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^uFF00-uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"<br /><br />用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"<br /><br />用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
          <br/>
          <span style="color:red;">
            <a href="http://jiake0504.javaeye.com/blog/182095#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 Apr 2008 14:38:45 +0800</pubDate>
        <link>http://jiake0504.javaeye.com/blog/182095</link>
        <guid>http://jiake0504.javaeye.com/blog/182095</guid>
      </item>
      <item>
        <title>JDOM/XPATH编程指南</title>
        <author>jiake0504</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiake0504.javaeye.com">jiake0504</a>&nbsp;
          链接：<a href="http://jiake0504.javaeye.com/blog/181850" style="color:red;">http://jiake0504.javaeye.com/blog/181850</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          XML是一种优秀的数据打包和数据交换的形式，在当今XML大行于天下，如果没有听说过它的大名，那可真是孤陋寡闻了。用XML描述数据的优势显而易见， 它具有结构简单，便于人和机器阅读的双重功效，并弥补了关系型数据对客观世界中真实数据描述能力的不足。W3C组织根据技术领域的需要，制定出了XML的 格式规范，并相应的建立了描述模型，简称DOM。各种流行的程序设计语言都纷纷根据这一模型推出了自己的XML解析器，在JAVA世界里，APACHE组 织开发的XERCES应该是流行最广功能最为强大的XML解析器之一。但是由于W3C在设计DOM模型时，并不是针对某一种语言而设计，因此为了通用性， 加入了许多繁琐而不必要的细节 ，使JAVA程序员在开发XML的应用程序过程中感到不甚方便，因此JDOM作为一种新型的XML解析器横空出世，它不遵循DOM模型，建立了自己独立的 一套JDOM模型(注意JDOM决不是DOM扩展，虽然名字差不多，但两者是平行的关系)，并提供功能强大使用方便的类库，使JAVA程序员可以更为高效 的开发自己的XML应用程序，并极大的减少了代码量，因此它很快得到了业内的认可，如JBUILDER这样的航空母舰级的重磅产品都以JDOM为XML解 析引擎，足见其名不虚传。<br /><br />有了XML数据的描述标准，人们自然就会想到应该有一种查询语言可以在XML中查找任意节点的数据，就像SQL语句可以在关系性数据库中执行查询操作一 样，于是XQUERY和XPATH顺应潮流，应运而生。由于XQUERY较为复杂，使用不甚方便，XPATH渐渐成为主流，我们只需对XPATH进行学 习，便可以应付所有的查询要求。在JDOM发布的最新的V1.0bata10版中，已经加入了对XPATH的支持，这无疑是令开发者十分激动的。<br /><br />学会JDOM和XPATH，你便不再是XML的入门者，在未来的开发生涯中，就像特种兵的多用匕首，为你披荆斩棘，助你勇往直前。闲言少叙，学习还要脚踏实地，从头开始。<br /><br />XPATH速成篇<br /><br />XPATH遵循文档对象模型(DOM)的路径格式，由于每个XML文档都可以看成是一棵拥有许多结点的树，每个结点可以是以下七个类型之一：根 （root）、元素（element）、属性（attribute）、正文（text）、命名空间（namespace）、处理指令 （processing instruction）和注释（comment）。XPATH的基本语法由表达式构成。在计算表达式的值之后产生一个对象，这种对象有以下四种基本类 型：节点集合、布尔型、数字型和字符串型 。XPATH基本上和在文件系统中寻找文件类似，如果路径是以"/"开头的，就表明该路径表示的是一个绝对路径，这和在UNIX系统中关于文件路径的定义 是一致的。以"//"开头则表示在文档中的任意位置查找。<br /><br />不谈泛泛的理论，学习XPATH还要从实例学起最为快捷，并有助于你举一反三。<br /><br />下面的样例XML文档，描述了某台电脑中硬盘的基本信息(根节点&lt;HD>代表硬盘，&lt;disk>标签代表硬盘分区，从它的 name属性可以看出有两个盘符名称为"C"和"D"的分区；每个分区下都包含&lt;capacity>,&lt; directories>&lt;files>三个节点，分别代表了分区的空间大小、目录数量、所含文件个数):<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?><br />  &lt;HD><br />      &lt;disk name="C"><br />        &lt;capacity>8G&lt;/capacity><br />        &lt;directories>200&lt;/directories><br />        &lt;files>1580&lt;/files><br />      &lt;/disk><br />      &lt;disk name="D"><br />        &lt;capacity>10G&lt;/capacity><br />        &lt;directories>500&lt;/directories><br />        &lt;files>3000&lt;/files><br />      &lt;/disk><br />  &lt;/HD><br /> <br /><br />你在XML文档中使用位置路径表达式来查找信息，这些表达式有很多种组成方式。<br /><br />结点元素的查找是你将要碰到的最频繁的查找方式。在上面这个XML文档例子中，根HD包含disk结点。你可以使用路径来查找这些结点，用正斜杠（/）来分隔子结点，返回所有与模式相匹配的元素。下面的XPATH 语句返回所有的disk元素：<br /><br />/HD/disk<br /><br />"*"代表"全部"的意思。/HD/* 代表HD下的全部节点。<br /><br />下面的XPATH将返回任意节点下的名称为disk的全部节点：<br /><br />//disk<br /><br />下面的XPATH将返回名称为disk，name属性为'C'的全部节点：<br /><br />/HD/disk[@name='C']<br /><br />节点的附加元素，比如属性，函数等都要用方括号扩起来，属性前面要加上@号<br /><br />下面的XPATH将返回文件个数为1580的files节点：<br /><br />/HD/disk/files[text()='1580']<br /><br />大家注意到上面包含一个text()，这就是XPATH的一个函数，它的功能是取出当前节点的文本。<br /><br />下面的XPATH将返回文件个数为1580的分区：<br /><br />/HD/disk/files[text()='1580']/parent::*<br /><br />最后的parent::*表示这个元素的所有的父节点的集合。<br /><br />XPATH中一些有用的函数：<br /><br />string concat(string, string, string*) 联接两个字符串 <br />boolean starts-with(string, string) 判断某字符串是否以另一字符串开头 <br />boolean contains(string, string) 判断某字符串是否包含另一字符串 <br />string substring(string, number, number) 取子字符串 <br />number string-length(string) 测字符串长度 <br />number sum(node-set) 求和 <br />number floor(number) 求小于此数的最大整数值 <br />number ceiling(number) 求大于此数最小整数值 <br /><br />XPATH具有丰富的表达功能，上面这些已经基本够用，在你做项目中就会发现根据实际情况有许多查询需求，你应该参考本文最后提供的W3C发布的关于 XAPH的官方资料进行查阅，我在这里只起一个抛砖引玉的作用，在下面的章节中，我们的应用范例将不会超出上面提到的这些内容，如果你对XPATH感兴 趣，应该在读完本文后，查找相关资料和书籍进行深入学习。<br /><br />JDOM修炼篇<br /><br />用过XERCES的程序员都会感到，有时候用一句话就可以说清楚的事，当用XERCES的API来实现时，要三四行程序。<br /><br />获得并安装JDOM<br /><br />在http://www.jdom.org/ 可以下载JDOM的最新版本，将压缩包中的jdom.jar及lib目录下的全部jar包加入到classpath就可以了。<br /><br />用JDOM解析XML<br /><br />JDOM模型的全部类都在org.jdom.*这个包里，org.jdom.input.*这个包里包含了JDOM的解析器，其中的DOMBuilder 的功能是将DOM模型的Document解析成JDOM模型的Document；SAXBuilder的功能是从文件或流中解析出符合JDOM模型的 XML树。由于我们的上面提到的XML样例存储在一个名称为sample.xml的文件中，很显然我们应该采用后者作为解析工具。下面程序演示了jdom 的基本功能，即解析一个xml文档，并挑选一些内容输出到屏幕上。<br /><br />import java.util.*;<br />import org.jdom.*;<br />import org.jdom.input.SAXBuilder;<br /><br />public class Sample1 {        <br />	<br />	public static void main(String[] args) throws Exception{                 <br />		<br />		SAXBuilder sb=new SAXBuilder();                <br />		Document doc=sb.build("sample.xml");                <br />		Element root=doc.getRootElement();                <br />		List list=root.getChildren("disk");                <br />		for(int i=0;i&lt;list.size();i++){                        <br />			Element element=(Element)list.get(i);                        <br />			String name=element.getAttributeValue("name");                        <br />			String capacity=element.getChildText("capacity");                        <br />			String directories=element.getChildText("directories");                        <br />			String files=element.getChildText("files");                        <br />			System.out.println("磁盘信息:");                        <br />			System.out.println("分区盘符:"+name);                        <br />			System.out.println("分区容量:"+capacity);                        <br />			System.out.println("目录数:"+directories);                        <br />			System.out.println("文件数:"+files);                        <br />			System.out.println("-----------------------------------");                <br />			}          <br />		}<br />}<br /> <br /><br />程序的输出结果：<br /><br />磁盘信息:分区盘符:C分区容量:8G目录数:200文件数:1580<br />-----------------------------------<br />磁盘信息:分区盘符:D分区容量:10G目录数:500文件数:3000<br />-----------------------------------<br /> <br /><br />这段程序采用了传统的解析方式，一级一级的从根节点到子节点逐个采集我们所需要的数据，中规中矩。试想如果这个树足够深，我们想取第5 0层第三个节点的数据（夸张了点，呵呵），那将是一场噩梦！下面的内容将轻松化解你的这一痛苦。<br /><br />JDOM+XPATH进阶篇<br /><br />说了那么多JDOM和XPATH的好处，终于到了英雄有用武之地的时候了。<br /><br />JDOM的关于XPATH的api在org.jdom.xpath这个包里。看看这个包下，只有一个类，JDOM就是如此简洁，什么事都不故弄玄虚的搞得 那么复杂。这个类中的核心的api主要是两个selectNodes()和selectSingleNode()。前者根据一个xpath语句返回一组节 点；后者根据一个xpath语句返回符合条件的第一个节点。<br /><br />下面的程序我们用JDOM+XPATH实现了上一个程序同样的功能，你可以从中学到不少运用XPATH 的知识：<br /><br />import java.util.*;<br />import org.jdom.*;<br />import org.jdom.input.SAXBuilder;<br />import org.jdom.xpath.XPath;<br /><br />public class Sample2 {          <br />	public static void main(String[] args) throws Exception {                <br />		SAXBuilder sb = new SAXBuilder();                <br />		Document doc = sb.build("sample.xml");                <br />		Element root = doc.getRootElement();                <br />		List list = XPath.selectNodes(root, "/HD/disk");                <br />		for (int i = 0; i > list.size(); i++) {                         <br />			Element disk_element = (Element) list.get(i);                        <br />			String name = disk_element.getAttributeValue("name");                        <br />			String capacity = ( (Text) XPath.selectSingleNode(disk_element,"//disk[@name='" + name + "']/capacity/text()")).getTextNormalize();                        <br />			String directories = ( (Text) XPath.selectSingleNode(disk_element,"//disk[@name='" + name + "']/directories/text()")).getTextNormalize();                        <br />			Strin