<?xml version='1.0' encoding='UTF-8'?>
<rss version='2.0' xmlns:dc='http://purl.org/dc/elements/1.1/'>
<channel>
<title>CSDN技术网摘 -- wz.csdn.net - wukele的网摘</title>
<description>CSDN技术网摘 -- wz.csdn.net - wukele的网摘</description>
<link>http://wz.csdn.com/rss/wukele/</link>
<generator>CSDN网摘 (http://wz.csdn.net)</generator>
<language>zh-cn</language>
<docs>CSDN网摘 包罗技术精华</docs>
<item>
<title>Proxool Provider unable to load JAXP configurator file: proxool.xml - djy1135的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/djy1135/archive/2007/11/24/1901196.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/djy1135/archive/2007/11/24/1901196.aspx</guid>
<category>Proxool</category>
<pubDate>Tue, 14 Oct 2008 13:29:35 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>常用正则表达式 - zenwong的专栏 www.b-Yes.com - CSDNBlog</title>
<link>http://blog.csdn.net/zenwong/archive/2008/09/11/2914431.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/zenwong/archive/2008/09/11/2914431.aspx</guid>
<category>JavaScrip</category>
<pubDate>Tue, 14 Oct 2008 01:25:20 GMT</pubDate>
<description><blockquote>意：这里显示的全是小型大写字母，你可以复制下来放到记事本里看到真实效果。

 

 

 

intege:&quot;^-?[1-9]\\d*$&quot;, //整数

intege1:&quot;^[1-9]\\d*$&quot;, //正整数
intege2:&quot;^-[1-9]\\d*$&quot;, //负整数
num:&quot;^([+-]?)\\d*\\.?\\d+$&quot;, //数字
phone:&quot;d*\\-?\\d+$&quot;, //电话或手机(新添)
num1:&quot;^[1-9]\\d*|0$&quot;, //正数（正整数 + 0）
num2:&quot;^-[1-9]\\d*|0$&quot;, //负数（负整数 + 0）
decmal:&quot;^([+-]?)\\d*\\.\\d+$&quot;, //浮点数
decmal1:&quot;^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$&quot;,　　 //正浮点数
decmal2:&quot;^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$&quot;,　 //负浮点数
decmal3:&quot;^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$&quot;,　 //浮点数
decmal4:&quot;^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$&quot;,　　 //非负浮点数（正浮点数 + 0）
decmal5:&quot;^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$&quot;,　　//非正浮点数（负浮点数 + 0）


email:&quot;^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$&quot;, //邮件
color:&quot;^[a-fA-F0-9]{6}$&quot;, //颜色
url:&quot;^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&amp;=]*)?$&quot;, //url
chinese:&quot;^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$&quot;, //仅中文
ascii:&quot;^[\\x00-\\xFF]+$&quot;, //仅ACSII字符
zipcode:&quot;^\\d{6}$&quot;, //邮编
mobile:&quot;^(13|15)[0-9]{9}$&quot;, //手机
ip4:&quot;^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5]).(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])$&quot;, //ip地址
notempty:&quot;^\\S+$&quot;, //非空
picture:&quot;(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$&quot;, //图片
rar:&quot;(.*)\\.(rar|zip|7zip|tgz)$&quot;, //压缩文件
date:&quot;^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$&quot;, //日期
qq:&quot;^[1-9]*[1-9][0-9]*$&quot;, //QQ号码
tel:&quot;(\\d{3}-|\\d{4}-)?(\\d{8}|\\d{7})&quot;, //国内电话
username:&quot;^(?!\\d)[a-zA-Z0-9\\u4e00-\\u9fa5]+$&quot;, //用来用户注册。匹配由数字、26个英文字母或者下划线组成的字符串
letter:&quot;^[A-Za-z]+$&quot;, //字母
letter_u:&quot;^[A-Z]+$&quot;, //大写字母
letter_l:&quot;^[a-z]+$&quot;, //小写字母
idcard:&quot;^[1-9]([0-9]{14}|[0-9]{17})$&quot; //身份证
 
 
 
 
 
 
 
 
&quot;^\d+$&quot;　　//非负整数（正整数 + 0） 
&quot;^[0-9]*[1-9][0-9]*$&quot;　　//正整数 
&quot;^((-\d+)|(0+))$&quot;　　//非正整数（负整数 + 0） 
&quot;^-[0-9]*[1-9][0-9]*$&quot;　　//负整数 
&quot;^-?\d+$&quot;　　　　//整数 
&quot;^\d+(\.\d+)?$&quot;　　//非负浮点数（正浮点数 + 0） 
&quot;^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$&quot;　　//正浮点数 
&quot;^((-\d+(\.\d+)?)|(0+(\.0+)?))$&quot;　　//非正浮点数（负浮点数 + 0） 
&quot;^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$&quot;　　//负浮点数 
&quot;^(-?\d+)(\.\d+)?$&quot;　　//浮点数 
&quot;^[A-Za-z]+$&quot;　　//由26个英文字母组成的字符串 
&quot;^[A-Z]+$&quot;　　//由26个英文字母的大写组成的字符串 
&quot;^[a-z]+$&quot;　　//由26个英文字母的小写组成的字符串 
&quot;^[A-Za-z0-9]+$&quot;　　//由数字和26个英文字母组成的字符串 
&quot;^\w+$&quot;　　//由数字、26个英文字母或者下划线组成的字符串 
&quot;^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$&quot;　　　　//email地址 
&quot;^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$&quot;　　//url 
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 
&quot;^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$&quot; //Emil 
&quot;(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?&quot; //电话号码 
&quot;^(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])$&quot; //IP地址 



匹配中文字符的正则表达式： [\u4e00-\u9fa5] 
匹配双字节字符(包括汉字在内)：[^\x00-\xff] 
匹配空行的正则表达式：\n[\s| ]*\r 
匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/ 
匹配首尾空格的正则表达式：(^\s*)|(\s*$) 
匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
匹配网址URL的正则表达式：^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 
匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
匹配国内电话号码：(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 
匹配腾讯QQ号：^[1-9]*[1-9][0-9]*$ 


下表是元字符及其在正则表达式上下文中的行为的一个完整列表： 

\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。 

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性，^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。 

$ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性，$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。 

* 匹配前面的子表达式零次或多次。 

+ 匹配前面的子表达式一次或多次。+ 等价于 {1,}。 

? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。 

{n} n 是一个非负整数，匹配确定的n 次。 

{n,} n 是一个非负整数，至少匹配n 次。 

{n,m} m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。 

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 

. 匹配除 &quot;\n&quot; 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符，请使用象 ’[.\n]’ 的模式。 
(pattern) 匹配pattern 并获取这一匹配。 

(?:pattern) 匹配pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。 

(?=pattern) 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。 

(?!pattern) 负向预查，与(?=pattern)作用相反 

x|y 匹配 x 或 y。 

[xyz] 字符集合。 

[^xyz] 负值字符集合。 

[a-z] 字符范围，匹配指定范围内的任意字符。 

[^a-z] 负值字符范围，匹配任何不在指定范围内的任意字符。 

\b 匹配一个单词边界，也就是指单词和空格间的位置。 

\B 匹配非单词边界。 

\cx 匹配由x指明的控制字符。 

\d 匹配一个数字字符。等价于 [0-9]。 

\D 匹配一个非数字字符。等价于 [^0-9]。 

\f 匹配一个换页符。等价于 \x0c 和 \cL。 

\n 匹配一个换行符。等价于 \x0a 和 \cJ。 

\r 匹配一个回车符。等价于 \x0d 和 \cM。 

\s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 

\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 

\t 匹配一个制表符。等价于 \x09 和 \cI。 

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 

\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 

\W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。 

\xn 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。 

\num 匹配 num，其中num是一个正整数。对所获取的匹配的引用。 

\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。 

\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。 

\nml 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。 

\un 匹配 n，其中 n 是一个用四个十六进制数字表示的Unicode字符。 


匹配中文字符的正则表达式： [u4e00-u9fa5] 

匹配双字节字符(包括汉字在内)：[^x00-xff] 

应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1） 

String.prototype.len=function(){return this.replace([^x00-xff]/g,&quot;aa&quot;).length; } 

匹配空行的正则表达式：n[s| ]*r 

匹配HTML标记的正则表达式：/&lt;(.*)&gt;.*|&lt;(.*) /&gt;/ 

匹配首尾空格的正则表达式：(^s*)|(s*$) 

应用：javascript中没有像vbscript那样的trim函数，我们就可以利用这个表达式来实现，如下： 

String.prototype.trim = function() 
{ 
return this.replace(/(^s*)|(s*$)/g, &quot;&quot;);  
} 

利用正则表达式分解和转换IP地址： 

下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序： 

function IP2V(ip) 
{ 
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式 
if(re.test(ip)) 
{ 
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 
} 
else 
{ 
throw new Error(&quot;Not a valid IP address!&quot;) 
} 
} 

不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下： 

var ip=&quot;10.100.20.168&quot; 
ip=ip.split(&quot;.&quot;) 
alert(&quot;IP值是：&quot;+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1)) 

匹配Email地址的正则表达式：w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 

匹配网址URL的正则表达式：http://([w-]+.)+[w-]+(/[w- ./?%&amp;=]*)? 

利用正则表达式去除字串中重复的字符的算法程序： 

var s=&quot;abacabefgeeii&quot; 
var s1=s.replace(/(.).*1/g,&quot;$1&quot;) 
var re=new RegExp(&quot;[&quot;+s1+&quot;]&quot;,&quot;g&quot;) 
var s2=s.replace(re,&quot;&quot;) 
alert(s1+s2) //结果为：abcefgi 

我原来在CSDN上发贴寻求一个表达式来实现去除重复字符的方法，最终没有找到，这是我能想到的最简单的实现方法。思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。 

得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1 

s=&quot;http://www.9499.net/page1.htm&quot; 
s=s.replace(/(.*/){0,}([^.]+).*/ig,&quot;$2&quot;) 
alert(s) 

利用正则表达式限制网页表单里的文本框输入内容： 

用正则表达式限制只能输入中文：onkeyup=&quot;value=&quot;http://www.ygblog.com /value.replace(/[&quot;^u4E00-u9FA5]/g,'')&quot; onbeforepaste=&quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))&quot; 

用正则表达式限制只能输入全角字符： onkeyup=&quot;value=&quot;http://www.ygblog.com/value.replace(/[&quot;^uFF00-uFFFF]/g,'')&quot; onbeforepaste=&quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))&quot; 

用正则表达式限制只能输入数字：onkeyup=&quot;value=&quot;http://www.ygblog.com /value.replace(/[&quot;^d]/g,'') &quot;onbeforepaste=&quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))&quot; 

用正则表达式限制只能输入数字和英文：onkeyup=&quot;value=&quot;http://www.ygblog.com /value.replace(/[W]/g,&quot;'') &quot;onbeforepaste=&quot;clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))&quot; 


 
 
 
——End</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Dynamic Drive DHTML(dynamic html) &amp; JavaScript code library</title>
<link>http://www.dynamicdrive.com/</link>
<guid isPermaLink="true">http://www.dynamicdrive.com/</guid>
<category>JavaScrip</category>
<pubDate>Mon, 13 Oct 2008 13:22:01 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Javascript获取字符串字节数的方法 - dutguoyi(新鲜鱼排)的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/dutguoyi/archive/2007/10/08/1815598.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/dutguoyi/archive/2007/10/08/1815598.aspx</guid>
<category></category>
<pubDate>Mon, 13 Oct 2008 12:12:36 GMT</pubDate>
<description><blockquote>一个英文字符和汉字、日文的字节数是不同的。如果直接使用Javascript的Len函数的话，一个英文字母和汉字的长度都会被认为是1。如果这些数据需要保存在数据库中的话，长度不能有效控制就会带来一些隐患。简单的两个方法来实现长度计算。

str = escape(&quot;汉字abc，,&quot;); 
len = 0; 
for(i=0; i&lt;str.length; i++,len++) {
    if(str.charAt(i)==&quot;%&quot;) {
        if(str.charAt(++i)==&quot;u&quot;) {
            i += 3; 
            len++; 
        }
        i++; 
    }
}
alert(len);  

str = &quot;汉字abc，,&quot;; 
len = 0;  
for(i=0; i=0 &amp;&amp; iCode&lt;=255)||(iCode&gt;=0xff61 &amp;&amp; iCode&lt;=0xff9f)){
        len += 1; 
    }else{
        len += 2; 
    }
}
alert(len); </blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>MemeZilla � Blog Archive � Proxool in practice</title>
<link>http://www.memezilla.com/2005/05/18/proxool-in-practice</link>
<guid isPermaLink="true">http://www.memezilla.com/2005/05/18/proxool-in-practice</guid>
<category>proxoll</category>
<pubDate>Mon, 13 Oct 2008 08:01:44 GMT</pubDate>
<description><blockquote>What is Proxool?

Proxool is an open source Java connection pool, which can add connection pooling to your existing JDBC driver transparently. It is very easy to configure, and you can migrate your code in a walk.

Download

For the most up-to-date version, go to the Proxool download site. As of this date, the current version is Proxool 0.8.3. Download the Proxool zip file to your local machine.

Install

Unzip the proxool-0.8.3.zip file to a directory, You will find proxool-0.8.3.jar in the lib directory. Copy it to your web application’s WEB-INF/lib directory.

Configuration

For ease of changing the database parameters, I will configure the pools by using an XML file or a properties file.

First, I will explain the solution using an XML file. This can be achieved by the following steps:

1. Create an XML file named proxool.xml (you can name it whatever you like), like following:

&lt;?xml version=”1.0″ encoding=”ISO-8859-1″?&gt;

    myPool
    jdbc:mysql://localhost:3306/demodb
    com.mysql.jdbc.Driver
    
      
      
    
    true
    60000
    5 
    50
    select CURRENT_DATE


2. Configure the pools at startup by adding the following lines in web.xml:


  ServletConfigurator
  org.logicalcobwebs.proxool.configuration.ServletConfigurator
  
    xmlFile
    WEB-INF/proxool.xml
  
  1
 

Note that when using this solution, you must download a JAXP compliant XML parser. Here I will use Xerces, download the zip file, unzip it and put all jar files into your web application’s WEB-INF/lib directory.

Another solution I will explain is using a properties file. This can be done also in two steps:

1. Create a propreties file named proxool.properties (you can name it whatever you like), like following:

jdbc-0.proxool.alias=myPool
jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/demodb
jdbc-0.user=root
jdbc-0.password=secret

jdbc-0.proxool.maximum-connection-count=40
jdbc-0.proxool.prototype-count=4

jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
jdbc-0.proxool.verbose=true
jdbc-0.proxool.statistics=10s,1m,1d
jdbc-0.proxool.statistics-log-level=DEBUG

2. Configure the pools at startup by adding the following lines in web.xml:


  ServletConfigurator
  org.logicalcobwebs.proxool.configuration.ServletConfigurator
  
    propertyFile
    WEB-INF/proxool.properties
  
  1
  

Using

Once you’ve done the steps above, restart Tomcat. And now we can pick up a connection by using the alias configured above. The following is a Java Bean used to retrieve a connection from the connection pool.

package com.esurfer.common; 

import java.sql.*; 

public class DBConn {
    public static Connection getConnection() {
       Connection conn = null; 
       try {
            conn = DriverManager.getConnection(”proxool.myPool”); 
       } catch (Exception e) {
            System.out.println(”Get Connection Failed!” + e); 
       }
      return conn; 
    }
}

We can use the connection object retrieved to create statements, like following:

Connection conn = DBConn.getConnection(); 
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 

Lesson

Be sure not to lost the the following line when you configure your servlet.

1
If you lost it, you will get error message something like java.sql.SQLException: No suitable driver. It seems that Proxool itself can’t find the driver.

For the full list of all the properties, visit http://proxool.sourceforge.net/properties.html.
For more information about Proxool, visit http://proxool.sourceforge.net/index.html.</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>后龙: 了解jasperreport ,让web报表跑得更好</title>
<link>http://back-dragon.spaces.live.com/blog/cns!BCAAE481D21E098F!178.entry?fl=cat</link>
<guid isPermaLink="true">http://back-dragon.spaces.live.com/blog/cns!BCAAE481D21E098F!178.entry?fl=cat</guid>
<category>jasperreport</category>
<pubDate>Fri, 10 Oct 2008 03:18:00 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>compdoc2cn: prototype.js开发笔记</title>
<link>https://compdoc2cn.dev.java.net/prototype/html/prototype.js.cn.html#d0e408</link>
<guid isPermaLink="true">https://compdoc2cn.dev.java.net/prototype/html/prototype.js.cn.html#d0e408</guid>
<category>prototype</category>
<pubDate>Thu, 09 Oct 2008 14:12:58 GMT</pubDate>
<description><blockquote>prototype.js开发笔记
1. Programming Guide

    1.1. Prototype是什么?
    1.2. 关联文章
    1.3. 通用性方法

        1.3.1. 使用 $()方法
        1.3.2. 使用$F()方法
        1.3.3. 使用$A()方法
        1.3.4. 使用$H()方法
        1.3.5. 使用$R()方法
        1.3.6. 使用Try.these()方法

    1.4. Ajax 对象

        1.4.1. 使用 Ajax.Request类
        1.4.2. 使用 Ajax.Updater 类

2. prototype.js参考

    2.1. JavaScript 类的扩展
    2.2. 对 Object 类的扩展
    2.3. 对 Number 类的扩展
    2.4. 对 Function 类的扩展
    2.5. 对 String 类的扩展
    2.6. 对 document DOM 对象的扩展
    2.7. 对 Event 对象的扩展
    2.8. 在 prototype.js中定义的新对象和类
    2.9. PeriodicalExecuter 对象
    2.10. Prototype 对象
    2.11. Class 对象
    2.12. Ajax 对象
    2.13. Ajax.Base 类
    2.14. Ajax.Request 类
    2.15. options 参数对象
    2.16. Ajax.Updater 类
    2.17. Ajax.PeriodicalUpdater 类
    2.18. Element 对象
    2.19. Abstract 对象
    2.20. Abstract.Insertion 类
    2.21. Insertion 对象
    2.22. Insertion.Before 类
    2.23. Insertion.Top 类
    2.24. Insertion.Bottom 类
    2.25. Insertion.After 类
    2.26. Field 对象
    2.27. Form 对象
    2.28. Form.Element 对象
    2.29. Form.Element.Serializers 对象
    2.30. Abstract.TimedObserver 类
    2.31. Form.Element.Observer 类
    2.32. Form.Observer 类
    2.33. Abstract.EventObserver 类
    2.34. Form.Element.EventObserver 类
    2.35. Form.EventObserver 类
    2.36. Position 对象 (预备文档)

覆盖版本 1.3.1
Chapter 1. Programming Guide
1.1. Prototype是什么?

或许你还没有用过它， prototype.js 是一个由Sam Stephenson写的JavaScript包。这个构思奇妙编写良好的一段兼容标准的一段代码将承担创造胖客户端， 高交互性WEB应用程序的重担。轻松加入Web 2.0特性。

如果你最近体验了这个程序包，你很可能会发现文档并不是它的强项之一。像所有在我之前的开发者一样，我只能一头扎进prototype.js的源代码中并且试验其中的每一个部分。 我想当我学习他的时候记写笔记然后分享给其他人将会很不错。

我也一起提供了这个包的对象，类，方法和扩展的 非官方参考 。
1.2. 关联文章

高级JavaScript指南
1.3. 通用性方法

这个程序包里面包含了许多预定义的对象和通用性方法。编写这些方法的明显的目的就是为了减少你大量的重复编码和惯用法。
1.3.1. 使用 $()方法

$() 方法是在DOM中使用过于频繁的 document.getElementById() 方法的一个便利的简写，就像这个DOM方法一样，这个方法返回参数传入的id的那个元素。

比起DOM中的方法，这个更胜一筹。你可以传入多个id作为参数然后 $() 返回一个带有所有要求的元素的一个 Array 对象。下面的例子会向你描述这些。



 Test Page 



    function test1()
    {
        var d = $('myDiv'); 
        alert(d.innerHTML); 
    }

    function test2()
    {
        var divs = $('myDiv','myOtherDiv'); 
        for(i=0;  i&lt;divs.length;  i++)
        {
            alert(divs[i].innerHTML); 
        }
    }




    
        This is a paragraph
    
    
        This is another paragraph
    

    
    




这个方法的另一个好处就是你可以传入id字符串或者元素对象自己，这使得在创建可以传入任何形式参数的方法的时候， 它变得非常有用。
1.3.2. 使用$F()方法

$F()方法是另一个非常受欢迎的简写。它可以返回任何输入表单控件的值，如文本框或下拉框。 这个方法可以传入元素的id或者元素自己。


    function test3()
    {
        alert(  $F('userName')  ); 
    }


 


1.3.3. 使用$A()方法

$A()方法把接收到的参数转换成一个Array对象。

这个方法加上对Array类的扩展，可以很容易的转换或者复制任意的列举列表到Array对象， 一个被推荐使用的用法就是转换DOM的NodeLists到一个普通的数组里，可以被更广泛高效的使用， 看下面的例子。



    function showOptions(){
        var someNodeList = $('lstEmployees').getElementsByTagName('option'); 
        var nodes = $A(someNodeList); 

        nodes.each(function(node){
                alert(node.nodeName + ': ' + node.innerHTML); 
            }); 
    }



    Buchanan, Steven
    Callahan, Laura
    Davolio, Nancy


 

1.3.4. 使用$H()方法

$H()方法把对象转化成可枚举的貌似联合数组Hash对象。


    function testHash()
    {
        //let's create the object
        var a = {
            first: 10,
            second: 20,
            third: 30
            }; 

        //now transform it into a hash
        var h = $H(a); 
        alert(h.toQueryString());  //displays: first=10&amp;second=20&amp;third=30
    }



1.3.5. 使用$R()方法

$R()方法是new ObjectRange(lowerBound, upperBound, excludeBounds)的一个简单快捷的使用方式。

ObjectRange类文档里面有完整的解释。 同时，我们来看看一个简单的例子， 来演示通过each方法遍历的用法。 那个方法的更多解释在Enumerable对象文档里面。


    function demoDollar_R(){
        var range = $R(10, 20, false); 
        range.each(function(value, index){
            alert(value); 
        }); 
    }



 

1.3.6. 使用Try.these()方法

Try.these() 方法使得实现当你想调用不同的方法直到其中的一个成功正常的这种需求变得非常容易， 他把一系列的方法作为参数并且按顺序的一个一个的执行这些方法直到其中的一个成功执行，返回成功执行的那个方法的返回值。

在下面的例子中， xmlNode.text在一些浏览器中好用，但是xmlNode.textContent在另一些浏览器中正常工作。 使用Try.these()方法我们可以得到正常工作的那个方法的返回值。


function getXmlNodeValue(xmlNode){
    return Try.these(
        function() {return xmlNode.text; },
        function() {return xmlNode.textContent; )
        ); 
}


1.4. Ajax 对象

上面提到的共通方法非常好，但是面对它吧，它们不是最高级的那类东西。它们是吗？你很可能自己编写了这些甚至在你的脚本里面有类似功能的方法。但是这些方法只是冰山一角。

我很肯定你对prototype.js感兴趣的原因很可能是由于它的AJAX能力。所以让我们解释当你需要完成AJAX逻辑的时候，这个包如何让它更容易。

Ajax 对象是一个预定义对象，由这个包创建，为了封装和简化编写AJAX 功能涉及的狡猾的代码。 这个对象包含一系列的封装AJAX逻辑的类。我们来看看它们的一些。
1.4.1. 使用 Ajax.Request类

如果你不使用任何的帮助程序包，你很可能编写了整个大量的代码来创建XMLHttpRequest对象并且异步的跟踪它的进程， 然后解析出响应 然后处理它。当你不需要支持多于一种类型的浏览器时你会感到非常的幸运。

为了支持 AJAX 功能。这个包定义了 Ajax.Request 类。

假如你有一个应用程序可以通过url http://yoursever/app/get_sales?empID=1234&amp;year=1998与服务器通信。它返回下面这样的XML 响应。

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;

    
        
            
                1234
                1998-01
                $8,115.36
            
            
                1234
                1998-02
                $11,147.51
            
        
    


用 Ajax.Request对象和服务器通信并且得到这段XML是非常简单的。下面的例子演示了它是如何完成的。


    function searchSales()
    {
        var empID = $F('lstEmployees'); 
        var y = $F('lstYears'); 
        var url = 'http://yoursever/app/get_sales'; 
        var pars = 'empID=' + empID + '&amp;year=' + y; 
       var myAjax = new Ajax.Request(
                    url,
                    {method: 'get', parameters: pars, onComplete: showResponse}
                    ); 

    }

    function showResponse(originalRequest)
    {
        //put returned XML in the textarea
        $('result').value = originalRequest.responseText; 
    }



    Buchanan, Steven
    Callahan, Laura
    Davolio, Nancy


    1996
    1997
    1998



你看到传入 Ajax.Request构造方法的第二个对象了吗？ 参数{method: 'get', parameters: pars, onComplete: showResponse} 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 method 值为 'get'的属性，另一个属性名为 parameters 包含HTTP请求的查询字符串，和一个onComplete 属性/方法包含函数showResponse。

还有一些其它的属性可以在这个对象里面定义和设置，如 asynchronous，可以为true 或 false 来决定AJAX对服务器的调用是否是异步的（默认值是 true）。

这个参数定义AJAX调用的选项。在我们的例子中，在第一个参数通过HTTP GET命令请求那个url，传入了变量 pars包含的查询字符串， Ajax.Request 对象在它完成接收响应的时候将调用showResponse 方法。

也许你知道， XMLHttpRequest在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段：Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 对象在任何阶段调用自定义方法 ，Complete 是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 onXXXXX 属性/方法中提供自定义的方法对象。 就像我们例子中的 onComplete 。你传入的方法将会被用一个参数调用，这个参数是 XMLHttpRequest 对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 status 属性。

还有另外两个有用的选项用来处理结果。我们可以在onSuccess 选项处传入一个方法，当AJAX无误的执行完后调用， 相反的，也可以在onFailure选项处传入一个方法，当服务器端出现错误时调用。正如onXXXXX 选项传入的方法一样，这两个在被调用的时候也传入一个带有AJAX请求的XMLHttpRequest对象。

我们的例子没有用任何有趣的方式处理这个 XML响应， 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息，然后更新页面中的某些元素， 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。

更完全的解释，请参照 Ajax.Request 参考 和 Ajax选项参考。
1.4.2. 使用 Ajax.Updater 类

如果你的服务器的另一端返回的信息已经是HTML了，那么使用这个程序包中 Ajax.Updater 类将使你的生活变得更加得容易。用它你只需提供哪一个元素需要被AJAX请求返回的HTML填充就可以了，例子比我写说明的更清楚。


    function getHTML()
    {
        var url = 'http://yourserver/app/getSomeHTML'; 
        var pars = 'someParameter=ABC'; 

         var myAjax = new Ajax.Updater('placeholder', url, {method: 'get', parameters: pars}); 

    }





你可以看到，这段代码比前面的例子更加简洁，不包括 onComplete 方法，但是在构造方法中传入了一个元素id。 我们来稍稍修改一下代码来描述如何在客户端处理服务器段错误成为可能。

我们将加入更多的选项， 指定处理错误的一个方法。这个是用 onFailure 选项来完成的。

我们也指定了一个 placeholder 只有在成功请求之后才会被填充。为了完成这个目的我们修改了第一个参数从一个简单的元素id到一个带有两个属性的对象， success (一切OK的时候被用到) 和 failure (有地方出问题的时候被用到) 在下面的例子中没有用到failure属性，而仅仅在 onFailure 处使用了 reportError 方法。


    function getHTML()
    {
        var url = 'http://yourserver/app/getSomeHTML'; 
        var pars = 'someParameter=ABC'; 
        var myAjax = new Ajax.Updater(
                    {success: 'placeholder'},
                    url,
                    {method: 'get', parameters: pars, onFailure: reportError}); 

    }

    function reportError(request)
    {
        alert('Sorry. There was an error.'); 
    }





如果你的服务器逻辑是返回JavaScript 代码而不是单纯的 HTML 标记， Ajax.Updater对象可以执行那段JavaScript代码。为了使这个对象对待响应为JavaScript，你只需在最后参数的对象构造方法中简单加入evalScripts: true属性。

更完全的解释，请参照 Ajax.Updater 参考 和 Ajax选项参考 。
Chapter 2. prototype.js参考
2.1. JavaScript 类的扩展

prototype.js 包中加入功能的一种途径就是扩展已有的JavaScript 类。
2.2. 对 Object 类的扩展

Table 2.1. Object 类的扩展
方法	类别	参数	描述
extend(destination, source)	static	destination: 任何对象, source: 任何对象	用从 source 到 destination复制所有属性和方法的方式 来提供一种继承机制。
extend(object)	instance	任何对象	用从传入的 object 中复制所有属性和方法的方式 来提供一种继承机制。
2.3. 对 Number 类的扩展

Table 2.2. Number 类的扩展
方法	类别	参数	描述
toColorPart()	instance	(none)	返回数字的十六进制描述， 当在HTML中转换为RGB颜色组件到HTML中使用的颜色。

2.4. 对 Function 类的扩展

Table 2.3. 对 Function 类的扩展
方法	类别	参数	描述
bind(object)	instance	object: 拥有这个方法的对象	返回预先绑定在拥有该函数(=方法)的对象上的函数实例， 返回的方法将和原来的方法具有相同的参数。
bindAsEventListener(object)	instance	object: 拥有这个方法的对象	返回预先绑定在拥有该函数(=方法)的对象上的函数实例， 返回的方法将把当前的事件对象作为它的参数。

让我们看看这些扩展的具体例子。

 Test?

    //declaring the class
    var CheckboxWatcher = Class.create(); 

    //defining the rest of the class implmentation
    CheckboxWatcher.prototype = {

       initialize: function(chkBox, message) {
            this.chkBox = $(chkBox); 
            this.message = message; 
            //assigning our method to the event
            this.chkBox.onclick = this.showMessage.bindAsEventListener(this); 
       },

       showMessage: function(evt) {
          alert(this.message + ' (' + evt.type + ')'); 
       }
    }; 


    var watcher = new CheckboxWatcher('myChk', 'Changed'); 


2.5. 对 String 类的扩展

Table 2.4. String 类的扩展
方法	类别	参数	描述
stripTags()	instance	(none)	返回一个把所有的HTML或XML标记都移除的字符串。
escapeHTML()	instance	(none)	返回一个把所有的HTML标记回避掉的字符串。
unescapeHTML()	instance	(none)	和 escapeHTML()相反。

2.6. 对 document DOM 对象的扩展

Table 2.5. document DOM 对象的扩展
方法	类别	参数	描述
getElementsByClassName(className)	instance	className: 关联在元素上的CSS类名	返回给定的具有相同的CSS类名的所有元素。

2.7. 对 Event 对象的扩展

Table 2.6. Event 对象的扩展
属性	类型	描述
KEY_BACKSPACE	Number	8: 常量，退格(Backspace)键的代码。
KEY_TAB	Number	9: 常量，Tab键的代码。
KEY_RETURN	Number	13: 常量，回车键的代码。
KEY_ESC	Number	27: 常量， Esc键的代码。
KEY_LEFT	Number	37: 常量，左箭头键的代码。
KEY_UP	Number	38: 常量，上箭头键的代码。
KEY_RIGHT	Number	39: 常量，右箭头键的代码。
KEY_DOWN	Number	40: 常量，下箭头键的代码。
KEY_DELETE	Number	46: 常量，删除(Delete)键的代码。
observers:	Array	缓存的观察者的列表，这个对象内部具体实现的一部分。

Table 2.7. Event 对象的扩展
方法	类别	参数	描述
element(event)	static	event: 事件对象	返回引发这个事件的元素。
isLeftClick(event)	static	event: 事件对象	如果鼠标左键单击返回true。
pointerX(event)	static	event: 事件对象	返回在页面上x坐标。
pointerY(event)	static	event: 事件对象	返回在页面上y坐标。
stop(event)	static	event: 事件对象	用这个方法来中止事件的默认行为来使事件的传播停止。
findElement(event, tagName)	static	event: 事件对象, tagName: 指定标记的名字	向 DOM 树的上位查找，找到第一个给定标记名称的元素， 从这个元素开始触发事件。
observe(element, name, observer, useCapture)	static	element: 对象或者对象id, name: 事件名 (如 'click', 'load', etc), observer: 处理这个事件的方法, useCapture: 如果true, 在捕捉到事件的阶段处理事件 那么如果 false在bubbling 阶段处理。	加入一个处理事件的方法。
stopObserving(element, name, observer, useCapture)	static	element: 对象或者对象id, name: 事件名 (如 'click', 'load', etc), observer: 处理这个事件的方法, useCapture: 如果true, 在捕捉到事件的阶段处理事件 那么如果 false在bubbling 阶段处理。	删除一个处理实践的方法。
_observeAndCache( element, name, observer, useCapture)	static	 	私有方法，不用管它。
unloadCache()	static	(none)	私有方法，不用管它。清除内存中的多有观察着缓存。

让我们看看怎样用这个对象加入处理 window 对象的load事件的处理方法。


    Event.observe(window, 'load', showMessage, false); 

    function showMessage() {
      alert('Page loaded.'); 
    }


2.8. 在 prototype.js中定义的新对象和类

另一个这个程序包帮助你的地方就是提供许多既支持面向对象设计理念又有共通功能的许多对象。
2.9. PeriodicalExecuter 对象

这个对象提供一定间隔时间上重复调用一个方法的逻辑。

Table 2.8. PeriodicalExecuter 对象
方法	类别	参数	描述
[ctor](callback, interval)	constructor	callback: 没有参数的方法, interval: 秒数	创建这个对象的实例将会重复调用给定的方法。

Table 2.9. PeriodicalExecuter 对象
属性	类型	描述
callback	Function()	被调用的方法，该方法不会被传入参数。
frequency	Number	以秒为单位的间隔。
currentlyExecuting	Boolean	表示这个方法是否正在执行。

2.10. Prototype 对象

Prototype 没有太重要的作用，只是声明了该程序包的版本 。

Table 2.10. The Prototype object
属性	类型	描述
Version	String	包的版本。
emptyFunction	Function()	空方法对象。

2.11. Class 对象

在这个程序包中 Class 对象在声明其他的类时候被用到 。用这个对象声明类使得新类支持 initialize() 方法，他起构造方法的作用。

看下面的例子

//declaring the class
var MySampleClass = Class.create(); 
//defining the rest of the class implmentation
MySampleClass.prototype = {

   initialize: function(message) {
        this.message = message; 
   },

   showMessage: function(ajaxResponse) {
      alert(this.message); 
   }
}; 

//now, let's instantiate and use one object
var myTalker = new MySampleClass('hi there.'); 
myTalker.showMessage();  //displays alert

Table 2.11. Class 对象
方法	类别	参数	描述
create(*)	instance	(any)	定义新类的构造方法。

2.12. Ajax 对象

这个对象被用作其他提供AJAX功能的类的根对象。

Table 2.12. Ajax 对象
方法	类别	参数	描述
getTransport()	instance	(none)	返回新的XMLHttpRequest 对象。

2.13. Ajax.Base 类

这个类是其他在Ajax对象中定义的类的基类。

Table 2.13. Ajax.Base 类
方法	类别	参数	描述
setOptions(options)	instance	options: AJAX 选项	设定AJAX操作想要的选项。
responseIsSuccess()	instance	(none)	返回 true 如果AJAX操作成功,否则为 false 。
responseIsFailure()	instance	(none)	与 responseIsSuccess() 相反。

2.14. Ajax.Request 类

继承自 Ajax.Base

封装 AJAX 操作

Table 2.14. Ajax.Request 类
属性	类型	类别	描述
Events	Array	static	在AJAX操作中所有可能报告的事件/状态的列表。这个列表包括: 'Uninitialized', 'Loading', 'Loaded', 'Interactive', 和 'Complete'。
transport	XMLHttpRequest	instance	携带AJAX操作的 XMLHttpRequest 对象。

Table 2.15. Ajax.Request 类
方法	类别	参数	描述
[ctor](url, options)	constructor	url: 请求的url, options: AJAX 选项	创建这个对象的一个实例，它将在给定的选项下请求url。 重要：如果选择的url受到浏览器的安全设置，他会一点作用也不起。 很多情况下，浏览器不会请求与当前页面不同主机(域名)的url。 你最好只使用本地url来避免限制用户配置他们的浏览器(谢谢Clay)
request(url)	instance	url: AJAX 请求的url	这个方法通常不会被外部调用。已经在构造方法中调用了。
setRequestHeaders()	instance	(none)	这个方法通常不会被外部调用。 被这个对象自己调用来配置在HTTP请求要发送的HTTP报头。
onStateChange()	instance	(none)	这个方法通常不会被外部调用。 当AJAX请求状态改变的时候被这个对象自己调用。
respondToReadyState(readyState)	instance	readyState: 状态数字 (1 到 4)	这个方法通常不会被外部调用。 当AJAX请求状态改变的时候被这个对象自己调用。

2.15. options 参数对象

AJAX操作中一个重要的部分就是 options 参数。 本质上没有options类。任何对象都可以被传入，只要带有需要的属性。通常会只为了AJAX调用创建匿名类。

Table 2.16. options 参数对象
属性	类型	Default	描述
method	Array	'post'	HTTP 请求方式。
parameters	String	''	在HTTP请求中传入的url格式的值列表。
asynchronous	Boolean	true	指定是否做异步 AJAX 请求。
postBody	String	undefined	在HTTP POST的情况下，传入请求体中的内容。
requestHeaders	Array	undefined	和请求一起被传入的HTTP头部列表， 这个列表必须含有偶数个项目， 任何奇数项目是自定义的头部的名称， 接下来的偶数项目使这个头部项目的字符串值。 例子:['my-header1', 'this is the value', 'my-other-header', 'another value']
onXXXXXXXX	Function(XMLHttpRequest)	undefined	在AJAX请求中，当相应的事件/状态形成的时候调用的自定义方法。 例如 var myOpts = {onComplete: showResponse, onLoaded: registerLoaded}; . 这个方法将被传入一个参数， 这个参数是携带AJAX操作的 XMLHttpRequest对象。
onSuccess	Function(XMLHttpRequest)	undefined	当AJAX请求成功完成的时候调用的自定义方法。 这个方法将被传入一个参数， 这个参数是携带AJAX操作的 XMLHttpRequest对象。
onFailure	Function(XMLHttpRequest)	undefined	当AJAX请求完成但出现错误的时候调用的自定义方法。 这个方法将被传入一个参数， 这个参数是携带AJAX操作的 XMLHttpRequest对象。
insertion	Function(Object, String)	null	为了把返回的文本注入到一个元素中而执行的方法。 这个方法将被传入两个参数，要被更新的对象并且只应用于 Ajax.Updater 的响应文本 。
evalScripts	Boolean	undefined, false	决定当响应到达的时候是否执行其中的脚本块，只在 Ajax.Updater 对象中应用。
decay	Number	undefined, 1	决定当最后一次响应和前一次响应相同时在 Ajax.PeriodicalUpdater 对象中的减漫访问的次数， 例如，如果设为2，后来的刷新和之前的结果一样， 这个对象将等待2个设定的时间间隔进行下一次刷新， 如果又一次一样， 那么将等待4次，等等。 不设定这个只，或者设置为1，将避免访问频率变慢。

2.16. Ajax.Updater 类

继承自 Ajax.Request

当请求的url返回一段HTML而你想把它直接放置到页面中一个特定的元素的时候被用到。 如果url的返回 的块并且想在接收到时就执行它的时候也可以使用该对象。含有脚本的时候使用 evalScripts 选项。

Table 2.17. Ajax.Updater 类
属性	类型	类别	描述
ScriptFragment	String	static	可以判断是否为脚本的正则表达式。
containers	Object	instance	这个对象包含两个属性:AJAX请求成功执行的时候用到 containers.success , 否则的话用到 containers.failure 。

Table 2.18. Ajax.Updater 类
方法	类别	参数	描述
[ctor](container, url, options)	constructor	container:可以是元素的id, 也可以是元素自己, 或者可以是带有2个属性的对象 - object.success AJAX请求成功的时候用到的元素(或者id) 否则用到object.failure 中设定的元素(或id) ,url: 请求的url, options: AJAX 选项	创建一个用给定的选项请求给定的url的一个实例。
updateContent()	instance	(none)	这个方法通常不会被外部调用。 当响应到达的时候，被这个对象自己调用。 它会用HTML更新适当的元素或者调用在 insertion 选项中传入的方法-这个方法将被传入两个参数， 被更新的元素和响应文本。

2.17. Ajax.PeriodicalUpdater 类

继承自 Ajax.Base

这个类重复生成并使用 Ajax.Updater 对象来刷新页面中的一个元素。或者执行 Ajax.Updater 可以执行的其它任务。更多信息参照 Ajax.Updater 参考 。

Table 2.19. Ajax.PeriodicalUpdater 类
属性	类型	类别	描述
container	Object	instance	这个值将直接传入Ajax.Updater的构造方法。
url	String	instance	这个值将直接传入Ajax.Updater的构造方法。
frequency	Number	instance	两次刷新之间的间隔 (不是频率) ，以秒为单位。 默认2秒。 This 当调用 Ajax.Updater 对象的时候，这个数将和当前的 decay 相乘。
decay	Number	instance	重负执行任务的时候保持的衰败水平。
updater	Ajax.Updater 	instance	最后一次使用的 Ajax.Updater 对象
timer	Object	instance	通知对象该下一次更新时用到的JavaScript 计时器。

Table 2.20. Ajax.PeriodicalUpdater 类
方法	类别	参数	描述
[ctor](container, url, options)	constructor	container:可以是元素的id, 也可以是元素自己, 或者可以是带有2个属性的对象 - object.success AJAX请求成功的时候用到的元素(或者id) 否则用到object.failure 中设定的元素(或id) ,url: 请求的url, options: AJAX 选项	创建一个用给定的选项请求给定的url的一个实例。
start()	instance	(none)	这个方法通常不会被外部调用。 对象为了开始周期性执行任务的时候调用的方法。
stop()	instance	(none)	这个方法通常不会被外部调用。 对象为了停止周期性执行任务的时候调用的方法。
updateComplete()	instance	(none)	这个方法通常不会被外部调用。 被当前的 Ajax.Updater 使用，当一次请求结束的时候，它被用作计划下一次请求。
onTimerEvent()	instance	(none)	这个方法通常不会被外部调用。当到下一次更新时被内部调用。

2.18. Element 对象

这个对象提供在操作DOM中元素时使用的功能性方法。

Table 2.21. Element 对象
方法	类别	参数	描述
toggle(elem1 [, elem2 [, elem3 [...]]])	constructor	elemN: 元素对象或id	切换每一个传入元素的可视性。
hide(elem1 [, elem2 [, elem3 [...]]])	instance	elemN: 元素对象或id	用设定它的 style.display 为 'none'来隐藏每个传入的元素。
show(elem1 [, elem2 [, Slem3 [...]]])	instance	elemN: 元素对象或id	用设定它的 style.display 为 ''来显示每个传入的元素。
remove(element)	instance	element: 元素对象或id	从document对象中删除指定的元素。
getHeight(element)	instance	element: 元素对象或id	返回元素的 offsetHeight 。
addClassName( element, className)	instance	element: 元素对象或id, className: CSS类名	向元素的类名中加入给定的类名。
hasClassName( element, className)	instance	element: 元素对象或id, className: CSS类名	返回 true 如果元素的类名中含有给定的类名
removeClassName( element, className)	instance	element: 元素对象或id, className: CSS类名	从元素的类名中删除给定的类名。
cleanWhitespace( element )	instance	element: 元素对象或id	删除该元素的所有只含有空格的子节点。

2.19. Abstract 对象

这个对象是这个程序包中其他类的根。它没有任何属性和方法。在这个对象中定义的类可以被视为传统的抽象类。
2.20. Abstract.Insertion 类

这个类被用作其他提供动态内容插入功能的类的基类，它像一个抽象类一样被使用。

Table 2.22. Abstract.Insertion 类
方法	类别	参数	描述
[ctor](element, content)	constructor	element: 元素对象或id, content: 被插入的HTML	创建一个可以帮助插入动态内容的对象。

Table 2.23. Abstract.Insertion 类
属性	类型	类别	描述
adjacency	String	static, parameter	这个参数指定相对于给定元素，内容将被放置的位置。 可能的值是: 'beforeBegin', 'afterBegin', 'beforeEnd', 和 'afterEnd'.
element	Object	instance	与插入物做参照元素对象。
content	String	instance	被插入的 HTML 。

2.21. Insertion 对象

这个对象是其他类似功能的根。它没有任何属性和方法。在这个对象中定义的类仍然可以被视为传统的抽象类。
2.22. Insertion.Before 类

继承自 Abstract.Insertion

在给定元素开始标记的前面插入HTML。

Table 2.24. Insertion.Before 类
方法	类别	参数	描述
[ctor](element, content)	constructor	element: 元素对象或id, content: 被插入的HTML	继承自 Abstract.Insertion. 创建一个可以帮助插入动态内容的对象。

下面的代码

Hello, Wiggum. How's it going?

 new Insertion.Before('person', 'Chief ');  

将把 HTML 变为

Hello, Chief Wiggum. How's it going?

2.23. Insertion.Top 类

继承自 Abstract.Insertion

在给定元素第一个子节点位置插入 HTML。内容将位于元素的开始标记的紧后面。

Table 2.25. Insertion.Top 类
方法	类别	参数	描述
[ctor](element, content)	constructor	element: 元素对象或id, content: 被插入的HTML	继承自 Abstract.Insertion. 创建一个可以帮助插入动态内容的对象。

下面的代码

Hello, Wiggum. How's it going?

 new Insertion.Top('person', 'Mr. ');  

将把 HTML 变为

Hello, Mr. Wiggum. How's it going?

2.24. Insertion.Bottom 类

继承自 Abstract.Insertion

在给定元素最后一个子节点位置插入 HTML。内容将位于元素的结束标记的紧前面。

Table 2.26. Insertion.Bottom 类
方法	类别	参数	描述
[ctor](element, content)	constructor	element: 元素对象或id, content: 被插入的HTML	继承自 Abstract.Insertion. 创建一个可以帮助插入动态内容的对象。

下面的代码

Hello, Wiggum. How's it going?

 new Insertion.Bottom('person', &quot; What's up?&quot;);  

将把 HTML 变为

Hello, Wiggum. How's it going? What's up?

2.25. Insertion.After 类

继承自 Abstract.Insertion

在给定元素结束标记的后面插入HTML。

Table 2.27. Insertion.After 类
方法	类别	参数	描述
[ctor](element, content)	constructor	element: 元素对象或id, content: 被插入的HTML	继承自 Abstract.Insertion. 创建一个可以帮助插入动态内容的对象。

下面的代码

Hello, Wiggum. How's it going?

 new Insertion.After('person', ' Are you there?');  

将把 HTML 变为

Hello, Wiggum. How's it going? Are you there?

2.26. Field 对象

这个对象提供操作表单中的输入项目的功能性方法。

Table 2.28. Field 对象
方法	类别	参数	描述
clear(field1 [, field2 [, field3 [...]]])	instance	fieldN: 元素对象或id	清除传入表单中项目元素的值。
present(field1 [, field2 [, field3 [...]]])	instance	fieldN: 元素对象或id	只有在所有的表单项目都不为空时返回 true 。
focus(field)	instance	fieldN: 元素对象或id	移动焦点到给定的表单项目。
select(field)	instance	fieldN: 元素对象或id	选择支持项目值选择的表单项目的值。
activate(field)	instance	fieldN: 元素对象或id	移动焦点并且选择支持项目值选择的表单项目的值。

2.27. Form 对象

这个对象提供操作表单和他们的输入项目的功能性方法。

Table 2.29. Form 对象
方法	类别	参数	描述
serialize(form)	instance	form: 表单元素或id	返回url参数格式的项目名和值的列表， 如'field1=value1&amp;field2=value2&amp;field3=value3'。
getElements(form)	instance	form: 表单元素或id	返回包含所有在表单中输入项目的 Array 对象。
getInputs(form [, typeName [, name]])	instance	form: 表单元素或id, typeName: 输入项目的类型, name: 输入项目的名称	返回一个 Array 包含所有在表单中的  元素。 另外， 这个列表可以对元素的类型或名字属性进行过滤。
disable(form)	instance	form: 表单元素或id	使表单中的所有输入项目无效。
enable(form)	instance	form: 表单元素或id	使表单中的所有输入项目有效。
focusFirstElement(form)	instance	form: 表单元素或id	激活第一个表单中可视的，有效的输入项目。
reset(form)	instance	form: 表单元素或id	重置表单。和调用表单对象的 reset() 方法一样。

2.28. Form.Element 对象

这个对象提供表单对象中的可视和非可视元素的功能性方法。

Table 2.30. Form.Element 对象
方法	类别	参数	描述
serialize(element)	instance	element: 表单元素或id	返回元素的 名称=值 对, 如 'elementName=elementValue'。
getValue(element)	instance	element: 表单元素或id	返回元素的值。

2.29. Form.Element.Serializers 对象

这个对象提供了内部使用的用来协助解析出表单元素的当前值功能性方法。

Table 2.31. Form.Element.Serializers 对象
方法	类别	参数	描述
inputSelector(element)	instance	element: 一个带有checked属性的表单元素或id， 如 radio 或 checkbox。	返回带有元素名称和值的 Array , 如 ['elementName', 'elementValue']
textarea(element)	instance	element: 一个带有value属性的表单元素或id， 如 textbox, button 或 password 项目。	返回带有元素名称和值的 Array , 如 ['elementName', 'elementValue']
select(element)	instance	element: 一个 元素对象或id。	返回带有元素名称和所有被选择的选项的值或文本的 Array , 如 ['elementName', 'selOpt1 selOpt4 selOpt9']

2.30. Abstract.TimedObserver 类

这个类是用于其它监听一个元素的值(或者任何类中涉及的属性)变化的类的基类，这个类像一个抽象类一样被使用。

子类可以被创建来监听如输入项目值，或style属性，或表格的行数，或者其他任何对跟踪变化相关的东西。

子类必须实现这个方法来决定什么才是被监听的元素的当前值。

Table 2.32. Abstract.TimedObserver 类
方法	类别	参数	描述
[ctor](element, frequency, callback)	constructor	element: 元素对象或id, frequency: 以秒为单位的间隔, callback: 当元素改变的时候调用的方法。	创建一个监听元素的对象。
registerCallback()	instance	(none)	这个方法通常不会被外部调用。 被这个对象自己调用来开始监听那个元素。
onTimerEvent()	instance	(none)	这个方法通常不会被外部调用。 被这个对象自己调用来周期性的检查那个元素。

Table 2.33. Abstract.TimedObserver 类
属性	类型	描述
element	Object	被监听的元素对象。
frequency	Number	每次检查中的以秒为单位的时间间隔。
callback	Function(Object, String)	只要元素改变这个方法就会被调用。 会接收到元素对象和新值作为参数。
lastValue	String	元素被核实的最后一个值。

2.31. Form.Element.Observer 类

继承自 Abstract.TimedObserver

Abstract.TimedObserver 的一个实现类用来监听表单输入项目的值的变化。当你想监听一个没有带报告值变化事件的元素的时候使用这个类。否则的话使用 Form.Element.EventObserver 类代替。

Table 2.34. Form.Element.Observer 类
方法	类别	参数	描述
[ctor](element, frequency, callback)	constructor	element: 元素对象或id, frequency: 以秒为单位的间隔, callback: 当元素改变的时候调用的方法。	继承自 Abstract.TimedObserver. 创建一个监听元素值属性的对象。
getValue()	instance	(none)	返回元素的值。

2.32. Form.Observer 类

继承自 Abstract.TimedObserver

Abstract.TimedObserver 的一个实现类用来监听表单中任何数据项的值的变化。当你想监听一个没有带报告值变化事件的元素的时候使用这个类。 否则的话使用类 Form.EventObserver 代替。

Table 2.35. Form.Observer 类
方法	类别	参数	描述
[ctor](form, frequency, callback)	constructor	form: 表单对象或id,	继承自 Abstract.TimedObserver. 创建一个监听表单变化的对象。
getValue()	instance	(none)	返回所有表单数据的一系列值。

2.33. Abstract.EventObserver 类

这个类被用作其他一些类的基类，这些类具有在一个元素的值改变事件发生的时候执行一个回调方法这样的功能。

类 Abstract.EventObserver 的多个对象可以绑定到一个元素上，不是一个帮其他的擦出了，而是按照他们付给元素的顺序执行这些回调方法。

单选按钮和复选框的触发事件是 onclick ，而文本框和下拉列表框/下拉列表框的是 onchange 。

子类必须实现这个方法来决定什么才是被监听的元素的当前值。

Table 2.36. Abstract.EventObserver 类
方法	类别	参数	描述
[ctor](element, callback)	constructor	element: 元素对象或id, callback: 当事件发生的时候调用的方法。	创建监听元素的对象。
registerCallback()	instance	(none)	这个方法通常不会被外部调用。 被对象调用来把自己绑定到元素的事件上。
registerFormCallbacks()	instance	(none)	这个方法通常不会被外部调用。 被对象调用来把自己绑定到表单中的每一个数据项元素的事件上。
onElementEvent()	instance	(none)	这个方法通常不会被外部调用。 将被绑定到元素的事件上。

Table 2.37. Abstract.EventObserver 类
属性	类型	描述
element	Object	被监听的元素对象。
callback	Function(Object, String)	只要元素改变就调用的方法。会接收到元素对象和新值作为参数。
lastValue	String	元素被核实的最后一个值。

2.34. Form.Element.EventObserver 类

继承自 Abstract.EventObserver

Abstract.EventObserver 的一个实现类，它在监测到表单中数据项元素的值改变的相应事件时候执行一个回调方法。 如果元素没有任何报告变化的事件，那么你可以使用 Form.Element.Observer 类代替。

Table 2.38. Form.Element.EventObserver 类
方法	类别	参数	描述
[ctor](element, callback)	constructor	element: 元素对象或id, callback: 当事件发生的时候调用的方法。	继承自 Abstract.EventObserver。 创建一个监听元素值属性的对象。
getValue()	instance	(none)	返回元素的值。

2.35. Form.EventObserver 类

继承自 Abstract.EventObserver

Abstract.EventObserver 的一个实现类，监听表单对象中包含的任何对象的任何变化，用元素的事件检测值的变化。如果元素没有任何报告变化的事件， 那么你可以使用 Form.Observer 类代替。

Table 2.39. Form.Element.EventObserver 类
方法	类别	参数	描述
[ctor](form, callback)	constructor	form: 元素对象或id, callback: 当表单中任何数据项改变的时候调用的方法	继承自 Abstract.EventObserver。 创建一个监听元素值属性的对象。
getValue()	instance	(none)	返回所有表单数据的一系列值。

2.36. Position 对象 (预备文档)

这个对象提供许多和元素位置相关的方法。

Table 2.40. Position 对象 (预备文档)
方法	类别	参数	描述
prepare()	instance	(none)	调整 deltaX 和 deltaY 属性来协调在滚动位置中的变化。 记得在页面滚动之后的任何调用的withinIncludingScrolloffset 之前调用这个方法。
realOffset(element)	instance	element: 对象或id	返回这个元素的正确滚动偏差的 Array 对象， 包括所有影响元素的滚动偏差。结果数组类似 [total_scroll_left, total_scroll_top]
cumulativeOffset(element)	instance	element: 对象或id	回这个元素的正确滚动偏差的 Array 对象， 包含任何被放置的父元素强加偏差。结果数组类似 [total_offset_left, total_offset_top]
within(element, x, y)	instance	element: 对象, x 和 y: 一个点的坐标	测试给定的点的坐标是否在给定的元素的外部矩形范围之内。
withinIncludingScrolloffsets(element, x, y)	instance	element: object, x and y: coordinates of a point	 
overlap(mode, element)	instance	mode: 'vertical' 或 'horizontal', element: 对象	在调用这个方法之前需要调用within() 。这个方法返回0.0到1.0之间的数字，来表示坐标在元素重叠的分数。 举个例子，如果元素是一个边长是100px的正方形的DIV，并且位于(300, 300), 然后 within(divSquare, 330, 330)；overlap('vertical', divSquare);  会返回 0.10，意思是那个点位于DIV顶部边框以下 10% (30px) 的位置上。
clone(source, target)	instance	source: 元素对象或 id, target: 元素对象或id	改变目标元素的大小尺寸和位置与源元素的相同。

如果你发现错误，过失或信息不完全，或平淡无意义的东西，请 通知作者 ，作者会尽可能快的修正它，作者仍然在写其他没写的类，来保持一致。 任何翻译的过失，不足，词不达意，表达含糊等请通知我，我会再加斟酌，找到合适的描述。</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>[原创]jsp重定向问题补充 (JSP/Servlet 技术) - [Matrix - 与 Java 共舞]</title>
<link>http://www.matrix.org.cn/thread.shtml?topicId=35762&amp;forumId=14</link>
<guid isPermaLink="true">http://www.matrix.org.cn/thread.shtml?topicId=35762&amp;forumId=14</guid>
<category></category>
<pubDate>Thu, 09 Oct 2008 09:30:37 GMT</pubDate>
<description><blockquote>下面发表一下我对重定向的理解，并带有源代码，大家可以试验一下：
RequestDispatcher rd=request.getRequestDispatcher(&quot;URL&quot;)和response.sendRedirect(&quot;URL&quot;)有什么区别啊？？

好象都是重新定位页面嘛……



好了，今天知道了一个简单的区别，估计还有更深层次的，以后在研究。

resonse.sendRedirect(&quot;URL&quot;)是立即跳转，也就是说执行到这一步是，会跳转直URL所在页，但resonse.sendRedirect(&quot;URL&quot;)后的语句会继续执行。

而RequestDispatcher rd=request.getRequestDispatcher(&quot;URL&quot;); 不会立即执行，而是要到 rd.forward(request,response); 后再跳转。（个人感觉想JDBC中的PreparedStatement 以及PreparedStatement.excute()）rd.forward(request,response); 后的语句不会再继续执行



所以在有些受保护的页面中判断完SESSION中的属性后应该用RequestDispatcher而如果要用response.sendRedirect(&quot;URL&quot;)则要在IF后面加ELSE



实例如下：jsp1.jsp用于选择显示jsp2.jsp及jsp3.jsp为两个不同的jsp但都显示SESSION中的infor属性。jumpaction.jsp和jumpaction2.jsp分别为两种不同的跳转方法.

//jsp1.jsp

&lt;%@ page contentType=&quot;text/html;  charset=GBK&quot; %&gt;
&lt;%session.invalidate(); %&gt;



jsp1




select

  &lt;!--or action=&quot;jmpaction.jsp&quot;--&gt;
  
  



//jsp2.jsp

&lt;%@ page contentType=&quot;text/html;  charset=GBK&quot; %&gt;



jsp2




JSP2

&lt;%=session.getAttribute(&quot;infor&quot;) %&gt;




//jsp3.jsp

&lt;%@ page contentType=&quot;text/html;  charset=GBK&quot; %&gt;



jsp3




jsp3

&lt;%=session.getAttribute(&quot;infor&quot;) %&gt;



//jumpaction.jsp

&lt;%
  if (request.getParameter(&quot;jumpsel&quot;).equals(&quot;1&quot;))
    response.sendRedirect(&quot;jsp2.jsp&quot;); 
  else {
    response.sendRedirect(&quot;jsp3.jsp&quot;); 
  }
  session.setAttribute(&quot;infor&quot;,&quot;the programme alreay run to here&quot;); 
%&gt;

//jumpaction2.jsp

&lt;%
RequestDispatcher rd=request.getRequestDispatcher(&quot;jsp1.jsp&quot;); 
  if (request.getParameter(&quot;jumpsel&quot;).equals(&quot;1&quot;))
rd=request.getRequestDispatcher(&quot;jsp2.jsp&quot;); 
  else {
rd=request.getRequestDispatcher(&quot;jsp3.jsp&quot;); 
  }
  rd.forward(request,response); 
  session.setAttribute(&quot;infor&quot;,&quot;the programme alreay run to here&quot;); 
%&gt;
大家可以修改FORM1的ACTION，来具体看一下两种跳转有什么区别。
======================
senddirect 简单的改变客户端浏览器的地址 实现跳转用户访问的url改变了
dispater 则保持地址不变 实质性的区别在于后者 是带request,和response 一起跳转的 ,把request和response委托拖到后继角色继续处理!</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>随便写写了: IReport编码问题解决（转）</title>
<link>http://flower-city.spaces.live.com/Blog/cns!5CDF3197CFFC015F!545.entry</link>
<guid isPermaLink="true">http://flower-city.spaces.live.com/Blog/cns!5CDF3197CFFC015F!545.entry</guid>
<category>IReport</category>
<pubDate>Thu, 09 Oct 2008 03:53:38 GMT</pubDate>
<description><blockquote>IReport编码问题解决（转）
一、在ireport直接生成中的解决方法 

1、mysql数据库的字符编码不变，采用默认编码； 

2、ireport的数据库设置中用以下方式: 

jdbc:mysql://localhost:3306/database?user=&amp;password=&amp;useUnicode=true&amp;characterEncoding=GB2312 

3、 text   field   expresssion 中写入以下字符转换代码: 

new   String($F{name}.getBytes(&quot;iso-8859-1&quot;),&quot;gb2312&quot;) 

注:如果是在web中应用，就不需要字符集转换，直接写$F{name}就可以了，但是在web应用中的数据库连接写法中应照2的写法 

4、i18n中的设置可以是UTF-8或者gb2312 

二、移植到web（jsp）的应注意的事项 

（1）找不到报表文件
看一下你的物理路径中是否能找到那个test.jasper 文件，没有的话建立正确的目录把设
JasperReport 与iReport 的配置与使用
计编译好的test.jasper 文件放进去就行了。
（2）运行后没有报错，什么反映也没有
安装一下Adobe acrobat reader 等PDF 阅读工具软件。
（3）可以运行，但出不了PDF 文件，只是在IE 中有一堆乱码
没有报错就说明程序没有问题，在你自己的客户端找找问题所在，可以试着换个Adobe
acrobat reader 版本，同时如果是以Localhost 等域名的方法访问的话，换成IP 方式试一下。
（4）能运行，但出不来中文
请确认您的web-inflib 目录中是否有iTextAsian.jar 文件，并且您已经在报表设计器中将
字段的font 调成汉字类型了。 

三、生成PDF注意事项 

以下引用:http://blog.csdn.net/CloneIQ/archive/2007/01/05/1474938.aspx 

1 运行环境
    1.1 JasperReport 1.2.8
    JasperReports是iReport的核心内容。它是一个强有力的开源报表产生工具，可以将内容输出到屏幕上、打印机或生成PDF, HTML, XLS, CSV和XML等文件。它完全用Java编写，并可在各种Java应用（包括J2EE或WEB应用）中用来产生动态报表内容。JasperReports组织根据在一个XML文件中定义的报表设计通过JDBC访问关系数据库中的数据.填充报表数据之前必须先将报表设计被编译成一个jasper文件。
下载地址: http://jasperreports.sourceforge.net/
   1.2 iReport 1.2 8
    iReport是一个制作Jasperreport XML文件的优秀可视化开发工具，通过它可以方便的设计报表模板。目前最高版本为iReport 1.3.0
下载地址: http://ireport.sourceforge.net
   1.3 iText 1.3.1
   iText是一个开放源码的Java类库，是用来生成PDF文件的。
下载地址: http://itext.sourceforge.net
   1.4 iTextAsian.jar
   如果要在生成的pdf文件显示中文等亚洲字符，还必须下载itext的亚洲字符包。
下载地址: http://itextdocs.lowagie.com/downloads/iTextAsian.jar
以上四个包必须加到应用程序的构建路径中或加到CLASSPATH，若是Web应用放入相应的WEB-INFlib中。
2 设置中文支持
    为了在报表中能够显示中文,加入以上四个包还不够(因为以上四个包仅对报表生成及中文显示提供了支持),必须设置报表上各显示对象的相关属性,各属性设置说明如下:
Font        name:    宋体 (中文字体)
    PDF font name:   STSong-Light 
    PDF  Encoding:  UniGB-UCS2-H(Chinese Siplified)
    PDF   Embeded: √
    如下图所示(显示对象的属性设置):

注意:此三项的设置必须确保iTextAsian.jar亚洲语言包已经包含在项目中,否则出现编译错误.
    若读者觉得对每一个对象设置比较麻烦,可通过iReport的”Format””Fonts”菜单进行统一设置,并设成报表的默认字体。如下图所示:
３可能出现的问题
   经过以上的设置,报表中文的显示应该没什么问题了,笔者在报表的开发过程中遇到几个问题，现总结如下：
3.1 问题描述
   在WinXp中运行iReport1.2.8，设计报表时将数据字段的字体设置成中文字体，调好格式后编译并运行,并使用JRViewer进行预览一切正常(中文显示正常),但使用PDF、Excel预览出现如下错误:
Could not load the following font : 
   pdfFontName   : STSong-Light
   pdfEncoding   : UniGB-UCS2-H
   isPdfEmbedded : true
产生原因:成成PDF的亚洲语言包没有包含到项目中
解决办法:将亚洲语言包iTextAsian.jar包含到项中,可能过iReport的”Options””Classpath”将iTextAsian.jar添加Classpath中或者直接将iTextAsian.jar复制到iReport安装目录下的lib中.若是Web项目则应该将iTextAsian.jar复制到此项目的WEB-INFlib中.
3.2 问题描述
    在WinXp中运行iReport1.2.8，设计报表时将数据字段的字体设置成中文字体，调好格式后编译并运行,并使用JRViewer进行预览一切正常(中文显示正常),使用PDF、Excel预览时无任何错误,但中文无法显示(只显示空白).
产生原因:报表显示对象的PDF字体属性设置不正确
解决办法: 报表对象有关字体属性的设置如下:
Font        name:         宋体 (中文字体)
    PDF font name:  STSong-Light 
    PDF Encoding:   UniGB-UCS2-H(Chinese Siplified)
    PDF Embeded:  √
   即如下图所法
   3.３问题描述
    生成PDF、Excel文件时,中文显示一切正常,但生成Html文件时显示乱码
产生原因：主要是网页编码问题
解决方法
　在JSP页中生成Html时,设置 &lt;%@ page contentType=&quot;text/html; charset=GB2312&quot; %&gt;　
　在Servlet中生成Html时,response.setContentType(&quot;text/html; charset=GB2312&quot;); 
  若用户对项目进行了统一编码设定及过滤,则需要另作考虑,但主要还是集中在编码问题上.例如:笔者最近做的项目是其于Struts的,对编码进行了统一和过滤处理,生成Html页面时无需指编码就可正确生成Html页面,并不会出乱码,若设置成charset=GB2312反而出现了乱码.总之,对编码的统一与处理还是比较嘛烦的事.
    另外, 我们通过查看iReport生成的jrxml(&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;)文件可以发现, iReport保存的汉字都是UTF-8编码。了解它的编码可以有助于我们统一编码方式。</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>四个有用的过滤器Filter(转载) - terry_whut的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/terry_whut/archive/2008/10/08/3035506.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/terry_whut/archive/2008/10/08/3035506.aspx</guid>
<category></category>
<pubDate>Thu, 09 Oct 2008 00:44:30 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Java读取数据库写excel文档 - dcju002的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/dcju002/archive/2008/10/08/3035986.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/dcju002/archive/2008/10/08/3035986.aspx</guid>
<category></category>
<pubDate>Thu, 09 Oct 2008 00:42:48 GMT</pubDate>
<description><blockquote>//要到apache公司下载poi3.1jar包

package excel; 
import org.apache.poi.hssf.util.*; 
import java.sql.*; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import org.apache.poi.hssf.usermodel.*; 
//插入图片需要导入的jar包
import java.awt.image.BufferedImage; 
import java.io.ByteArrayOutputStream; 
import java.net.URL; 
import javax.imageio.ImageIO; 


public class WriteExcel {
 private Connection con=null; 


 public Connection getConnection(){
  String ClssForName=&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;; 
  String url=&quot;jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs&quot;; 
  if(con==null){
   
   try{
    Class.forName(ClssForName); 
    con=DriverManager.getConnection(url,&quot;sa&quot;,&quot;&quot;); 
    
   } catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
   }catch(SQLException cone){
    System.out.println(cone); 
   }
  }
  
  return con; 
 }
 
 public static void main(String[] args)throws Exception {
  Connection conn=null; 
  Statement st=null; 
  ResultSet rs=null; 
  int i=0; 
  String sql=&quot;select *from authors&quot;; 
  WriteExcel wr=new WriteExcel(); 
  
  conn=wr.getConnection(); 
  st=conn.createStatement(); 
  rs=st.executeQuery(sql); 
  
        //声明一个工作薄
        HSSFWorkbook wb=new HSSFWorkbook(); 
        //生成一个表格
        HSSFSheet sheet=wb.createSheet(&quot;表格1&quot;); 
        //生成一个列
      //  HSSFRow row=sheet.createRow(0); 
        //生成一个样式
        HSSFCellStyle style=wb.createCellStyle(); 
        //设置这些样式
        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); 
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
        style.setBorderRight(HSSFCellStyle.BORDER_THIN); 
        style.setBorderTop(HSSFCellStyle.BORDER_THIN); 
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
        //生成一个字体
        HSSFFont font=wb.createFont(); 
        font.setColor(HSSFColor.VIOLET.index); 
        font.setFontHeightInPoints((short)10); 
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
        //把字体应用到当前的样式
        style.setFont(font); 
        //填充单元格
        while(rs.next()){
         HSSFRow row=sheet.createRow(i); 
            //声明一个单元格
            HSSFCell cell=row.createCell((short)0); 
            //设置单元格的字符值
            cell.setCellValue(new HSSFRichTextString(rs.getString(&quot;au_id&quot;).toString())); 
            //设置单元格的样式
            cell.setCellStyle(style); 
            //设置第二列数值
            HSSFCell au_lname=row.createCell((short)1); 
            au_lname.setCellValue(new HSSFRichTextString(rs.getString(&quot;au_lname&quot;))); 
            //设置第三列数值
            HSSFCell au_fname=row.createCell((short)2); 
            au_fname.setCellValue(new HSSFRichTextString(rs.getString(&quot;au_fname&quot;))); 
            HSSFCell phone=row.createCell((short)3); 
            phone.setCellValue(new HSSFRichTextString(rs.getString(&quot;phone&quot;))); 
            HSSFCell address=row.createCell((short)4); 
            address.setCellValue(new HSSFRichTextString(rs.getString(&quot;address&quot;))); 
            i++; 
        }
        FileOutputStream fout=new FileOutputStream(&quot;d:\\我的第一个EXCEL.xls&quot;); 
        //输出到文件
        wb.write(fout); 
        fout.close(); 
    }
 /**
  * 插入图片
  * @throws Exception
  *
  */
 public void insertIMG() throws Exception{
  
    //声明一个工作薄
        HSSFWorkbook wb=new HSSFWorkbook(); 
        //生成一个表格
        HSSFSheet sheet=wb.createSheet(&quot;表格1&quot;); 
        //生成一个列
        HSSFRow row=sheet.createRow(0); 
        //生成一个样式
        HSSFCellStyle style=wb.createCellStyle(); 
        //设置这些样式
        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); 
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
        style.setBorderRight(HSSFCellStyle.BORDER_THIN); 
        style.setBorderTop(HSSFCellStyle.BORDER_THIN); 
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
        //生成一个字体
        HSSFFont font=wb.createFont(); 
        font.setColor(HSSFColor.VIOLET.index); 
        font.setFontHeightInPoints((short)16); 
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
        //把字体应用到当前的样式
        style.setFont(font); 
        //声明一个画图的顶级管理器
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 
        //填充单元格
        for(short i=0; i&lt;5; i++){
            //声明一个单元格
            HSSFCell cell=row.createCell(i); 
            switch(i){
                case 0:
                    //设置普通文本
                    cell.setCellValue(new HSSFRichTextString(&quot;普通文本&quot;)); 
                    break; 
                case 1:
                    //设置为形状
                    HSSFClientAnchor a1 = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 ); 
                    HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1); 
                    //这里可以设置形状的样式
                    shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); 
                   
                    break; 
                case 2:
                    //设置为布尔量
                    cell.setCellValue(true); 
                    break; 
                case 3:
                    //设置为double值
                    cell.setCellValue(12.5); 
                    break; 
                case 4:
                    //设置为图片]
                  //  URL url=Test3.class.getResource(&quot;hello.jpg&quot;); 
                   // insertImage(wb,patriarch,getImageData(ImageIO.read(url)),0,4,1); 
                    break; 
                   
            }
           
            //设置单元格的样式
            cell.setCellStyle(style); 
        }
        FileOutputStream fout=new FileOutputStream(&quot;我的第一个EXCEL.xls&quot;); 
        //输出到文件
        wb.write(fout); 
        fout.close(); 
    }
    //自定义的方法,插入某个图片到指定索引的位置
    private static void insertImage(HSSFWorkbook wb,HSSFPatriarch pa,byte[] data,int row,int column,int index){
        int x1=index*250; 
        int y1=0; 
        int x2=x1+255; 
        int y2=255; 
        HSSFClientAnchor anchor = new HSSFClientAnchor(x1,y1,x2,y2,(short)column,row,(short)column,row); 
        anchor.setAnchorType(2); 
        pa.createPicture(anchor , wb.addPicture(data,HSSFWorkbook.PICTURE_TYPE_JPEG)); 
    }
    //从图片里面得到字节数组
    private static  byte[] getImageData(BufferedImage bi){
        try{
            ByteArrayOutputStream bout=new ByteArrayOutputStream(); 
            ImageIO.write(bi,&quot;PNG&quot;,bout); 
            return bout.toByteArray(); 
        }catch(Exception exe){
            exe.printStackTrace(); 
            return null; 
        }

 }

}</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>eclipse反编译插件Jadclipse介绍 - THJsword@TJU_永远属于37�?26的arrow - DonewsBlog</title>
<link>http://blog.donews.com/THJsword/archive/2006/06/08/908470.aspx</link>
<guid isPermaLink="true">http://blog.donews.com/THJsword/archive/2006/06/08/908470.aspx</guid>
<category>Jadclipse</category>
<pubDate>Tue, 07 Oct 2008 12:56:37 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>通用js客户端表单验证函数 - 礼必风 - BlogJava</title>
<link>http://www.blogjava.net/bily/archive/2008/05/05/81355.html</link>
<guid isPermaLink="true">http://www.blogjava.net/bily/archive/2008/05/05/81355.html</guid>
<category>JavaScrip</category>
<pubDate>Sat, 27 Sep 2008 08:00:59 GMT</pubDate>
<description><blockquote>通用js客户端表单验证函数</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>PowerDesigner的创建使用及如何设置显示注释信息_Win2050.Com 博客天地 www.inbaidu.com</title>
<link>http://hi.baidu.com/qzrc/blog/item/0fe6f2d335c973dda8ec9a43.html</link>
<guid isPermaLink="true">http://hi.baidu.com/qzrc/blog/item/0fe6f2d335c973dda8ec9a43.html</guid>
<category>PowerDesigner</category>
<pubDate>Tue, 23 Sep 2008 07:15:30 GMT</pubDate>
<description><blockquote>PowerDesigner的创建使用及如何设置显示注释信息</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>JAVA实现Excel导入/导出[转]_xiami</title>
<link>http://hi.baidu.com/xiami9910/blog/item/00d5b56044f0cfd98cb10d20.html</link>
<guid isPermaLink="true">http://hi.baidu.com/xiami9910/blog/item/00d5b56044f0cfd98cb10d20.html</guid>
<category>POI</category>
<pubDate>Tue, 23 Sep 2008 05:18:13 GMT</pubDate>
<description><blockquote>JAVA实现Excel导入/导出[转]2008-09-08 15:51POI的下载与安装 

　　请到网站http://www.apache.org/dyn/closer.cgi/poi/右击超链接2.5.1.zip下载压缩包poi-bin-2.5.1-final-20040804.zip，解压缩后得到如图2.1所示的目录结构。我们主要用到poi-2.5.1-final-20040804.jar这个库文件。请把poi-2.5.1-final-20040804.jar这个文件的路径添加到系统环境变量classpath中，否则无法编译下面的示例程序。</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>ActiveMQ5.0实战一: 安装配置ActiveMQ5.0 - 远 -- 学然后知不足 - JavaEye技术网站</title>
<link>http://andyao.javaeye.com/blog/153171</link>
<guid isPermaLink="true">http://andyao.javaeye.com/blog/153171</guid>
<category>ActiveMQ5.0</category>
<pubDate>Thu, 18 Sep 2008 12:29:23 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>轻松实现Url rewite - 快乐生活，快乐工作 - JavaEye技术网站</title>
<link>http://tangshuo.javaeye.com/blog/184821</link>
<guid isPermaLink="true">http://tangshuo.javaeye.com/blog/184821</guid>
<category>url,rewrite,filter</category>
<pubDate>Thu, 18 Sep 2008 10:59:35 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>SQL统计，学生成绩 - wudi - 博客园</title>
<link>http://www.cnblogs.com/birdwudi/archive/2007/08/08/847817.html</link>
<guid isPermaLink="true">http://www.cnblogs.com/birdwudi/archive/2007/08/08/847817.html</guid>
<category>SQL</category>
<pubDate>Wed, 17 Sep 2008 08:34:02 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Java examples (example source code) Organized by topic</title>
<link>http://www.java2s.com/</link>
<guid isPermaLink="true">http://www.java2s.com/</guid>
<category>Java代码查询网站</category>
<pubDate>Mon, 08 Sep 2008 11:14:04 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>SQL server 2000 标准版、企业版、开发版、个人版各版本之间的区别 - -﹥＞Ekin之家 - TOM博客</title>
<link>http://blog.tom.com/y_chan/article/781.html</link>
<guid isPermaLink="true">http://blog.tom.com/y_chan/article/781.html</guid>
<category>SQL,server,sql server </category>
<pubDate>Mon, 08 Sep 2008 02:02:33 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>急求：怎样在xsl模板内应用标志位(标志真假即可)? Web 开发 / XML/SOAP - CSDN社区 community.csdn.net</title>
<link>http://topic.csdn.net/t/20040831/15/3326418.html</link>
<guid isPermaLink="true">http://topic.csdn.net/t/20040831/15/3326418.html</guid>
<category>xsl</category>
<pubDate>Tue, 02 Sep 2008 09:09:11 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>正则表达式(学习) - 雨寒 - 51CTO技术博客-领先的IT技术博客</title>
<link>http://august.blog.51cto.com/59588/7046</link>
<guid isPermaLink="true">http://august.blog.51cto.com/59588/7046</guid>
<category>正则表达式</category>
<pubDate>Tue, 02 Sep 2008 01:09:29 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>javascript 常用代码大全(超级收藏，强烈推荐)（３） - 乡下天空 - 51CTO技术博客-领先的IT技术博客</title>
<link>http://soly84.blog.51cto.com/153780/45380</link>
<guid isPermaLink="true">http://soly84.blog.51cto.com/153780/45380</guid>
<category>JavaScrip</category>
<pubDate>Tue, 02 Sep 2008 00:36:24 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Ganglia安装心得 - 技术文档 - 安装启动 Linux时代 - 开源、自由、共享 - 中国最大的Linux技术社区</title>
<link>http://linux.chinaunix.net/techdoc/install/2006/05/29/933276.shtml</link>
<guid isPermaLink="true">http://linux.chinaunix.net/techdoc/install/2006/05/29/933276.shtml</guid>
<category>Ganglia</category>
<pubDate>Mon, 01 Sep 2008 12:10:13 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>developerWorks 中国：Eclipse 资源中心：资源分类</title>
<link>http://www.ibm.com/developerworks/cn/eclipse/resources.html#richclient</link>
<guid isPermaLink="true">http://www.ibm.com/developerworks/cn/eclipse/resources.html#richclient</guid>
<category>Eclipse,资源分类</category>
<pubDate>Sun, 31 Aug 2008 06:19:32 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>oracle控制台服务故障解决 - 远程轰炸机 - 网易博客</title>
<link>http://blog.163.com/lv_2005_wy/blog/static/104157352007112943423580/</link>
<guid isPermaLink="true">http://blog.163.com/lv_2005_wy/blog/static/104157352007112943423580/</guid>
<category>oracle</category>
<pubDate>Sat, 30 Aug 2008 08:05:21 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>分享：oracle启动问题详解_3394的百度空间</title>
<link>http://hi.baidu.com/haoshuang3394/blog/item/16da6c8b55397f16c8fc7a9d.html</link>
<guid isPermaLink="true">http://hi.baidu.com/haoshuang3394/blog/item/16da6c8b55397f16c8fc7a9d.html</guid>
<category>oracle</category>
<pubDate>Sat, 30 Aug 2008 07:48:57 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>中文Adobe Flex例子,RIA资源,全文检索技术,算法和数据结构 - 中文Flex例子</title>
<link>http://blog.minidx.com/</link>
<guid isPermaLink="true">http://blog.minidx.com/</guid>
<category>flex</category>
<pubDate>Fri, 29 Aug 2008 05:44:44 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>AIRIA - Flex、AIR、RIA中文资源</title>
<link>http://www.airia.cn/</link>
<guid isPermaLink="true">http://www.airia.cn/</guid>
<category>Flex</category>
<pubDate>Fri, 29 Aug 2008 05:42:56 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Ganglia - Huihoo Wiki - Open Source Wiki</title>
<link>http://wiki.huihoo.com/index.php?title=Ganglia</link>
<guid isPermaLink="true">http://wiki.huihoo.com/index.php?title=Ganglia</guid>
<category></category>
<pubDate>Wed, 27 Aug 2008 13:32:31 GMT</pubDate>
<description><blockquote>Ganglia 是一个开源项目，它为高性能计算系统（例如集群和网格）提供了一个免费的可扩展分布式监视系统。</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>如何读取Oracle的BLOB字段里的文件 - cheungmine的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/cheungmine/archive/2008/08/27/2836925.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/cheungmine/archive/2008/08/27/2836925.aspx</guid>
<category>blob</category>
<pubDate>Wed, 27 Aug 2008 13:16:20 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Java 运行时监控，第 1 部分: Java 系统运行时性能和可用性监控</title>
<link>http://www.ibm.com/developerworks/cn/java/j-rtm1/</link>
<guid isPermaLink="true">http://www.ibm.com/developerworks/cn/java/j-rtm1/</guid>
<category></category>
<pubDate>Wed, 27 Aug 2008 12:59:01 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Java 运行时监控，第 2 部分: 编译后插装和性能监控</title>
<link>http://www.ibm.com/developerworks/cn/java/j-rtm2/?S_TACT=105AGX52&amp;S_CMP=NL&amp;ca=dnl-cn-08272008</link>
<guid isPermaLink="true">http://www.ibm.com/developerworks/cn/java/j-rtm2/?S_TACT=105AGX52&amp;S_CMP=NL&amp;ca=dnl-cn-08272008</guid>
<category></category>
<pubDate>Wed, 27 Aug 2008 12:54:24 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>方法为什么---走出软件作坊：三五个人十来条枪 如何成为开发正规军（三十九） - 阿朱=行业趋势 开发管理 架构 - CSDNBlog</title>
<link>http://blog.csdn.net/david_lv/archive/2008/07/21/2686616.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/david_lv/archive/2008/07/21/2686616.aspx</guid>
<category>走出软件作坊</category>
<pubDate>Tue, 26 Aug 2008 14:07:58 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>使用Rome实现网站ApacheRSS发布的简单步骤 - java2000.net的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/java2000_net/archive/2008/04/16/2297409.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/java2000_net/archive/2008/04/16/2297409.aspx</guid>
<category>RSS</category>
<pubDate>Mon, 25 Aug 2008 12:22:38 GMT</pubDate>
<description><blockquote>description</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Apache和Tomcat 实现泛域名解析的尝试 - java2000.net的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/java2000_net/archive/2008/05/20/2462926.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/java2000_net/archive/2008/05/20/2462926.aspx</guid>
<category>Apache</category>
<pubDate>Mon, 25 Aug 2008 12:16:15 GMT</pubDate>
<description><blockquote>RewriteRule</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Lucene 索引架构及建立、删除索引_红宝石之光</title>
<link>http://hi.baidu.com/sunsonruby/blog/item/e66dc618ec94c70434fa4168.html</link>
<guid isPermaLink="true">http://hi.baidu.com/sunsonruby/blog/item/e66dc618ec94c70434fa4168.html</guid>
<category>Lucene</category>
<pubDate>Mon, 25 Aug 2008 02:08:26 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>SAX与DOM之间的区�?- Mark.Yin 的专�?---人民需要无�?- CSDNBlog</title>
<link>http://blog.csdn.net/mickeyfirst/archive/2007/07/09/1683430.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/mickeyfirst/archive/2007/07/09/1683430.aspx</guid>
<category>DOM</category>
<pubDate>Sun, 24 Aug 2008 03:18:03 GMT</pubDate>
<description><blockquote>当你需要处理XML文档时，你的首要选择是使用DOM(文档对象模型)还是使用SAX(用于XML的简单API)，即当前使用的两个主要的XML API。你可以使用任何一种(或者在同一时间使用两种)来处理XML文档，然而DOM将文档载入到内存中处理，而SAX则相反，它可以检测一个即将到来的 XML流，由此并不需要所有的XML代码同时载入到内存中。
选择DOM与SAX，与在一个数据库中的表单与视图之前选择一样：选择适合于当前实际情况的方法。如果你只是想简单地查看XML文档而不处理它，那么请选择使用SAX。


       SAX与DOM之间的区别


SAX与DOM之间有一些显著区别，包括：
         DOM是复杂对象处理的首选，比如当XML比较复杂的时候，或者当你需要随机处理文档中数据的时候。SAX从文档的开始通过每一节点移动，以定位一个特定的节点。 
DOM为载入到内存的文档节点建立类型描述。最终，这些描述呈现了可容易横向移动、潜在巨大、树型结构。如果XML很冗长，DOM就会显示出无法控制的胀大。例如，一个300KB的XML文档可以导致RAM或者虚拟内存中的3，000，000KB的DOM树型结构。通过比较就会发现，一个SAX文档根本就没有被解构，它也没有隐藏在内存空间中(当然当XML流被读入时，会有部分文档暂时隐藏在内存中)。SAX就是一种“更轻巧的”技术──它可以给你的系统带来更轻的负担。SAX相当于观看一场马拉松比赛，而DOM就好比邀请所有的比赛选手到家里参加晚餐。
所以，你如何选择SAX和DOM？如果你处理复杂的东西，比如高级XSLT转换，或者Xpath过滤，请选择使用DOM。如果你建立或者更改XML文档，你也可以选择DOM。
相反，你可以使用SAX来查询或者阅读XML文档。SAX可以快速扫描一个大型的XML文档，当它找到查询标准时就会立即停止，然后再处理之。
在某些情况下，在一个方案中，最佳的选择是使用DOM和SAX处理不同的部分。例如，你可以使用DOM将XML载入到内存并改变它，然后通过从DOM树中发送一个SAX流而转移最后的结果。


SAX概念

        SAX是Simple API for XML的缩写，它并不是由W3C官方所提出的标准，可以说是“民间”的事实标准。实际上，它是一种社区性质的讨论产物。虽然如此，在XML中对SAX的应用丝毫不比DOM少，几乎所有的XML解析器都会支持它。

与DOM比较而言，SAX是一种轻量型的方法。我们知道，在处理DOM的时候，我们需要读入整个的XML文档，然后在内存中创建DOM树，生成DOM树上的每个Node对象。当文档比较小的时候，这不会造成什么问题，但是一旦文档大起来，处理DOM就会变得相当费时费力。特别是其对于内存的需求，也将是成倍的增长，以至于在某些应用中使用DOM是一件很不划算的事（比如在applet中）。这时候，一个较好的替代解决方法就是SAX。

        SAX在概念上与DOM完全不同。首先，不同于DOM的文档驱动，它是事件驱动的，也就是说，它并不需要读入整个文档，而文档的读入过程也就是SAX的解析过程。所谓事件驱动，是指一种基于回调（callback）机制的程序运行方法。（如果你对Java新的代理事件模型比较清楚的话，就会很容易理解这种机制了）

        在XMLReader接受XML文档，在读入XML文档的过程中就进行解析，也就是说读入文档的过程和解析的过程是同时进行的，这和DOM区别很大。解析开始之前，需要向XMLReader注册一个ContentHandler，也就是相当于一个事件监听器，在ContentHandler中定义了很多方法，比如startDocument()，它定制了当在解析过程中，遇到文档开始时应该处理的事情。当XMLReader读到合适的内容，就会抛出相应的事件，并把这个事件的处理权代理给ContentHandler，调用其相应的方法进行响应</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>利用DBMS_LOB包存储.TXT文件-大熊 - 新浪BLOG</title>
<link>http://blog.sina.com.cn/s/blog_465a4a1e010008yy.html</link>
<guid isPermaLink="true">http://blog.sina.com.cn/s/blog_465a4a1e010008yy.html</guid>
<category>BLOG</category>
<pubDate>Fri, 22 Aug 2008 05:31:30 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>DBMS_LOB包使用和维护 - annicybc的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/annicybc/archive/2007/04/02/1549338.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/annicybc/archive/2007/04/02/1549338.aspx</guid>
<category>DBMS_LOB</category>
<pubDate>Fri, 22 Aug 2008 05:26:09 GMT</pubDate>
<description><blockquote>用http://www.ttadd.com/diannao/HTML/49619.html</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>提取汉字首字母工具类 - wpabbs的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/wpabbs/archive/2008/08/21/2806656.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/wpabbs/archive/2008/08/21/2806656.aspx</guid>
<category></category>
<pubDate>Thu, 21 Aug 2008 11:46:56 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>blob保存 - taner2002的专栏 - CSDNBlog</title>
<link>http://blog.csdn.net/taner2002/archive/2008/08/21/2807780.aspx</link>
<guid isPermaLink="true">http://blog.csdn.net/taner2002/archive/2008/08/21/2807780.aspx</guid>
<category>Blob</category>
<pubDate>Thu, 21 Aug 2008 11:46:46 GMT</pubDate>
<description><blockquote>Blob</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>我的标签: javascript - cloudgamer - 博客园</title>
<link>http://www.cnblogs.com/cloudgamer/tag/JavaScript/</link>
<guid isPermaLink="true">http://www.cnblogs.com/cloudgamer/tag/JavaScript/</guid>
<category>JavaScrip</category>
<pubDate>Thu, 21 Aug 2008 00:38:12 GMT</pubDate>
<description><blockquote>Javascript 读asp的cookiecloudgamer 2008-08-08 16:35 阅读:69 评论:0JavaScript 图片切割效果（带拖放、缩放效果）cloudgamer 2008-07-21 01:20 阅读:2750 评论:41JavaScript 图片切换展示效果cloudgamer 2008-07-06 01:25 阅读:3363 评论:32JavaScript 自定义多级联动浮动菜单cloudgamer 2008-06-28 11:32 阅读:2525 评论:18JavaScript 自定义多级联动下拉菜单cloudgamer 2008-06-24 10:52 阅读:532 评论:0JavaScript 图片变换效果(ie only)cloudgamer 2008-05-23 12:02 阅读:3155 评论:13JavaScript 弹簧效果</blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>教程大全-闪客在线</title>
<link>http://www.flashsk.com/index/jiaocheng.asp?leibie=Dreamweaver</link>
<guid isPermaLink="true">http://www.flashsk.com/index/jiaocheng.asp?leibie=Dreamweaver</guid>
<category>Dreamweaver</category>
<pubDate>Wed, 20 Aug 2008 01:57:27 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>DOJO中国 | 程序员联盟-一个使用中国汉语言交流的、目前基于前端技术的、非盈利性的、开放地、互动地的程序员学习组织 包括(学习文档、教程、视频教程等) 一个介绍技术的中文站</title>
<link>http://www.dojochina.com/</link>
<guid isPermaLink="true">http://www.dojochina.com/</guid>
<category>DOJO</category>
<pubDate>Tue, 19 Aug 2008 00:48:16 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Lucene：基于Java的全文检索引擎简介 (笔记 by 车东)</title>
<link>http://www.chedong.com/tech/lucene.html</link>
<guid isPermaLink="true">http://www.chedong.com/tech/lucene.html</guid>
<category>Lucene</category>
<pubDate>Mon, 18 Aug 2008 13:12:36 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>SQL 收藏------------SQL操作全集</title>
<link>http://topic.csdn.net/u/20080515/16/6f359854-5403-4397-89e3-b1b8dd71d527.html</link>
<guid isPermaLink="true">http://topic.csdn.net/u/20080515/16/6f359854-5403-4397-89e3-b1b8dd71d527.html</guid>
<category>SQL</category>
<pubDate>Thu, 07 Aug 2008 04:55:11 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>用SQL脚本实现数据库合并复制</title>
<link>http://topic.csdn.net/u/20080730/22/a7000f89-6ebd-4eb0-8766-5525d66f077c.html</link>
<guid isPermaLink="true">http://topic.csdn.net/u/20080730/22/a7000f89-6ebd-4eb0-8766-5525d66f077c.html</guid>
<category>SQL</category>
<pubDate>Thu, 07 Aug 2008 04:55:00 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>Velocity脚本摘要 - 企业应用 - Java - JavaEye论坛</title>
<link>http://www.javaeye.com/topic/158792</link>
<guid isPermaLink="true">http://www.javaeye.com/topic/158792</guid>
<category>Velocity</category>
<pubDate>Wed, 06 Aug 2008 12:32:12 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
<item>
<title>最适合实际开发需要的:''代码生成器&gt;发布:rapid-generator-v1.0 - - Java - JavaEye论坛</title>
<link>http://www.javaeye.com/post/614990</link>
<guid isPermaLink="true">http://www.javaeye.com/post/614990</guid>
<category>代码生成器</category>
<pubDate>Wed, 06 Aug 2008 00:55:39 GMT</pubDate>
<description><blockquote></blockquote></description>
<dc:creator>wukele</dc:creator>
</item>
</channel></rss>
