<?xml version="1.0" encoding="GB2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[李国财Blog]]></title>
<link>http://liguocai.zhmy.com/index.html</link>
<description><![CDATA[李国财Blog]]></description>
<item>
<title><![CDATA[activation.jar Javamail.jar Xmlsec.jar下载]]></title>
<link>http://liguocai.zhmy.com/archives/2008/152184.html</link>
<description><![CDATA[<P><SPAN style="FONT-SIZE: 12pt; COLOR: #800000"><STRONG>axis需要的jar文件下载</STRONG></SPAN></P>
<P><SPAN style="FONT-SIZE: 12pt; COLOR: #800000">activation.jar下载：http://java.sun.com/products/javabeans/glasgow/jaf.html </SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-SIZE: 12pt; COLOR: #800000"><SPAN style="FONT-FAMILY: Calibri">mail.jar</SPAN>下载：<SPAN style="FONT-FAMILY: Calibri">http://java.sun.com/products/javamail/</SPAN><SPAN style="FONT-FAMILY: Calibri"></SPAN></SPAN></P>
<P><SPAN style="FONT-SIZE: 12pt; COLOR: #800000">xmlsec.jar下载：http://xml.apache.org/security/ </SPAN></P>
<P><SPAN style="FONT-SIZE: 12pt"><SPAN style="COLOR: #800000">如有需要的请留下你的联系方式,我给你发过去!</SPAN></SPAN></P>
<P><SPAN style="FONT-SIZE: 12pt"><SPAN style="COLOR: #800000">相关截图:&nbsp;&nbsp;<BR><IMG class=blogimg src="http://hiphotos.baidu.com/lgh_boffin/pic/item/29cbfa81df59c2c8bc3e1ebd.jpg" border=0 small="http://www.zhmy.com/0"></SPAN></SPAN></P>]]></description>
<author>不才</author>
<pubDate>2008-11-18 19:34:00</pubDate>
</item>
<item>
<title><![CDATA[Axis使用详解并在Tomcat下的安装过程]]></title>
<link>http://liguocai.zhmy.com/archives/2008/152183.html</link>
<description><![CDATA[<SPAN class=tpc_content>一.简介<BR>什么是SOAP?SOAP是一个应用程序间的基于XML的通信工具和规范.SOAP最初由MicroSoft和Userland公司开发,已经演化了好几 个版本,当前的版本SOAP1.1正飞速发展.W3C的XML协议工作组正努力把它发展为一个真正的开发的标准.SOAP1.2草案已经发布,它能澄清 1.1版规范的容易混淆的地方.<BR><BR>什么是Axis?Axis总体上是一个SOAP引擎,但又不仅仅是个引擎,它还<BR>:1)是一个简单的独立的服务器<BR>2)是一个可插入到servlet 引擎(如Tomcat)中的服务<BR>3)可扩展的支持WSDL<BR>4)能根据WSDL产生JAVA文件/类<BR>5)包括一些例子程序6)包括一个可以监控TCP/IP 包的工具<BR><BR>Axis起源于IBM的SOAP4J,是Apache SOAP的第三代产品,相对于以前的版本,它有如下特性:<BR>1)快速,它使用了基于事件的SAX解析机制.<BR>2)灵活,用户可以灵活定制扩展.<BR>3)稳定,接口将会变动很小.<BR>4)基于组件开发<BR>5)支持WSDL1.1<BR><BR>二.准备<BR>1.安装Tomcat5.0.28,这是当前稳定版本.Tomcat运行在80端口.访问http://localhost/检查Tomcat是否安装成功.<BR>(Tomcat+Apache+Mysql的整合安装,详见另外一篇.)<BR>2.下载AXIS:<BR>官方站点:http://xml.apache.org/axis/index.html<BR>下载软件:axis-bin-1_2_1.tar.gz<BR>3.下载相关包:<BR>a.mail.jar 下载地址:http://java.sun.com/products/javamail<BR>b.activation.jar 下载地址:http://java.sun.com/products/javabeans/glasgow/jaf.html<BR>c.xerces.jar 下载地址:http://xml.apache.org/xerces-j/index.html<BR>d.xmlsec-1.2.1.jar 下载地址:http://xml.apache.org/security/ <BR><BR>三.安装<BR>1.将四个相关包,全部拷到&lt;CATALINA_HOME&gt;;/common/lib目录(Tomcat安装目录下的common/lib)下<BR>2.解压axis-bin-1_2_1.tar.gz,将压缩包里的webapps/axis拷到网站根目录下(如果Tomcat是默认配置,那就是&lt;CATALINA_HOME&gt;;/webapps/ROOT目录).<BR>3.<BR>修改Tomcat的配置文件server.xml(&lt;CATALINA_HOME&gt;;/conf/server.conf)<BR>在&lt;/Host&gt;;前加入:<BR>&lt;Context path="/axis" docBase="C:\Program Files\Apache Software Foundation\Tomcat\webapps\ROOT\axis" debug="0" reloadable="true" &gt;; &lt;/Context&gt;;<BR>(docBase里是你的实际axis存放的目录)<BR>注意,此步至关重要,AXIS的安装文档中没有提到此步,导致很多人安装不成功.<BR>如果没有此步,访问http://localhost/axis时,提示如下错误:<BR>Can't find bundle for base name i18n, locale en_US(zh_CN)<BR>表面是上看i18n国际化的问题,但既使i18n.properties,i18n_zh_cn.properties存在,也无法找到.<BR>网上很多朋友安装到此,无法继续下去,我也找了很多资料,都没有解决.后来查看Tomcat的文档,猜测是Tomcat配置的问题,经测试,终于成功.<BR>可能Tomcat的前期版本,不需此设置.没有测试过.<BR>另外,也可以将axis/WEB-INF/classes/*,axis/WEB-INF/lib/*的所有文件，拷到&lt;CATALINA_HOME&gt;;/common/lib/这个方法比较麻烦.<BR>注：AXIS客户端,需要拷贝axis/WEB-INF/lib/*到&lt;CATALINA_HOME&gt;;/common/lib/<BR><BR>四.测试<BR>重新启动Tomcat.<BR>1.访问：http://localhost/axis<BR>点击：Validation - Validate the local installation's configuration测试是否有错．<BR>2.<BR>写个小程序：<BR>public class HelloService<BR>{<BR>public String sayHello(String username)<BR>{<BR>return "Hello:"+username;<BR>}<BR>}<BR>另存为axis目录下HelloService.jws<BR>再能过WEB访问：<BR>http://loalhost/axis/HelloService.jws<BR>http://loalhost/axis/HelloService.jws?method=sayHello&amp;parameter=ipaddr<BR><BR><BR>另外，如果是Apache+Tomcat整合在一块，以上配置后，还需要更改Apache的配置，在httpd.conf中加入：<BR>JkMount /axis/* ajp13 <BR>通过Apache可以访问axis的Servlet<BR></SPAN>]]></description>
<author>不才</author>
<pubDate>2008-11-18 19:28:00</pubDate>
</item>
<item>
<title><![CDATA[eclipse中使用svn最快上手]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151559.html</link>
<description><![CDATA[<P><SPAN style="FONT-FAMILY: Arial">一.安装subversion <BR>首先安装服务端程序subversion1.x.x和客户端程序TortoiseSVN-1.x.x.xxxx（是两个网站）。subversion在服务器端客户端都需要安装，TortoiseSVN只要在客户端安装就行。TortoiseSVN的语言包下载和TortoiseSVN的下载都在其官网的同一页<BR>如果使用了eclipse并且用插件的话，则可以不用TortoiseSVN。</SPAN> </P>
<P><SPAN style="FONT-FAMILY: Arial">
<P><BR>二.建立Repository（保存文档各个版本的数据库），必须建立在服务端 <BR>1）在服务器端建立一个空目录，比如“d:\svn\project1”。<BR>2）进入dos<BR>3）svnadmin create --fs-type bdb d:\svn\project1<BR>&nbsp;&nbsp; // svnadmin 是exe程序，安装时已经自动加到系统路径了。<BR>&nbsp;&nbsp; // 这里选择了&nbsp; Berkeley Database（BDB）方式做为版本库的类型 <BR>&nbsp;&nbsp; // 也可用TortoiseSVN这个客户端工具实现创建<BR>&nbsp;&nbsp; // d:\svn是版本库的位置，也可以取别的名字，别的路径，一个版本库可以包含多个项目<BR>&nbsp;&nbsp; // project1是某个项目名称，</P>
<P>三.在服务端配置Repository，主要的目的是控制访问权限和添加用户。<BR>1）打开d:\svn\project1\conf\svnserve.conf<BR>2）把以下行前的#去掉，保存<BR>&nbsp;&nbsp; # anon-access = read<BR>&nbsp;&nbsp; # auth-access = write<BR>&nbsp;&nbsp; # password-db = passwd<BR>3）打开d:\svn\project1\conf\passwd文件<BR>4）末尾加一行 <BR>&nbsp;&nbsp; xy = 1<BR>&nbsp;&nbsp; 保存<BR>&nbsp;&nbsp; // xy是用户名，1是密码，自行替换<BR>5）多个用户就加多行</P>
<P>四.在服务端启动subversion服务器。<BR>1）进入dos<BR>2）svnserve.exe -d -r d:\svn<BR>3）服务启动后，在服务器端的3690端口监听客户端的连接请求。<BR>4）参数的作用是：当在客户端用“svn://xxx/project1”(xxx可以是服务器端主机名或ip)访问服务器的Repository时，<BR>&nbsp; 服务器会知道你要访问的Repository路径是“d:\svn\project1”。<BR>5）如果当我有两个完全不相干的项目要进行版本控制时，可以再建立一个空目录 <BR>&nbsp;“d:\svn\Project2”，并在其中再建立一个Repository，<BR>&nbsp; 此时客户端就可以用“svn: //xxx/project2”访问“C:\SVNProjects\Project2”下的Repository。 <BR>6）如果想要注册为window服务，<BR>&nbsp;&nbsp; 进入dos，<BR>&nbsp;&nbsp; sc create svnservice binpath= "D:\Program Files\Subversion\bin\svnserve.exe --service -r d:\svn" displayname= "SVNService" depend= Tcpip<BR>&nbsp;&nbsp; // 请务必在一行内输入<BR>&nbsp;&nbsp; // SVNService是服务名，也可以替换<BR>&nbsp;&nbsp; // D:\Program Files\Subversion\ 是服务器安装svn的路径，要替换<BR>7）如果想注销window服务<BR>&nbsp;&nbsp; 进入dos&nbsp;&nbsp; <BR>&nbsp;&nbsp; sc delete SVNService</P>
<P>五、在客户端安装eclipse的svn插件，安装好后几乎无需任何配置<BR>&nbsp;&nbsp;&nbsp; 在线安装方式的url是http://subclipse.tigris.org/update</P>
<P>六、在客户端，首先确保服务打开，打开视图，window -&gt; show view -&gt; other -&gt; svn -&gt; svn资源库<BR>&nbsp;&nbsp;&nbsp; 右键单击，新建-&gt;资源库位置-&gt; svn://localhost/project1,出现一个资源库，<BR>&nbsp;&nbsp;&nbsp; 右键单击，取出为-&gt;作为新项目取出，并用向导配置。选yes<BR>&nbsp;&nbsp;&nbsp; java-&gt;java项目，next-&gt;finish.<BR>七、在客户端，在eclipse的左边视图项目根目录下加文件夹，加文件，然后<BR>&nbsp;&nbsp;&nbsp; 在eclipse的左边视图的文件夹或根路径下提交，更新。（右键单击）<BR>&nbsp;&nbsp;&nbsp; 所有的操作都在eclipse的界面内完成，工作效率极高。比TortoiseSVN方便，<BR>&nbsp;&nbsp;&nbsp; 注意eclipse的配置文件不要提交上去，就是建立eclipse项目时会自动建立在项目文件夹里的两三个文件。<BR>&nbsp;&nbsp;&nbsp; 因为是“作为新项目取出”。<BR>&nbsp;&nbsp;&nbsp; xieye 20080101</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>linux下安装服务端步骤：</P></SPAN>
<P></P>
<P>从 <A href="http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz"><SPAN style="http://www.zhmy.com/COLOR: #006699">http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz</SPAN></A> &nbsp;下载最新版的Subversion源码包</P>
<P>解压后运行</P>
<P>./configure --prefix=/subversion<BR>make<BR>make install</P>
<P>创建资料库</P>
<P>/subversion/bin/svnadmin create /home/sub_ku</P>
<P>修改配置</P>
<P>/home/sub_ku/conf/passwd 增加用户和口令（明码）</P>
<P>/home/sub_ku/conf/svnserve.conf配置如下</P>
<P>anon-access = none<BR>password-db = passwd</P>
<P>启动独立服务</P>
<P>/subversion/bin/svnserve -d -r /home</P>
<P>&nbsp;</P>
<P><SPAN style="FONT-FAMILY: Arial">想停止服务用kill命令。<BR></SPAN></P>
<P>&nbsp;</P>
<P>默认的SVN端口是3690</P>
<P><SPAN style="FONT-FAMILY: Arial">
<P>&nbsp;</P>
<P>此时，就可以用客户端来访问了。</P></SPAN>]]></description>
<author>不才</author>
<pubDate>2008-10-27 17:33:00</pubDate>
</item>
<item>
<title><![CDATA[js-Javascript数组使用]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151410.html</link>
<description><![CDATA[<SPAN id=ArticleContent1_ArticleContent1_lblContent>在JavaScript 1.0中构造器只存在Date对象和用户定义的对象。你可能期望有个数组构造器，但是一直没能实现，直到JavaScript 1.1的出现，你的期望成为了现实。我们可以如下来定义用户对象： 
<P>function blankArray(n) {</P>
<P>for (var i=0; i &lt; n; i++)</P>
<P>this[i] = null;</P>
<P>this.length = n;</P>
<P>}</P>
<P>blankArray函数创建了一个数组，这个数组中有n个空白项。下面再给出使用这个构造器的例子：</P>
<P>var myArray = new blankArray(3);</P>
<P>myArray[0] = "hello";</P>
<P>myArray[1] = "world";</P>
<P>myArray[2] = "!";</P>
<P>如果你对其它编程语言（如C语言）有些经验的话，你就会直到数组的索引是从0开始的而不是从1开始的。因此在上面的例子中数组索引是从0到2的，故这个数组的长度为3。</P>
<P>以下的代码是更为高级的数组构造器。它使用了'arguments'属性来对数组赋值而不只是创建一个空数组元素，这个属性对于所有的函数都是存在的。虽然没有给定任何的参数，传递的数值仍然可以通过arguments数组来进行访问。具体代码如下：</P>
<P>function makeArray() {</P>
<P>for (var i=0; i &lt; arguments.length; i++)</P>
<P>this[i] = arguments[i];</P>
<P>this.length = arguments.length;</P>
<P>}</P>
<P>而构造器的调用可以是这样的：</P>
<P>var myArray = new makeArray("hello", "world", "!");</P>
<P>在JavaScript 1.1中，创建数组构造器结合了blankArray和makeArray的特定。如下的一个调用：</P>
<P>var myArray = new Array(3); // requires JS 1.1</P>
<P>这个调用创建了一个空白数组（其长度为3）作为上面示范的blankArray构造器。而在Netscape中称为'dense array'，因为每一个元素都有一个数值，可以如下来创建：</P>
<P>var myArray = new Array(value1, value2, value3); // JS 1.1<BR>既然你对构造器和对象属性比较熟悉了，我们可以进一步举些例子。如果你是使用JavaScript 1.1或者更高版本，你可以使用数组构造器。否则你使用makeArray对象更为合适些。 var workPeople = new Array(</P>
<P>new Person("Thomas", 25, "green"), </P>
<P>new Person("Richard", 35, "blue"), </P>
<P>new Person("Harold", 30, "chartreuse")</P>
<P>);</P>
<P>workPeople是一个拥有三个Person对象的数组。每一个Person都有name（名字）、age（年龄）、colour（肤色）以及birthYear（出生年份）属性。</P>
<P>以下再给出一个实例来使用我们上面所学到的。这里还要提醒一下，Person代码块和workPeople数组必须包括到相同的SCRIPT标签中或者网页的其它地方。</P>
<P>&lt;SCRIPT language="JavaScript"&gt;</P>
<P>&lt;!-- Hide from older browsers<BR></P>
<P>function whoIsOldest(pArray) {</P>
<P>var pOldest = pArray[0]; // 数组中的第一个Person</P>
<P>for (var i=1; i &lt; pArray.length; i++) // 对每个附加的Person循环</P>
<P>if (pArray[i].isOlder(pOldest)) // 如果它们比较老</P>
<P>pOldest = pArray[i]; // 将它们设置为最老</P>
<P>return pOldest;</P>
<P>}</P>
<P>var senior = whoIsOldest(workPeople);</P>
<P>document.write("The oldest person is " + senior.name + "&lt;br&gt;" + senior);<BR></P>
<P>// Stop hiding --&gt;</P>
<P>&lt;/SCRIPT&gt;</P>
<P>上面例子的输出为：</P>
<P>The oldest person is Richard</P>
<P>Richard was born in 1963</P>
<P>and is 35 years old.</P>
<P>从whoIsOldest函数返回的数值是一个Person对象，它带有对象所有的属性和方法。这是为什么可以引用名字属性和变量printPerson()方法（称为senior）的原因。</P>
<P>WhoIsOldest函数的另外一些特性为：</P>
<P>a.处理任何的People的数组。</P>
<P>b.处理任何对象类型的数组，这个数组有一个isOlder()方法。</P>
<P>如果不是使用JavaScript，换成其它类型的编程语言，你就不得不指定函数输入是一个People的数组，而在JavaScript就不用了。这正是JavaScript的一个优点。 </P></SPAN>]]></description>
<author>不才</author>
<pubDate>2008-10-23 11:35:00</pubDate>
</item>
<item>
<title><![CDATA[Javascript数组及其操作]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151409.html</link>
<description><![CDATA[<P style="TEXT-INDENT: 2em">本文介绍如下几个方面的内容:</P>
<P style="TEXT-INDENT: 2em">1.如何创建数组</P>
<P style="TEXT-INDENT: 2em">2.如何对数组进行操作（添加,删除,读取)</P>
<P style="TEXT-INDENT: 2em">3.数组常见方法和属性</P>
<P style="TEXT-INDENT: 2em">如何创建一个数组,一般地根据初始化设定简单分为3种:</P>
<P style="TEXT-INDENT: 2em">1.单纯创建数组:</P>
<P style="TEXT-INDENT: 2em">var arr=new Array();</P>
<P style="TEXT-INDENT: 2em">要点:用new关键字创建数组对象Array(),Array()对象是一个本地类,可以用new创建一个对象后使用</P>
<P style="TEXT-INDENT: 2em">2.创建数组的同时规定数组大小:</P>
<P style="TEXT-INDENT: 2em">var arr=new Array(10);//这里就创建了一个初始化大小为10的数组</P>
<P style="TEXT-INDENT: 2em">注意:当使用数组大小操作初始化大小时,数组会自动被撑大,不会像C语言那样发生错误.动态增长是js数组的一个性质.另外,js中支持最大数组长度为</P>
<P style="TEXT-INDENT: 2em">4294967295</P>
<P style="TEXT-INDENT: 2em">3.直接初始化:</P>
<P style="TEXT-INDENT: 2em">var arr=new Array("love","hate","pain");//这里就直接初始化了数组</P>
<P style="TEXT-INDENT: 2em">或var arr=["happy","cute","scare"];//括号也可以声明一个数组对象</P>
<P style="TEXT-INDENT: 2em">当然,类似C语言,可以定义2维3维和多维的数组,例如:</P>
<P style="TEXT-INDENT: 2em">&lt;script language=<A href="http://www.vipcn.com/InfoList/Catalog_251_1.html"><SPAN style="http://www.zhmy.com/COLOR: #1274ad">Java</SPAN></A>script&gt;</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var myArray = new Array();</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;10;i++ )...{</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i]=new Array();</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][0]=Math.floor(Math.random()*10); </P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][1]=Math.floor(Math.random()*10);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][2]=Math.floor(Math.random()*10);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][3]=Math.floor(Math.random()*10);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][4]=Math.floor(Math.random()*10);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][5]=Math.floor(Math.random()*10);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][6]=Math.floor(Math.random()*10);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][7]=Math.floor(Math.random()*10);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myArray[i][8]=Math.floor(Math.random()*10);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; }</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; </P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; myArray.sort( function(x, y) ...{</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (x[0]==y[0])?((x[4]==y[4])?(x[8]-y[8]):(x[4]-y[4])):(x[2]-y[2])</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; });</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;myArray.length;i++ )...{</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.write(myArray[i].join(",") + "&lt;br/&gt;");</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; }</P>
<P style="TEXT-INDENT: 2em">&lt;/script&gt;</P>
<P style="TEXT-INDENT: 2em">数组的属性:length</P>
<P style="TEXT-INDENT: 2em">arr.length返回数组arr的长度,常见于循环中对数组的遍历,比如:</P>
<P style="TEXT-INDENT: 2em">for(var i=0;i&lt;arr.length;i++){</P>
<P style="TEXT-INDENT: 2em">执行部分</P>
<P style="TEXT-INDENT: 2em">}</P>
<P style="TEXT-INDENT: 2em">数组元素的访问: arr[index],其中index表示索引即数组基数,从0开始,共有arr.length个元素.比如: arr[0]访问第一个数组元素,arr[1]访问第二个数组元素....依</P>
<P style="TEXT-INDENT: 2em">次类推 数组的操作方法:先概览下下面的这些操作数组常用的方法(13个)</P>
<P style="TEXT-INDENT: 2em">toString(),valueOf(),toLocalString(),join(),split(),slice(),concat(),</P>
<P style="TEXT-INDENT: 2em">pop(),push(),shift(),unshift(),sort(),splice()</P>
<P style="TEXT-INDENT: 2em">下面逐一分析这些方法的功能和用法.</P>
<P style="TEXT-INDENT: 2em">toString(),valueOf(),toLocalString():</P>
<P style="TEXT-INDENT: 2em">功能:返回数组的全部元素</P>
<P style="TEXT-INDENT: 2em">注:数组名也可以返回整个数组</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var m=["am","bm","cm"];//用括号声明一个数组对象</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m.toString());//toString()返回数组对象的所有内容,用逗号分割,即am,bm,cm</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m.valueOf());//valueOf()也返回数组对象的所有内容</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m.toLocaleString());//toLocaleString()也返回数组对象的所有内容,但有地区语言区别,暂不研究</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);//数组名也返回数组对象的所有内容</P>
<P style="TEXT-INDENT: 2em">join():</P>
<P style="TEXT-INDENT: 2em">功能:把数组各个项用某个字符(串)连接起来,但并不修改原来的数组</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var m=["am","bm","cm"];//用括号声明一个数组对象</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var n=m.join("---");//用---连接am,bm,cm.</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m.toString());//m并没有被修改,返回am,bm,cm</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(n);//n是一个字符串,为am---bm---cm</P>
<P style="TEXT-INDENT: 2em">split():</P>
<P style="TEXT-INDENT: 2em">功能:把一个字符串按某个字符(串)分割成一个数组,但不修改原字符串</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var str="I love maomao,I am caolvchong";</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var arr=str.split("o");//按字符o把str字符串分割成一个数组</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(arr);//输出整个数组</P>
<P style="TEXT-INDENT: 2em">slice():返回某个位置开始(到某个位置结束)的数组部分,不修改原数组</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var m=["am","bm","cm","dm","em","fm"];</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var n=m.slice(2);//返回第二个元素bm后面的元素,即cm,dm,em,fm</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var q=m.slice(2,5);//返回第二个元素后到第五个元素,即cm,dm,em</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(n);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(q);</P>
<P style="TEXT-INDENT: 2em">数组对象的栈操作:</P>
<P style="TEXT-INDENT: 2em">push():数组末尾添加一个项</P>
<P style="TEXT-INDENT: 2em">pop():删除数组最后一个项</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var m=["am","bm","cm","dm","em","fm"];</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; m.push("gm");//在数组末尾添加元素gm</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; m.pop();//删除数组最后一个元素gm</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);</P>
<P style="TEXT-INDENT: 2em">数组对象的队列操作:</P>
<P style="TEXT-INDENT: 2em">unshift():数组头添加一个项</P>
<P style="TEXT-INDENT: 2em">shift():删除数组第一个项</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var m=["am","bm","cm","dm","em","fm"];</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; m.unshift("gm");//在数组第一个元素位置添加元素gm</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; m.shift();//删除数组第一个元素gm</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);</P>
<P style="TEXT-INDENT: 2em">sort():数组按字符的ASCII码进行排序,修改数组对象</P>
<P style="TEXT-INDENT: 2em">注:即便是数字数组,也将转化为字符串来进行比较排序</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var m=["am","fm","gm","bm","em","dm"];</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; m.sort();//按字母序排序</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);</P>
<P style="TEXT-INDENT: 2em">concat():在数组尾添加元素,但不修改数组对象</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var m=["am","bm"]</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var n=m.concat("cm");//添加一项cm,并且赋予新数组对象</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);//原数组没有被修改</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(n);//输出新数组对象</P>
<P style="TEXT-INDENT: 2em">splice():在数组的任意位置进行添加,删除或者替换元素,直接修改数组对象</P>
<P style="TEXT-INDENT: 2em">细节:</P>
<P style="TEXT-INDENT: 2em">splice()有三个参数或三个以上参数,前两个是必须的,后面参数是可选的</P>
<P style="TEXT-INDENT: 2em">进行添加:splice(起始项,0,添加项)</P>
<P style="TEXT-INDENT: 2em">进行删除:splice(起始项,要删除的项个数)</P>
<P style="TEXT-INDENT: 2em">进行替换:splice(起始项,替换个数,替换项) 这个其实是添加删除的共同结果</P>
<P style="TEXT-INDENT: 2em">代码:</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; var m=["am","bm"]</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; m.splice(1,0,"fm","sm");//在第一项后面添加fm和sm,返回am,fm,sm,bm</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; m.splice(2,1);//删除第二项后面一项(即第三项sm,返回am,fm,bm)</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; m.splice(2,1,"mm");//替换第二项后面一项(即第三项,返回am,fm,mm)</P>
<P style="TEXT-INDENT: 2em">&nbsp;&nbsp;&nbsp; alert(m);</P>]]></description>
<author>不才</author>
<pubDate>2008-10-23 11:33:00</pubDate>
</item>
<item>
<title><![CDATA[SQL中case when then详细用法]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151345.html</link>
<description><![CDATA[<DIV id=art style="MARGIN: 15px">
<P><ACRONYM class=ACRONYM>SQL</ACRONYM> <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">CASE</SPAN></TT> 表达式是一种通用的条件表达式，类似于其它语言中的 if/else 语句。 </P><PRE class=SYNOPSIS>CASE WHEN <TT class=REPLACEABLE><I>condition</I></TT> THEN <TT class=REPLACEABLE><I>result</I></TT><BR>     [<SPAN class=OPTIONAL>WHEN ...</SPAN>]<BR>     [<SPAN class=OPTIONAL>ELSE <TT class=REPLACEABLE><I>result</I></TT></SPAN>]<BR>END</PRE>
<P><TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">CASE</SPAN></TT> 子句可以用于任何表达式可以有效存在的地方。 <TT class=REPLACEABLE><I><SPAN style="FONT-FAMILY: NSimsun">condition</SPAN></I></TT> 是一个返回<TT class=TYPE><SPAN style="FONT-FAMILY: NSimsun">boolean</SPAN></TT> 的表达式。 如果结果为真，那么 <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">CASE</SPAN></TT> 表达式的结果就是符合条件的 <TT class=REPLACEABLE><I><SPAN style="FONT-FAMILY: NSimsun">result</SPAN></I></TT>。 如果结果为假，那么以相同方式搜寻任何随后的 <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">WHEN</SPAN></TT> 子句。 如果没有 <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">WHEN</SPAN></TT> <TT class=REPLACEABLE><I><SPAN style="FONT-FAMILY: NSimsun">condition</SPAN></I></TT> 为真，那么 case 表达式的结果就是在 <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">ELSE</SPAN></TT> 子句里的值。 如果省略了 <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">ELSE</SPAN></TT> 子句而且没有匹配的条件， 结果为 NULL。 </P>
<P>例子： </P><PRE class=SCREEN>SELECT * FROM test;<BR><BR> a<BR>---<BR> 1<BR> 2<BR> 3<BR><BR><BR>SELECT a,<BR>       CASE WHEN a=1 THEN 'one'<BR>	    WHEN a=2 THEN 'two'<BR>	    ELSE 'other'<BR>       END<BR>    FROM test;<BR><BR> a | case<BR>---+-------<BR> 1 | one<BR> 2 | two<BR> 3 | other</PRE>
<P></P>
<P>所有 <TT class=REPLACEABLE><I><SPAN style="FONT-FAMILY: NSimsun">result</SPAN></I></TT> 表达式的数据的类型都必须可以转换成单一的输出类型。 </P>
<P>下面这个<SPAN class=QUOTE>"简单的"</SPAN> <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">CASE</SPAN></TT> 表达式是上面的通用形式的一个特殊的变种。 </P><PRE class=SYNOPSIS>CASE <TT class=REPLACEABLE><I>expression</I></TT><BR>    WHEN <TT class=REPLACEABLE><I>value</I></TT> THEN <TT class=REPLACEABLE><I>result</I></TT><BR>    [<SPAN class=OPTIONAL>WHEN ...</SPAN>]<BR>    [<SPAN class=OPTIONAL>ELSE <TT class=REPLACEABLE><I>result</I></TT></SPAN>]<BR>END</PRE>
<P>先计算 <TT class=REPLACEABLE><I><SPAN style="FONT-FAMILY: NSimsun">expression</SPAN></I></TT> 的值， 然后与所有在<TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">WHEN</SPAN></TT> 子句里声明的 <TT class=REPLACEABLE><I><SPAN style="FONT-FAMILY: NSimsun">value</SPAN></I></TT> 对比，直到找到一个相等的。 如果没有找到匹配的，则返回在 <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">ELSE</SPAN></TT> 子句里的 <TT class=REPLACEABLE><I><SPAN style="FONT-FAMILY: NSimsun">result</SPAN></I></TT> （或者 NULL）。 这个类似于 C 里的 <CODE class=FUNCTION><SPAN style="FONT-FAMILY: NSimsun">switch</SPAN></CODE> 语句。 </P>
<P>上面的例子可以用简单 <TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">CASE</SPAN></TT> 语法来写： </P><PRE class=SCREEN>SELECT a,<BR>       CASE a WHEN 1 THEN 'one'<BR>	      WHEN 2 THEN 'two'<BR>	      ELSE 'other'<BR>       END<BR>    FROM test;<BR><BR> a | case<BR>---+-------<BR> 1 | one<BR> 2 | two<BR> 3 | other</PRE>
<P></P>
<P><TT class=TOKEN><SPAN style="FONT-FAMILY: NSimsun">CASE</SPAN></TT> 表达式并不计算任何对于判断结果并不需要的子表达式。 比如，下面是一个可以避免被零除的方法： </P><PRE class=PROGRAMLISTING>SELECT ... WHERE CASE WHEN x &lt;&gt; 0 THEN y/x &gt; 1.5 ELSE false END;</PRE></DIV>]]></description>
<author>不才</author>
<pubDate>2008-10-20 17:26:00</pubDate>
</item>
<item>
<title><![CDATA[详细教你如何使用JSTL中的FN函数（function）]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151199.html</link>
<description><![CDATA[<DIV class=articleContent id=articleBody>
<DIV>
<P><SPAN style="FONT-SIZE: 12pt">在应用程序开发中,如果内容过长,想截取一定长度字符,然后补充</SPAN><SPAN style="FONT-SIZE: 12pt">"....."<BR>jstl1.1引入了一个fn.tld的标签,用于处理字符,如获得字符</SPAN><SPAN style="FONT-SIZE: 12pt">length,substring,indexof,endWith,lowcase<BR>实现截取字符串</SPAN><BR><SPAN style="FONT-SIZE: 12pt">如</SPAN><SPAN style="FONT-SIZE: 12pt">:<BR>&lt;c:set var="log.logTitle" value="做一个截取字符串长度的测试</SPAN><SPAN style="FONT-SIZE: 12pt">"<BR>&lt;c:choose&gt;<BR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&lt;c:when test="${fn:length(log.logTitle) &gt; 10}"&gt;<BR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&lt;c:out value="${fn:substring(log.logTitle, 0, 10)}......" /&gt;<BR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&lt;/c:when&gt;<BR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&lt;c:otherwise&gt;<BR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&lt;c:out value="${log.logTitle}" /&gt;<BR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&lt;/c:otherwise&gt;<BR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&lt;/c:choose&gt;</SPAN></P></DIV><STRONG><BR clear=all><BR></STRONG>
<P align=center><SPAN style="FONT-SIZE: 12pt"><STRONG>JSTL</STRONG><STRONG>与Struts的结合（八）</STRONG></SPAN></P>
<P align=center><A name=_Toc132021692></A><A name=_Toc132191857></A><A name=_Toc133394915></A><A name=_Toc133721064></A><A name=_Toc134092076><SPAN style="FONT-SIZE: 12pt">9.7&nbsp;<WBR> Functions</SPAN></A><SPAN style="FONT-SIZE: 12pt">标签库</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">称呼Functions标签库为标签库，倒不如称呼其为函数库来得更容易理解些。因为Functions标签库并没有提供传统的标签来为JSP页面的工作服务，而是被用于EL表达式语句中。在JSP2.0规范下出现的Functions标签库为EL表达式语句提供了许多更为有用的功能。Functions标签库分为两大类，共16个函数。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">?&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR> 长度函数：fn:length</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">?&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR> 字符串处理函数：fn:contains、fn:containsIgnoreCase、fn:endsWith、fn:escapeXml、fn:indexOf、fn:join、fn:replace、fn:split、fn:startsWith、fn:substring、fn:substringAfter、fn:substringBefore、fn:toLowerCase、fn:toUpperCase、fn:trim</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">以下是各个函数的用途和属性以及简单示例。</SPAN></P>
<P align=left><A name=_Toc133394916></A><A name=_Toc133721065></A><A name=_Toc134092077></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.1</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>长度函数fn:length函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">长度函数fn:length的出现有重要的意义。在JSTL1.0中，有一个功能被忽略了，那就是对集合的长度取值。虽然java.util.Collection接口定义了size方法，但是该方法不是一个标准的JavaBean属性方法（没有get,set方法），因此，无法通过EL表达式“${collection.size}”来轻松取得。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:length函数正是为了解决这个问题而被设计出来的。它的参数为input，将计算通过该属性传入的对象长度。该对象应该为集合类型或String类型。其返回结果是一个int类型的值。下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">&lt;%ArrayList arrayList1 = new ArrayList();</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR> arrayList1.add("aa");</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR> arrayList1.add("bb");</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR> arrayList1.add("cc");</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">%&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">&lt;%request.getSession().setAttribute("arrayList1", arrayList1);%&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:length(sessionScope.arrayList1)}</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">假设一个ArrayList类型的实例“arrayList1”，并为其添加三个字符串对象，使用fn:length函数后就可以取得返回结果为“3”。</SPAN></P>
<P align=left><A name=_Toc133394917></A><A name=_Toc133721066></A><A name=_Toc134092078></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.2</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>判断函数fn:contains函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:contains函数用来判断源字符串是否包含子字符串。它包括string和substring两个参数，它们都是String类型，分布表示源字符串和子字符串。其返回结果为一个boolean类型的值。下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:contains("ABC", "a")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:contains("ABC", "A")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">前者返回“false”，后者返回“true”。</SPAN></P>
<P align=left><A name=_Toc133394918></A><A name=_Toc133721067></A><A name=_Toc134092079></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.3</STRONG><STRONG>&nbsp;<WBR> fn:containsIgnoreCase</STRONG><STRONG>函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:containsIgnoreCase函数与fn:contains函数的功能差不多，唯一的区别是fn:containsIgnoreCase函数对于子字符串的包含比较将忽略大小写。它与fn:contains函数相同，包括string和substring两个参数，并返回一个boolean类型的值。下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:containsIgnoreCase("ABC", "a")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:containsIgnoreCase("ABC", "A")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">前者和后者都会返回“true”。</SPAN></P>
<P align=left><A name=_Toc133394919></A><A name=_Toc133721068></A><A name=_Toc134092080></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.4</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>词头判断函数fn:startsWith函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:startsWith函数用来判断源字符串是否符合一连串的特定词头。它除了包含一个string参数外，还包含一个subffx参数，表示词头字符串，同样是String类型。该函数返回一个boolean类型的值。下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:startsWith ("ABC", "ab")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:startsWith ("ABC", "AB")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">前者返回“false”，后者返回“true”。</SPAN></P>
<P align=left><A name=_Toc133394920></A><A name=_Toc133721069></A><A name=_Toc134092081></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.5</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>词尾判断函数fn:endsWith函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:endsWith函数用来判断源字符串是否符合一连串的特定词尾。它与fn:startsWith函数相同，包括string和subffx两个参数，并返回一个boolean类型的值。下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:endsWith("ABC", "bc")}&lt;br&gt;&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR> ${fn:endsWith("ABC", "BC")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">前者返回“false”，后者返回“true”。</SPAN></P>
<P align=left><A name=_Toc133394921></A><A name=_Toc133721070></A><A name=_Toc134092082></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.6</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>字符实体转换函数fn:escapeXml函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:escapeXml函数用于将所有特殊字符转化为字符实体码。它只包含一个string参数，返回一个String类型的值。</SPAN><A name=_Toc133394922></A><A name=_Toc133721071></A></P>
<P align=left><A name=_Toc134092083></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.8</STRONG><STRONG>&nbsp;<WBR></STRONG></SPAN> <SPAN style="FONT-SIZE: 12pt"><STRONG>字符匹配函数fn:indexOf函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:indexOf函数用于取得子字符串与源字符串匹配的开始位置，若子字符串与源字符串中的内容没有匹配成功将返回“-1”。它包括string和substring两个参数，返回结果为int类型。下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:indexOf("ABCD","aBC")}&lt;br&gt;&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR>&nbsp;<WBR> ${fn:indexOf("ABCD","BC")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">前者由于没有匹配成功，所以返回-1，后者匹配成功将返回位置的下标，为1。</SPAN></P>
<P align=left><A name=_Toc133394923></A><A name=_Toc133721072></A><A name=_Toc134092084></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.9</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>分隔符函数fn:join函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:join函数允许为一个字符串数组中的每一个字符串加上分隔符，并连接起来。它的参数、返回结果和描述如表9.25所示：</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">表9.25　fn:join函数</SPAN></P>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width=281 border=1>
<TBODY>
<TR>
<TD width=65>
<P align=left><SPAN style="FONT-SIZE: 12pt">参数</SPAN></P></TD>
<TD width=216>
<P align=left><SPAN style="FONT-SIZE: 12pt">描述</SPAN></P></TD></TR>
<TR>
<TD width=65>
<P align=left><SPAN style="FONT-SIZE: 12pt">array</SPAN></P></TD>
<TD width=216>
<P align=left><SPAN style="FONT-SIZE: 12pt">字符串数组。其类型必须为String[]类型</SPAN></P></TD></TR>
<TR>
<TD width=65>
<P align=left><SPAN style="FONT-SIZE: 12pt">separator</SPAN></P></TD>
<TD width=216>
<P align=left><SPAN style="FONT-SIZE: 12pt">分隔符。其类型必须为String类型</SPAN></P></TD></TR>
<TR>
<TD width=65>
<P align=left><SPAN style="FONT-SIZE: 12pt">返回结果</SPAN></P></TD>
<TD width=216>
<P align=left><SPAN style="FONT-SIZE: 12pt">返回一个String类型的值</SPAN></P></TD></TR></TBODY></TABLE></DIV>
<P align=left><SPAN style="FONT-SIZE: 12pt">下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">&lt;% String[] stringArray = {"a","b","c"}; %&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">&lt;%request.getSession().setAttribute("stringArray", stringArray);%&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:join(sessionScope.stringArray,";")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">定义数组并放置到Session中，然后通过Session得到该字符串数组，使用fn:join函数并传入分隔符“;”，得到的结果为“a;b;c”。</SPAN></P>
<P align=left><A name=_Toc133394924></A><A name=_Toc133721073></A><A name=_Toc134092085></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.10</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>替换函数fn:replace函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:replace函数允许为源字符串做替换的工作。它的参数、返回结果和描述如表9.26所示：</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">表9.26　 fn:replace函数</SPAN></P>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width=353 border=1>
<TBODY>
<TR>
<TD width=105>
<P align=left><SPAN style="FONT-SIZE: 12pt">参数</SPAN></P></TD>
<TD width=249>
<P align=left><SPAN style="FONT-SIZE: 12pt">描述</SPAN></P></TD></TR>
<TR>
<TD width=105>
<P align=left><SPAN style="FONT-SIZE: 12pt">inputString</SPAN></P></TD>
<TD width=249>
<P align=left><SPAN style="FONT-SIZE: 12pt">源字符串。其类型必须为String类型</SPAN></P></TD></TR>
<TR>
<TD width=105>
<P align=left><SPAN style="FONT-SIZE: 12pt">beforeSubstring</SPAN></P></TD>
<TD width=249>
<P align=left><SPAN style="FONT-SIZE: 12pt">指定被替换字符串。其类型必须为String类型</SPAN></P></TD></TR>
<TR>
<TD width=105>
<P align=left><SPAN style="FONT-SIZE: 12pt">afterSubstring</SPAN></P></TD>
<TD width=249>
<P align=left><SPAN style="FONT-SIZE: 12pt">指定替换字符串。其类型必须为String类型</SPAN></P></TD></TR>
<TR>
<TD width=105>
<P align=left><SPAN style="FONT-SIZE: 12pt">返回结果</SPAN></P></TD>
<TD width=249>
<P align=left><SPAN style="FONT-SIZE: 12pt">返回一个String类型的值</SPAN></P></TD></TR></TBODY></TABLE></DIV>
<P align=left><SPAN style="FONT-SIZE: 12pt">下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:replace("ABC","A","B")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">将“ABC”字符串替换为“BBC”，在“ABC”字符串中用“B”替换了“A”。</SPAN></P>
<P align=left><A name=_Toc133394925></A><A name=_Toc133721074></A><A name=_Toc134092086></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.11</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>分隔符转换数组函数fn:split函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:split函数用于将一组由分隔符分隔的字符串转换成字符串数组。它的参数、返回结果和描述如表9.27所示：</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">表9.27　 fn:split函数</SPAN></P>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width=281 border=1>
<TBODY>
<TR>
<TD width=65>
<P align=left><SPAN style="FONT-SIZE: 12pt">参数</SPAN></P></TD>
<TD width=216>
<P align=left><SPAN style="FONT-SIZE: 12pt">描述</SPAN></P></TD></TR>
<TR>
<TD width=65>
<P align=left><SPAN style="FONT-SIZE: 12pt">string</SPAN></P></TD>
<TD width=216>
<P align=left><SPAN style="FONT-SIZE: 12pt">源字符串。其类型必须为String类型</SPAN></P></TD></TR>
<TR>
<TD width=65>
<P align=left><SPAN style="FONT-SIZE: 12pt">delimiters</SPAN></P></TD>
<TD width=216>
<P align=left><SPAN style="FONT-SIZE: 12pt">指定分隔符。其类型必须为String类型</SPAN></P></TD></TR>
<TR>
<TD width=65>
<P align=left><SPAN style="FONT-SIZE: 12pt">返回结果</SPAN></P></TD>
<TD width=216>
<P align=left><SPAN style="FONT-SIZE: 12pt">返回一个String[]类型的值</SPAN></P></TD></TR></TBODY></TABLE></DIV>
<P align=left><SPAN style="FONT-SIZE: 12pt">下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:split("A,B,C",",")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">将“A,B,C”字符串转换为数组{A,B,C}。</SPAN></P>
<P align=left><A name=_Toc133394926></A><A name=_Toc133721075></A><A name=_Toc134092087></A><SPAN style="FONT-SIZE: 12pt"><STRONG>9.7.12</STRONG><STRONG>&nbsp;<WBR></STRONG> <STRONG>字符串截取函数fn:substring函数</STRONG></SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">fn:substring函数用于截取字符串。它的参数、返回结果和描述如表9.28所示：</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">表9.28　 fn:substring函数</SPAN></P>
<DIV align=center>
<TABLE cellSpacing=0 cellPadding=0 width=353 border=1>
<TBODY>
<TR>
<TD width=68>
<P align=left><SPAN style="FONT-SIZE: 12pt">参数</SPAN></P></TD>
<TD width=285>
<P align=left><SPAN style="FONT-SIZE: 12pt">描述</SPAN></P></TD></TR>
<TR>
<TD width=68>
<P align=left><SPAN style="FONT-SIZE: 12pt">string</SPAN></P></TD>
<TD width=285>
<P align=left><SPAN style="FONT-SIZE: 12pt">源字符串。其类型必须为String类型</SPAN></P></TD></TR>
<TR>
<TD width=68>
<P align=left><SPAN style="FONT-SIZE: 12pt">beginIndex</SPAN></P></TD>
<TD width=285>
<P align=left><SPAN style="FONT-SIZE: 12pt">指定起始下标（值从0开始）。其类型必须为int类型</SPAN></P></TD></TR>
<TR>
<TD width=68>
<P align=left><SPAN style="FONT-SIZE: 12pt">endIndex</SPAN></P></TD>
<TD width=285>
<P align=left><SPAN style="FONT-SIZE: 12pt">指定结束下标（值从0开始）。其类型必须为int类型</SPAN></P></TD></TR>
<TR>
<TD width=68>
<P align=left><SPAN style="FONT-SIZE: 12pt">返回结果</SPAN></P></TD>
<TD width=285>
<P align=left><SPAN style="FONT-SIZE: 12pt">返回一个String类型的值</SPAN></P></TD></TR></TBODY></TABLE></DIV>
<P align=left><SPAN style="FONT-SIZE: 12pt">下面看一个示例。</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">${fn:substring("ABC","1","2")}&lt;br&gt;</SPAN></P>
<P align=left><SPAN style="FONT-SIZE: 12pt">截取结果为“B”。</SPAN></P></DIV>]]></description>
<author>不才</author>
<pubDate>2008-10-10 11:49:00</pubDate>
</item>
<item>
<title><![CDATA[JSTL中的 处理显示字符串FN函数（function）]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151198.html</link>
<description><![CDATA[<TABLE cellSpacing=0 cellPadding=4 align=center border=1>
<TBODY>
<TR>
<TD height=24>
<P align=center><STRONG>函数</STRONG> <STRONG></STRONG></P></TD>
<TD>
<P align=center><STRONG>描述</STRONG> <STRONG></STRONG></P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:contains(string, substring)</P></TD>
<TD>
<P>如果参数string中包含参数substring，返回true</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:containsIgnoreCase(string, substring)</P></TD>
<TD>
<P>如果参数string中包含参数substring（忽略大小写），返回true</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:endsWith(string, suffix)</P></TD>
<TD>
<P>如果参数 string 以参数suffix结尾，返回true</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:escapeXml(string)</P></TD>
<TD>
<P>将有特殊意义的XML (和HTML)转换为对应的XML character entity code，并返回</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:indexOf(string, substring)</P></TD>
<TD>
<P>返回参数substring在参数string中第一次出现的位置</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:join(array, separator)</P></TD>
<TD>
<P>将一个给定的数组array用给定的间隔符separator串在一起，组成一个新的字符串并返回。</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:length(item)</P></TD>
<TD>
<P>返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:replace(string, before, after)</P></TD>
<TD vAlign=top>
<P>返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方，并返回替换后的结果</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:split(string, separator)</P></TD>
<TD>
<P>返回一个数组，以参数separator 为分割符分割参数string，分割后的每一部分就是数组的一个元素</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:startsWith(string, prefix)</P></TD>
<TD>
<P>如果参数string以参数prefix开头，返回true</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:substring(string, begin, end)</P></TD>
<TD>
<P>返回参数string部分字符串, 从参数begin开始到参数end位置，包括end位置的字符</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:substringAfter(string, substring)</P></TD>
<TD>
<P>返回参数substring在参数string中后面的那一部分字符串</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:substringBefore(string, substring)</P></TD>
<TD>
<P>返回参数substring在参数string中前面的那一部分字符串</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:toLowerCase(string)</P></TD>
<TD>
<P>将参数string所有的字符变为小写，并将其返回</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:toUpperCase(string)</P></TD>
<TD>
<P>将参数string所有的字符变为大写，并将其返回</P></TD></TR>
<TR>
<TD vAlign=top height=24>
<P>fn:trim(string)</P></TD>
<TD>
<P>去除参数string 首尾的空格，并将其返回</P></TD></TR></TBODY></TABLE>]]></description>
<author>不才</author>
<pubDate>2008-10-10 11:46:00</pubDate>
</item>
<item>
<title><![CDATA[详解行列互换的SQL问题 报表横向纵向排列 union join]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151184.html</link>
<description><![CDATA[<P><STRONG>表A Employee</STRONG></P>
<P><STRONG>no&nbsp;&nbsp;&nbsp;&nbsp; Name<BR>--------------------<BR>001&nbsp;&nbsp;&nbsp;&nbsp; jack<BR>002&nbsp;&nbsp;&nbsp; Mike</STRONG></P>
<P><STRONG>表B Manager</STRONG></P>
<P><STRONG>no&nbsp;&nbsp;&nbsp;&nbsp; Name<BR>--------------------<BR>001&nbsp;&nbsp;&nbsp;&nbsp; Lily<BR>002&nbsp;&nbsp;&nbsp; Jordon</STRONG></P>
<P><STRONG><SPAN style="COLOR: #ff6600">纵向连接 用union</SPAN><BR>select no,name from employee<BR>union<BR>select no,name from manager<BR>结果<BR><STRONG>no&nbsp;&nbsp;&nbsp;&nbsp; Name<BR>--------------------<BR>001&nbsp;&nbsp;&nbsp;&nbsp; jack<BR>002&nbsp;&nbsp;&nbsp; Mike<BR></STRONG><STRONG>001&nbsp;&nbsp;&nbsp;&nbsp; Lily<BR>002&nbsp;&nbsp;&nbsp; Jordon</STRONG></STRONG> 
<P><STRONG><SPAN style="COLOR: #ff0000">横向连接 join</SPAN><BR>如果要求报表格式<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 员工&nbsp;&nbsp; 经理<BR>人数</STRONG></P>
<P><STRONG>select * from <BR>(select count(*),'1' as no from employee) ta&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --添加一个字段no 用于join...on...中的on<BR>full join<BR>(select count(*),'1' as no from employee) tb<BR>on ta.no=tb.no</STRONG></P>
<P></P>
<P><STRONG>行列转换实例<BR></STRONG>　　表ttt有三个字段<BR>　　seq　--序列<BR>　　jcxm --检查项目<BR>　　zhi　--值<BR>　　<BR>　　数据分别如下：<BR>　　seq　　　jcxm　　　　 zhi<BR>　　-------　　　--------　　　　　--------<BR>　　11　　　　　1　　　　0.50<BR>　　11　　　　　2　　　　0.21<BR>　　11　　　　　3　　　　0.25<BR>　　12　　　　　1　　　　0.24<BR>　　12　　　　　2　　　　0.30<BR>　　12　　　　　3　　　　0.22<BR>　　<BR>　　<STRONG>实现功能</STRONG><BR>　　创建视图时移动行值为列值<BR>　　<BR>　　create view v_view1<BR>　　as<BR>　　select seq,<BR>　　sum(decode(jcxm,1, zhi)) 检测项目1,<BR>　　sum(decode(jcxm,2, zhi)) 检测项目2,<BR>　　sum(decode(jcxm,3, zhi)) 检测项目3<BR>　　from ttt<BR>　　group by seq;<BR>　　<BR>　　序号 检测项目1　　检测项目2　　检测项目3<BR>　　11　　　　　0.50　　　　0.21　　　　　0.25<BR>　　12　　　　　0.24　　　　0.30　　　　　0.22<BR>　　<BR>　　<STRONG>技巧：</STRONG><BR>　　用THEN中的0和1来进行统计（SUM）<BR>　　<BR>　　jcxm　 zhi<BR>　　----　 ----<BR>　　a　　　　　 1<BR>　　b　　　　　 1<BR>　　a　　　　　 3</P>
<DIV class=Qga248>bbs.bitsCN.com中国网管论坛</DIV><BR>　　d　　　　　 2<BR>　　e　　　　　 4<BR>　　f　　　　　 5<BR>　　a　　　　　 5<BR>　　d　　　　　 3<BR>　　d　　　　　 6<BR>　　b　　　　　 5<BR>　　c　　　　　 4<BR>　　b　　　　　 3<BR>　　求他的zhi既是1，也是3，也是5的jcxm<BR>　　方法一<BR>　　select jcxm<BR>　　from ttt<BR>　　group by jcxm<BR>　　having sum(decode(zhi,1,-1,3,-1,5,-1,0)) = -3<BR>　　方法二<BR>　　select jcxm from ttt<BR>　　group by jcxm having (sign(sum(decode(zhi,1,-1,0)))+<BR>　　sign(sum(decode(zhi,3,-1,0)))+sign(sum(decode(zhi,5,-1,0)))&lt;=-3);<BR>　　<BR>　　----------<BR>　　a<BR>　　b<BR>　　说明：<BR>　　sign()函数根据某个值是0、正数还是负数，分别返回0、1、-1<BR>　　所以可以用sign和decode来完成比较字段大小来区某个字段<BR>　　select decode(sign(字段1-字段2),-1,字段3,字段4) from dual;<BR>　　<BR>　　sign是一个对于写分析SQL有很强大的功能<BR>　　下面我对sign进行一些总结：<BR>　　但属性student取0和1以外的值，或者student取两个以上的标法值，问题就不会这么简单了<BR>　　解决办法就是特征函数（abs(),sign()）<BR>　　<BR>　　常用的特征算法 <SPAN class=Qga248>bbs.bitsCN.com中国网管论坛</SPAN> <BR>　　［A＝B］＝1－abs（sign（A－B））<BR>　　［A！＝B］＝abs（sign（A－B））<BR>　　［A&lt;B］＝1－sign（1＋sign（A－B）） 不能用-sign（A－B）：因为如果不满足A　　［A&lt;＝B］＝sign(1－sign（A－B））<BR>　　［A&gt;B］＝1－sign（1－sign（A－B））<BR>　　［A&gt;＝B］＝sign(1＋sign（A－B））)<BR>　　［NOTα］＝1－d ［α］<BR>　　［αANDb ］＝d ［α］*d ［b ］ (6)<BR>　　［αOR b ］＝sign（d ［α］＋d [b ]）<BR>　　<BR>　　例如：<BR>　　A&lt;B　　　　　　　　　　　　 Decode( Sign(A-B), -1, 1, 0 )<BR>　　A&lt;=B　　　　　　　　　　　　 Decode( Sign(A-B), 1, 0, 1 )<BR>　　A&gt;B　　　　　　　　　　　　 Decode( Sign(A-B), 1, 1, 0 )<BR>　　A&gt;=B　　　　　　　　　　　　 Decode( Sign(A-B), -1, 0, 1 )<BR>　　A=B　　　　　　　　　　　　 Decode( A, B, 1, 0 )<BR>　　A between B and C　　　Decode( Sign(A-B), -1, 0, Decode(Sign(A-C), 1, 0, 1 ))<BR>　　A is null　　　　　　　　　　　 Decode(A,null,1,0)<BR>　　A is not null　　　　　　　　 Decode(A,null,0,1)　　　　 A in (B1,B2,...,Bn)　Decode(A,B1,1,B2,1,...,Bn,1,0) <SPAN style="COLOR: #fafafd">BBS.bitsCN.com网管论坛</SPAN> <BR>　　nor LogA　　　　　　　　　　Decode( LogA, 0, 1, 0 )　　　　　　　(1-Sign(LogA))<BR>　　LogA and LogB　　　　　　LogA * LogB<BR>　　LogA or LogB　　　　　　　LogA + LogB<BR>　　LogA xor LogB　　　　　　Decode(Sign(LogA),Sign(LogB),0,1)<BR>　　Mod(Sign(LogA),Sign(LogB),2<BR>　　<BR>　　&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<BR>　　<BR>　　另外一个关于成绩的分析例子<BR>　　<BR>　　SELECT<BR>　　SUM(CASE WHEN cj &lt;60 THEN 1 ELSE 0 END) as "not passed",<BR>　　SUM(CASE WHEN cj BETWEEN 60 AND 79 THEN 1 ELSE 0 END) as "passed",<BR>　　SUM(CASE WHEN cj BETWEEN 80 AND 89 THEN 1 ELSE 0 END) as "good",<BR>　　SUM(CASE WHEN cj &gt;=90 THEN 1 ELSE 0 END) as "Excellent"<BR>　　FROM cjtable;<BR>　　<BR>　　decode用法2<BR>　　表、视图结构转化<BR>　　现有一个商品销售表sale，表结构为：<BR>　　month　　　 char(6)　　　　　 --月份<BR>　　sell　　　　number(10,2)　　　 --月销售金额<BR>　　<BR>　　现有数据为：<BR>　　200001　　1000<BR>　　200002　　1100<BR>　　200003　　1200<BR>　　200004　　1300<BR>　　200005　　1400 <SPAN class=Qga248>BBS.bitsCN.com网管论坛</SPAN> <BR>　　200006　　1500<BR>　　200007　　1600<BR>　　200101　　1100<BR>　　200202　　1200<BR>　　200301　　1300<BR>　　<BR>　　想要转化为以下结构的数据：<BR>　　year　　　char(4)　　　　　　　 --年份<BR>　　------------　 ---------------------<BR>　　month1　　number(10,2)　　　--1月销售金额<BR>　　month2　　number(10,2)　　　--2月销售金额<BR>　　month3　　number(10,2)　　　--3月销售金额<BR>　　month4　　number(10,2)　　　--4月销售金额<BR>　　month5　　number(10,2)　　　--5月销售金额<BR>　　month6　　number(10,2)　　　--6月销售金额<BR>　　month7　　number(10,2)　　　--7月销售金额<BR>　　month8　　number(10,2)　　　--8月销售金额<BR>　　month9　　number(10,2)　　　--9月销售金额<BR>　　month10　 number(10,2)　　　--10月销售金额<BR>　　month11　 number(10,2)　　　--11月销售金额<BR>　　month12　 number(10,2)　　　--12月销售金额<BR>　　<BR>　　结构转化的SQL语句为：<BR>　　create or replace view<BR>　　v_sale(year,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)<BR>　　as<BR>　　select 
<DIV class=Qga248>bitsCN.nET*中国网管博客</DIV><BR>　　substrb(month,1,4),<BR>　　sum(decode(substrb(month,5,2),'01',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'02',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'03',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'04',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'05',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'06',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'07',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'08',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'09',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'10',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'11',sell,0)),<BR>　　sum(decode(substrb(month,5,2),'12',sell,0))<BR>　　from sale<BR>　　group by substrb(month,1,4);<BR>　　<BR>　　体会：要用decode /group by/ order by/sign/sum来实现不同报表的生成<BR>　　&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<BR>　　CASE应用<BR>　　<BR>　　1　　　　1　　　　部门a　　　　800　　　　男<BR>　　2　　　　2　　　　部门b　　　　900　　　　女<BR>　　3　　　　3　　　　部门a　　　　400　　　　男 
<DIV class=Qga248>BBS.bitsCN.com网管论坛</DIV><BR>　　4　　　　4　　　　部门d　　　　1400　　　 女<BR>　　5　　　　5　　　　部门e　　　　1200　　　 男<BR>　　6　　　　6　　　　部门f　　　　500　　　　男<BR>　　7　　　　7　　　　部门a　　　　300　　　　女<BR>　　8　　　　8　　　　部门d　　　　1000　　　 男<BR>　　9　　　　9　　　　部门d　　　　1230　　　 女<BR>　　10　　　 10　　　　部门b　　　 2000　　　 女<BR>　　11　　　 11　　　　部门c　　　 2000　　　 男<BR>　　12　　　 12　　　　部门b　　　 1200　　　 男<BR>　　<BR>　　SELECT jcxm as 部门,COUNT(seq) as 人数,<BR>　　SUM(CASE SEX WHEN 1 THEN 1 ELSE 0 END) as 男,<BR>　　SUM(CASE SEX WHEN 2 THEN 1 ELSE 0 END) as 女,<BR>　　SUM(CASE SIGN(zhi-800) WHEN -1 THEN 1 ELSE 0 END) as 小于800元,<BR>　　SUM((CASE SIGN(zhi-800)*SIGN(zhi-1000)　　　　　　　　　　/*用*来实现&lt;和&gt;功能*/<BR>　　WHEN -1 THEN 1 ELSE 0 END)+(CASE zhi<BR>　　WHEN 800　THEN 1 ELSE 0 END)) as 从800至999,　　　　 /*注意别名不能以数字开头*/<BR>　　SUM((CASE SIGN(zhi-1000)*SIGN(zhi-1200)<BR>　　WHEN -1 THEN 1 ELSE 0 END)+(CASE zhi<BR>　　WHEN 1000 THEN 1 ELSE 0 END)) as 从1000元至1199元, <SPAN class=Qga248>[bitsCN.Com]</SPAN> <BR>　　SUM((CASE SIGN(zhi-1200) WHEN 1 THEN 1 ELSE 0 END)<BR>　　+(CASE zhi WHEN 1200 THEN 1 ELSE 0 END)) as 大于1200元<BR>　　FroM ttt<BR>　　GROUP BY jcxm<BR>　　<BR>　　部门名 人数　　男　　女　 小于800元 从800至999 从1000元至1199元　 大于1200元<BR>　　部门a　3　　　　2　　1　　　　2　　　　1　　　　　 0　　　　　　　　0<BR>　　部门b　3　　　　1　　2　　　　0　　　　1　　　　　 0　　　　　　　　2<BR>　　部门c　1　　　　1　　0　　　　0　　　　0　　　　　 0　　　　　　　　1<BR>　　部门d　3　　　　1　　2　　　　0　　　　0　　　　　 1　　　　　　　　2<BR>　　部门e　1　　　　1　　0　　　　0　　　　0　　　　　 0　　　　　　　　1<BR>　　部门f　1　　　　1　　0　　　　1　　　　0　　　　　 0]]></description>
<author>不才</author>
<pubDate>2008-10-9 9:20:00</pubDate>
</item>
<item>
<title><![CDATA[对JSP页面传值中文乱码简单解决方法]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151052.html</link>
<description><![CDATA[<TABLE class=blog-content>
<TBODY>
<TR>
<TD>
<P>源代码，a.jsp往b.jsp传值： <BR>a.jsp页面内容： <BR><BR>
<TABLE style="BORDER-RIGHT: #d4eff7 1px solid; BORDER-TOP: #d4eff7 1px solid; BORDER-LEFT: #d4eff7 1px solid; WIDTH: 400px; BORDER-BOTTOM: #d4eff7 1px solid">
<TBODY>
<TR class=tr3>
<TD>[pre]&lt;%@ page language="java" import="java.util.*" pageEncoding="GB2312"%&gt;&lt;form action="b.jsp"&gt; &nbsp; name:&lt;input type=text name=name&gt; &nbsp; &lt;input type=submit&gt;&lt;/form&gt;[/pre]</TD></TR></TBODY></TABLE>b.jsp页面内容： <BR><BR>
<TABLE style="BORDER-RIGHT: #d4eff7 1px solid; BORDER-TOP: #d4eff7 1px solid; BORDER-LEFT: #d4eff7 1px solid; WIDTH: 400px; BORDER-BOTTOM: #d4eff7 1px solid">
<TBODY>
<TR class=tr3>
<TD>[pre]&lt;%@ page language="java" import="java.util.*" pageEncoding="GB2312"%&gt;&lt;% String name=request.getParameter("name");%&gt;&lt;body&gt; &nbsp; &lt;%=name%&gt;&lt;/body&gt;[/pre]</TD></TR></TBODY></TABLE>现象：中文乱码,比如“？？？？？？” <BR>解决方法如下： <BR><B>方法一：</B> <BR>1. 在b.jsp中把pageEncoding="GB2312"改为pageEncoding="ISO8859-1" <BR>虽然这样b.jsp页面显示的内容还是乱码，但是不是那种“？？？？？？”的乱码，而是一些特殊字符 <BR>2. 然后在浏览器中查看菜单中修改成GB2312的编码，这时乱码就显示中文了。 <BR>3. 但是这种方法是不可行的。 <BR><B>方法二：</B> <BR>1. 在b.jsp中把String name=request.getParameter("name");修改为 <BR>String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"GB2312"); <BR>2. 这时再在页面上显示，则就是中文了。 <BR><B>方法三：</B> <BR>1. 有人说修改get/post的传值方式,但是这是有前提的,如果只是把get方式修改成post方式,页面结果还是乱码! <BR>2. 前提你必须配置了过滤器,若果你只是配置了过滤器,则传值方式必须是:post方式才不是乱码,如果是get方式照样是乱码! <BR>3. 过滤器的配置,我想大家都能有,我就不说了 <BR><B>方法四:</B> <BR>1. 有人说配置tomcat的配置文件server.xml里这句： <BR><BR>
<TABLE style="BORDER-RIGHT: #d4eff7 1px solid; BORDER-TOP: #d4eff7 1px solid; BORDER-LEFT: #d4eff7 1px solid; WIDTH: 400px; BORDER-BOTTOM: #d4eff7 1px solid">
<TBODY>
<TR class=tr3>
<TD>[pre]&lt;Connector URIEncoding="GB2312" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; port="8080" maxHttpHeaderSize="8192" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; enableLookups="false" redirectPort="8443" acceptCount="100" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; connectionTimeout="20000" disableUploadTimeout="true" /&gt;[/pre]</TD></TR></TBODY></TABLE>加上这句：URIEncoding="GB2312" <BR>2. 虽然可以但是有前提的,若果你过滤器没有配置,则只是配置了server.xml文件,这样只有在表单是get传值时候才可以!当是post方式时,照样是乱码! <BR>*这时我们就可以看出在tomcat5中的post与get传值方式是不一样的* <BR>*有人要问有没有一种方法让传值使用get方式或post方式都好用呢,下面就是我推荐的方法五* <BR><B>方法五:</B> <BR>1. 其实很简单,就是同时实现方法三又实现方法四! <BR>2. 就是先配置过滤器,又配置server.xml文件,都设置成GB2312的编码 <BR>3. 这样无论是post还是get方式的表单传值,中文都不会是乱码! </P></TD></TR></TBODY></TABLE>]]></description>
<author>不才</author>
<pubDate>2008-9-28 14:53:00</pubDate>
</item>
<item>
<title><![CDATA[oracle to_date 说明]]></title>
<link>http://liguocai.zhmy.com/archives/2008/151042.html</link>
<description><![CDATA[<SPAN class=tpc_content>日期格式参数 含义说明 &nbsp;<WBR><BR>D 一周中的星期几 &nbsp;<WBR><BR>DAY 天的名字，使用空格填充到9个字符 &nbsp;<WBR><BR>DD 月中的第几天 &nbsp;<WBR><BR>DDD 年中的第几天 &nbsp;<WBR><BR>DY 天的简写名 &nbsp;<WBR><BR>IW ISO标准的年中的第几周 &nbsp;<WBR><BR>IYYY ISO标准的四位年份 &nbsp;<WBR><BR>YYYY 四位年份 &nbsp;<WBR><BR>YYY,YY,Y 年份的最后三位，两位，一位 &nbsp;<WBR><BR>HH 小时，按12小时计 &nbsp;<WBR><BR>HH24 小时，按24小时计 &nbsp;<WBR><BR>MI 分 &nbsp;<WBR><BR>SS 秒 &nbsp;<WBR><BR>MM 月 &nbsp;<WBR><BR>Mon 月份的简写 &nbsp;<WBR><BR>Month 月份的全名 &nbsp;<WBR><BR>W 该月的第几个星期 &nbsp;<WBR><BR>WW 年中的第几个星期<BR><BR>&nbsp;<WBR> 1.日期时间间隔操作 &nbsp;<WBR><BR>　　当前时间减去7分钟的时间 &nbsp;<WBR><BR>　　select sysdate,sysdate - interval ’7’ MINUTE from dual &nbsp;<WBR><BR>　　当前时间减去7小时的时间 &nbsp;<WBR><BR>　　select sysdate - interval ’7’ hour from dual &nbsp;<WBR><BR>　　当前时间减去7天的时间 &nbsp;<WBR><BR>　　select sysdate - interval ’7’ day from dual &nbsp;<WBR><BR>　　当前时间减去7月的时间 &nbsp;<WBR><BR>　　select sysdate,sysdate - interval ’7’ month from dual &nbsp;<WBR><BR>　　当前时间减去7年的时间 &nbsp;<WBR><BR>　　select sysdate,sysdate - interval ’7’ year from dual &nbsp;<WBR><BR>　　时间间隔乘以一个数字 &nbsp;<WBR><BR>　　select sysdate,sysdate - 8 *interval ’2’ hour from dual &nbsp;<WBR><BR>&nbsp;<WBR> 2.日期到字符操作 &nbsp;<WBR><BR>　　select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual &nbsp;<WBR><BR>　　select sysdate,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’) from dual &nbsp;<WBR><BR>　　select sysdate,to_char(sysdate,’yyyy-ddd hh:mi:ss’) from dual &nbsp;<WBR><BR>　　select sysdate,to_char(sysdate,’yyyy-mm iw-d hh:mi:ss’) from dual &nbsp;<WBR><BR>　　参考oracle的相关关文档(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515) &nbsp;<WBR><BR>&nbsp;<WBR> 3. 字符到日期操作 &nbsp;<WBR><BR>　　select to_date(’2003-10-17 21:15:37’,’yyyy-mm-dd hh24:mi:ss’) from dual &nbsp;<WBR><BR>　　具体用法和上面的to_char差不多。 &nbsp;<WBR><BR>&nbsp;<WBR> 4. trunk/ ROUND函数的使用 &nbsp;<WBR><BR>　　select trunc(sysdate ,’YEAR’) from dual &nbsp;<WBR><BR>　　select trunc(sysdate ) from dual &nbsp;<WBR><BR>　　select to_char(trunc(sysdate ,’YYYY’),’YYYY’) from dual &nbsp;<WBR><BR>&nbsp;<WBR> 5.oracle有毫秒级的数据类型 &nbsp;<WBR><BR>　　--返回当前时间 年月日小时分秒毫秒 &nbsp;<WBR><BR>　　select to_char(current_timestamp(5),’DD-MON-YYYY HH24:MI:SSxFF’) from dual; &nbsp;<WBR><BR>　　--返回当前 时间的秒毫秒，可以指定秒后面的精度(最大=9) &nbsp;<WBR><BR>　　select to_char(current_timestamp(9),’MI:SSxFF’) from dual; &nbsp;<WBR><BR>&nbsp;<WBR> 6.计算程序运行的时间(ms) &nbsp;<WBR><BR>　　declare &nbsp;<WBR><BR>　　type rc is ref cursor; &nbsp;<WBR><BR>　　l_rc rc; &nbsp;<WBR><BR>　　l_dummy all_objects.object_name%type; &nbsp;<WBR><BR>　　l_start number default dbms_utility.get_time; &nbsp;<WBR><BR>　　begin &nbsp;<WBR><BR>　　for I in 1 .. 1000 &nbsp;<WBR><BR>　　loop &nbsp;<WBR><BR>　　open l_rc for &nbsp;<WBR><BR>　　’select object_name from all_objects ’|| &nbsp;<WBR><BR>　　’where object_id = ’ || i; &nbsp;<WBR><BR>　　fetch l_rc into l_dummy; &nbsp;<WBR><BR>　　close l_rc; &nbsp;<WBR><BR>　　end loop; &nbsp;<WBR><BR>　　dbms_output.put_line &nbsp;<WBR><BR>　　( round( (dbms_utility.get_time-l_start)/100, 2 ) || &nbsp;<WBR><BR>　　’ seconds...’ ); &nbsp;<WBR><BR>　　end;</SPAN>]]></description>
<author>不才</author>
<pubDate>2008-9-28 9:02:00</pubDate>
</item>
<item>
<title><![CDATA[js鼠标事件大全]]></title>
<link>http://liguocai.zhmy.com/archives/2008/150595.html</link>
<description><![CDATA[<P>一般事件 事件 浏览器支持 描述 <BR>onClick IE3|N2|O3 鼠标点击事件，多用在某个对象控制的范围内的鼠标点击 <BR>onDblClick IE4|N4|O 鼠标双击事件 <BR>onMouseDown IE4|N4|O 鼠标上的按钮被按下了 <BR>onMouseUp IE4|N4|O 鼠标按下后，松开时激发的事件 <BR>onMouseOver IE3|N2|O3 当鼠标移动到某对象范围的上方时触发的事件 <BR>onMouseMove IE4|N4|O 鼠标移动时触发的事件 <BR>onMouseOut IE4|N3|O3 当鼠标离开某对象范围时触发的事件 <BR>onKeyPress IE4|N4|O 当键盘上的某个键被按下并且释放时触发的事件.[注意:页面内必须有被聚焦的对象] <BR>onKeyDown IE4|N4|O 当键盘上某个按键被按下时触发的事件[注意:页面内必须有被聚焦的对象] <BR>onKeyUp IE4|N4|O 当键盘上某个按键被按放开时触发的事件[注意:页面内必须有被聚焦的对象] <BR>页面相关事件 事件 浏览器支持 描述 <BR>onAbort IE4|N3|O 图片在下载时被用户中断 <BR>onBeforeUnload IE4|N|O 当前页面的内容将要被改变时触发的事件 <BR>onError IE4|N3|O 捕抓当前页面因为某种原因而出现的错误，如脚本错误与外部数据引用的错误 <BR>onLoad IE3|N2|O3 页面内空完成传送到浏览器时触发的事件，包括外部文件引入完成 <BR>onMove IE|N4|O 浏览器的窗口被移动时触发的事件 <BR>onResize IE4|N4|O 当浏览器的窗口大小被改变时触发的事件 <BR>onScroll IE4|N|O 浏览器的滚动条位置发生变化时触发的事件 <BR>onStop IE5|N|O 浏览器的停止按钮被按下时触发的事件或者正在下载的文件被中断 <BR>onUnload IE3|N2|O3 当前页面将被改变时触发的事件 <BR>表单相关事件 事件 浏览器支持 描述 <BR>onBlur IE3|N2|O3 当前元素失去焦点时触发的事件 [鼠标与键盘的触发均可] <BR>onChange IE3|N2|O3 当前元素失去焦点并且元素的内容发生改变而触发的事件 [鼠标与键盘的触发均可] <BR>onFocus IE3|N2|O3 当某个元素获得焦点时触发的事件 <BR>onReset IE4|N3|O3 当表单中RESET的属性被激发时触发的事件 <BR>onSubmit IE3|N2|O3 一个表单被递交时触发的事件 <BR>滚动字幕事件 事件 浏览器支持 描述 <BR>onBounce IE4|N|O 在Marquee内的内容移动至Marquee显示范围之外时触发的事件 <BR>onFinish IE4|N|O 当Marquee元素完成需要显示的内容后触发的事件 <BR>onStart IE4|N|O 当Marquee元素开始显示内容时触发的事件 <BR>编辑事件 事件 浏览器支持 描述 <BR>onBeforeCopy IE5|N|O 当页面当前的被选择内容将要复制到浏览者系统的剪贴板前触发的事件 <BR>onBeforeCut IE5|N|O 当页面中的一部分或者全部的内容将被移离当前页面[剪贴]并移动到浏览者的系统剪贴板时触发的事件 <BR>onBeforeEditFocus IE5|N|O 当前元素将要进入编辑状态 <BR>onBeforePaste IE5|N|O 内容将要从浏览者的系统剪贴板传送[粘贴]到页面中时触发的事件 <BR>onBeforeUpdate IE5|N|O 当浏览者粘贴系统剪贴板中的内容时通知目标对象 <BR>onContextMenu IE5|N|O 当浏览者按下鼠标右键出现菜单时或者通过键盘的按键触发页面菜单时触发的事件 [试试在页面中的&lt;body&gt;中加入onContentMenu="return false"就可禁止使用鼠标右键了] <BR>onCopy IE5|N|O 当页面当前的被选择内容被复制后触发的事件 <BR>onCut IE5|N|O 当页面当前的被选择内容被剪切时触发的事件 <BR>onDrag IE5|N|O 当某个对象被拖动时触发的事件 [活动事件] <BR>onDragDrop IE|N4|O 一个外部对象被鼠标拖进当前窗口或者帧 <BR>onDragEnd IE5|N|O 当鼠标拖动结束时触发的事件，即鼠标的按钮被释放了 <BR>onDragEnter IE5|N|O 当对象被鼠标拖动的对象进入其容器范围内时触发的事件 <BR>onDragLeave IE5|N|O 当对象被鼠标拖动的对象离开其容器范围内时触发的事件 <BR>onDragOver IE5|N|O 当某被拖动的对象在另一对象容器范围内拖动时触发的事件 <BR>onDragStart IE4|N|O 当某对象将被拖动时触发的事件 <BR>onDrop IE5|N|O 在一个拖动过程中，释放鼠标键时触发的事件 <BR>onLoseCapture IE5|N|O 当元素失去鼠标移动所形成的选择焦点时触发的事件 <BR>onPaste IE5|N|O 当内容被粘贴时触发的事件 <BR>onSelect IE4|N|O 当文本内容被选择时的事件 <BR>onSelectStart IE4|N|O 当文本内容选择将开始发生时触发的事件 <BR>数据绑定 事件 浏览器支持 描述 <BR>onAfterUpdate IE4|N|O 当数据完成由数据源到对象的传送时触发的事件 <BR>onCellChange IE5|N|O 当数据来源发生变化时 <BR>onDataAvailable IE4|N|O 当数据接收完成时触发事件 <BR>onDatasetChanged IE4|N|O 数据在数据源发生变化时触发的事件 <BR>onDatasetComplete IE4|N|O 当来子数据源的全部有效数据读取完毕时触发的事件 <BR>onErrorUpdate IE4|N|O 当使用onBeforeUpdate事件触发取消了数据传送时，代替onAfterUpdate事件 <BR>onRowEnter IE5|N|O 当前数据源的数据发生变化并且有新的有效数据时触发的事件 <BR>onRowExit IE5|N|O 当前数据源的数据将要发生变化时触发的事件 <BR>onRowsDelete IE5|N|O 当前数据记录将被删除时触发的事件 <BR>onRowsInserted IE5|N|O 当前数据源将要插入新数据记录时触发的事件 <BR>数据绑定 事件 浏览器支持 描述 <BR>onAfterPrint IE5|N|O 当文档被打印后触发的事件 <BR>onBeforePrint IE5|N|O 当文档即将打印时触发的事件 <BR>onFilterChange IE4|N|O 当某个对象的滤镜效果发生变化时触发的事件 <BR>onHelp IE4|N|O 当浏览者按下F1或者浏览器的帮助选择时触发的事件 <BR>onPropertyChange IE5|N|O 当对象的属性之一发生变化时触发的事件 <BR>onReadyStateChange IE4|N|O 当对象的初始化属性值发生变化时触发的事件</P>]]></description>
<author>不才</author>
<pubDate>2008-9-8 14:00:00</pubDate>
</item>

</channel>
</rss>