﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-月亮的太阳-随笔分类-编程</title><link>http://www.blogjava.net/zyb9114/category/5823.html</link><description>小乖的BLOG</description><language>zh-cn</language><lastBuildDate>Sun, 17 Feb 2008 00:35:37 GMT</lastBuildDate><pubDate>Sun, 17 Feb 2008 00:35:37 GMT</pubDate><ttl>60</ttl><item><title>查看、修改ORACLE最大进程数</title><link>http://www.blogjava.net/zyb9114/archive/2007/12/24/169986.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Mon, 24 Dec 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2007/12/24/169986.html</guid><description><![CDATA[<strong><span style="color: red;">查看ORACLE最大进程数</span></strong>：<br />
SQL&gt; select count(*) from v$session&nbsp;&nbsp;#连接数<br />
SQL&gt; Select count(*) from v$session where status='ACTIVE'　#并发连接数<br />
SQL&gt; show parameter processes&nbsp;&nbsp;#最大连接<br />
SQL&gt; alter system set processes = value scope = spfile;重启数据库&nbsp;&nbsp;#修改连接<br />
<br />
unix 1个用户session 对应一个操作系统 process <br />
而 windows体现在线程<br />
<br />
------------------------------------------------------------------------------<br />
<strong><span style="color: red;">修改ORACLE最大进程数</span></strong>：<br />
使用sys，以sysdba权限登录：<br />
<br />
SQL&gt; show parameter processes;<br />
<br />
NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
------------------------------------ ----------- ------------------------------<br />
aq_tm_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
db_writer_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
job_queue_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 10<br />
log_archive_max_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 150<br />
<br />
SQL&gt; alter system set processes=300 scope = spfile;<br />
<br />
系统已更改。<br />
<br />
SQL&gt; show parameter processes;<br />
<br />
NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
------------------------------------ ----------- ------------------------------<br />
aq_tm_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
db_writer_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
job_queue_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 10<br />
log_archive_max_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 150<br />
<br />
SQL&gt; create pfile from spfile;<br />
<br />
文件已创建。<br />
&nbsp;<br />
<br />
重启数据库，<br />
&nbsp;<br />
SQL&gt; show parameter processes;<br />
<br />
NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VALUE<br />
------------------------------------ ----------- ------------------------------<br />
aq_tm_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
db_writer_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
job_queue_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 10<br />
log_archive_max_processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
processes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer&nbsp;&nbsp;&nbsp;&nbsp; 300<br />
&nbsp;<br />
搞定!<br />
<br />
<img src ="http://www.blogjava.net/zyb9114/aggbug/169986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2007-12-24 11:08 <a href="http://www.blogjava.net/zyb9114/archive/2007/12/24/169986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查看Tomcat资源使用情况的方法(转)</title><link>http://www.blogjava.net/zyb9114/archive/2007/11/07/158773.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Wed, 07 Nov 2007 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2007/11/07/158773.html</guid><description><![CDATA[使用软件&nbsp; samurai1_2
<p>安装tomcat和jdk后,保证tomcat能正常启动</p>
<p>修改bin目录下的catalina.bat文件</p>
<p>查找到 "&nbsp; rem Guess CATALINA_HOME if not defined&nbsp;&nbsp; " 这句<br />
在这句前面加入下列代码</p>
<p>rem set JAVA_OPTS=-Xms256m -Xmx256m -server<br />
set JAVA_OPTS=-Xms64m -Xmx128m<br />
set CATALINA_OPTS=-verbose:gc</p>
<p>ps:什么意思我也不知道目前</p>
<p>然后启动tomcat你会发现多了些 "[GC 8623K-&gt;4876K(65088K), 0.0134872 secs]"的文字</p>
<p>现在你要做的就是使用samurai1_2这个软件对这些文字进行处理</p>
<p>如何处理呢: <br />
在bin目录下建立start_with_gc.bat批处理文件,文件名可以改<br />
内容如下:</p>
<p>@echo on<br />
.\startup.bat &gt;&gt; ..\logs\gc.log 2&gt;&amp;1</p>
<p>这句话的意思就是把tomcat启动的信息都写到logs目录下的gc.log文件中,<br />
这样做就是为下面使用软件分析tomcat日志做准备的<br />
使用samurai1_2软件打开logs目录下的gc文件,接下来你应该都知道了,<br />
右边出现了系统内存时间等等的资源图.</p>
<p>==============================================================================<br />
如果：gc.log文件中只有几条环境变量的信息,而没有"[GC 8623K-&gt;4876K(65088K), 0.0134872 secs]字样,<br />
那可能你需要改一个地方:<br />
在catalina.bat中,在":doneSetArgs"这句下面有一行代码如下: </p>
<p>%_EXECJAVA%
%JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS%
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%"
-Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%"
-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS%
%ACTION%</p>
<p>PS:好象是这句,如果不是,也是在":doneSetArgs"中类似这句的语句,当时忘记拷贝出来就被我改了<br />
给改成</p>
<p>rem
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS%
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%"
-Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%"
-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS%
%ACTION%<br />
%JAVA_HOME%\bin\java.exe %JAVA_OPTS% %CATALINA_OPTS%
%DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath
"%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%"
-Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%"
%MAINCLASS% %CMD_LINE_ARGS% %ACTION%</p>
<p>这些做的目的就是为了tomcat启动的时候,不要先打开一个cmd控制台,然后关闭又打开另外一个,<br />
而是所有的显示信息都在一个cmd中打开,以便能通过那个批处理文件一起写到日志中</p>
<p>&nbsp;</p>
<p id="TBPingURL">作者 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#117;&#106;&#105;&#97;&#110;&#121;&#117;&#50;&#48;&#48;&#48;&#35;&#104;&#111;&#116;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">mailto:wujianyu2000#hotmail.com</a><br />
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=723803</p>
<img src ="http://www.blogjava.net/zyb9114/aggbug/158773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2007-11-07 11:28 <a href="http://www.blogjava.net/zyb9114/archive/2007/11/07/158773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AutoItX 1.4/2.63实现sendkeys和许多强大功能的COM组件(作者: Jonathan Bennett) </title><link>http://www.blogjava.net/zyb9114/archive/2006/12/20/89042.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Wed, 20 Dec 2006 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2006/12/20/89042.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/89042.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2006/12/20/89042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/89042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/89042.html</trackback:ping><description><![CDATA[作者：Jonathan Bennett 主页(英文): <a href="http://www.hiddensoft.com/AutoIt/">http://www.hiddensoft.com/AutoIt/</a>  <br />说明: 陶清 ( <a href="mailto:taoqing@163.net">taoqing@163.net</a> )<br />本地下载：AutoItx是免费组件! cool!<br />1.4版本   <a href="http://www.pdriver.com/pb02/10/autoit14.zip">http://www.pdriver.com/pb02/10/autoit14.zip</a> (size: 62kb)<br />2.63版本  <a href="http://www.pdriver.com/pb02/10/AutoIt263.exe">http://www.pdriver.com/pb02/10/AutoIt263.exe</a> (size: 612kb) 
<p>  VB 3.0就已经提供了一个很特别很有用的函数Sendkeys，能模拟键盘的操作，能以极为简单的方式实现许多演示或自动化工作。可惜PB中一直不能实现（即使用ＡＰＩ实现在起来非常复杂，功能也不AutoITx内核好并且调用方便）</p><p>  本系统是老外写的一个com组件，原理是根据从windows98开始windows自带提供了Microsoft's scripting engines来包装的调用。</p><p>  Microsoft's scripting engines类似于DOS时代的.bat处理文件，提供了许多方法(以com对象的方式)来方便用户调用windows的许多功能。</p><p>  如果你在电脑中搜索 *.vbs文件（一般都在windows目录下）会找到一些例程，仔细阅读这些例题你将会发现非常有用。包括了有控制excel，网络共享名的联接方式。</p><p>　本AutoItX提供了许多强大的功能，如下，其中第1,2点是我认为最有用的功能。<br /><strong><font color="darkred"><em>(cool!)</em></font></strong>1.支持sendkeys ，除ctrl+alt+del不允许外，其余的任何键你都可以模拟发送。包括组合键。还有特殊按键.<br />例如最常见的组合键, ctrl + a , 只需要使用sendkeys (<br /><font color="darkred"><strong><em>(cool!)</em></strong></font>2.重启,开机，注册销等操作(2.63版本支持windows98/me/nt/2000)，如你使用nt 4.0，强烈推荐要升级到sp6<br />3.支持窗口控制函数，最小化，隐藏，恢复，等待某窗口出现(如某messagebox)，将指定的窗口放到最前面<br />4.sleep命令(pb中有)<br />5.ini的读写(pb中有)<br />6.对windows的剪贴板的copy, paste操作<br />7.模拟mouse的移动，点击，拖拽。</p><p>调用示范(test.hta代码)<br />如果你下载的是1.4版本，先使用regsvr32 AutoItX.dll的方式注册 </p><p>&lt;script language="VBScript"&gt;<br />Sub RunProgram<br />Dim oShell<br />Dim oAutoIt<br />Set oShell = CreateObject("WScript.Shell")<br />Set oAutoIt = CreateObject("AutoItX.Control")<br />oShell.Run "C:\Progra~1\swglxt\SWGLXT.exe", 1, FALSE<br />oAutoIt.WinWaitActive "登陆", ""<br />'oAutoIt.Send "myname"<br />'oAutoIt.Send "{TAB}"<br />'oAutoIt.Send "mypassword"<br />'oAutoIt.Send "{ENTER 2}"</p><p>End Sub<br />&lt;/script&gt;<br />&lt;input type="button" value="test" onclick="RunProgram"&gt;</p><p><strong><font color="darkred">下面的命令是在屏幕x=50, y=200的位置模拟点击mouse左键<br /></font></strong>myoleobject.LeftClick( 50, 200)</p><p><strong><font color="darkred">下面的命令是模拟按下组合键ctrl + v</font></strong><br />myoleobject.send("{CTRLDOWN}v{CTRLUP}") </p><p>关于具体的键盘代码对应表可见其帮助文件. 1.4版本的帮助文件名是 AutoItX.chm</p><p>  注意截止到写本文的时候最新版本是 2.63,　因为我用1.4版本测试后已经完全满足了sendkeys功能，如果你需要在xp或2000下调用AutoItX的关机等功能，则建议你下载2.63版本。<br />  2.63已经支持 windows 2000/xp，同时提供activex或dll方式的调用，还提供了书写script并编译成exe独自执行的功能（即你可以不用第三方的软件，如pb,vb,delphi来写)<br />  2.63下载后可以直接安装。<br />  1.4版本的提供的.vbs例程我已经修改了，可以用于简体windows下面，而2.63版本因为其针对英文windows所写的sample，所以有些地方你需要修改，例如其中一个例程<br />C:\Program Files\AutoIt\Examples\_Run_Me_First.aut <br />其中有一个等待写字板出现的函数调用如下：<br />WinWait, Untitled - Notepad<br />你需要将它改为<br />WinWait, 无标题 - 记事本<br />才能正常运行。否则winwait会一直等到有一个窗口标题为Untitled - Notepad的窗口出现才继续执行script</p><img src ="http://www.blogjava.net/zyb9114/aggbug/89042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2006-12-20 15:04 <a href="http://www.blogjava.net/zyb9114/archive/2006/12/20/89042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat5.5.20连接池DBCP、C3P0配置(含官方配置)</title><link>http://www.blogjava.net/zyb9114/archive/2006/12/12/87275.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Tue, 12 Dec 2006 07:41:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2006/12/12/87275.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/87275.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2006/12/12/87275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/87275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/87275.html</trackback:ping><description><![CDATA[<p>
<strong>DBCP:</strong><br />
<font color="#0033ff">第一种方法</font>:修改$CATALINA_HOME\conf\server.xml,在<font color="#ff0000">&lt;GlobalNamingResources&gt;</font>中添加:<br />
&lt;Resource name="jdbc/dsname" auth="Container" type="javax.sql.DataSource"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="100" maxIdle="30" maxWait="200"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="@DB-DRIVERNAME@"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username="@DB-USERNAME@" password="@DB-PASSWORD@" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="@DB-URL@"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultAutoCommit="true" removeAbandoned="true" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removeAbandonedTimeout="60" logAbandoned="true"/&gt;<br />
<br />
然后在$CATALINA_HOME\conf\Catalina\localhost,创建应用相关的*.xml文件,在此文件的&lt;context&gt;中添加:<br />
&lt;ResourceLink<br />
&nbsp;&nbsp;&nbsp; global="jdbc/dsname"<br />
&nbsp;&nbsp;&nbsp; name="jdbc/dsname"<br />
&nbsp;&nbsp;&nbsp; type="javax.sql.DataSourcer"/&gt;<br />
<br />
<font color="#0033ff">第二种方法:</font>直接在$CATALINA_HOME\conf\Catalina\localhost,创建应用相关的*.xml文件,在此文件的&lt;context&gt;中添加:<br />
&lt;Resource name="jdbc/dsname" auth="Container" type="javax.sql.DataSource"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="100" maxIdle="30" maxWait="200"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="@DB-DRIVERNAME@"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username="@DB-USERNAME@" password="@DB-PASSWORD@" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="@DB-URL@"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultAutoCommit="true" removeAbandoned="true" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removeAbandonedTimeout="60" logAbandoned="true"/&gt;<br />
<br />
<font color="#0033ff">还有一种是官方配置:<br />
</font>1.修改$CATALINA_HOME\conf\server.xml,Context对应你的web应用的目录名,放到<font color="#ff0000">&lt;host&gt;</font>中间:<br />
&lt;Context docBase="test" path="/test" debug="5" reloadable="true" crossContext="true"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Resource name="jdbc/dsname" auth="Container" type="javax.sql.DataSource"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="100" maxIdle="30" maxWait="200"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="@DB-DRIVERNAME@"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username="@DB-USERNAME@" password="@DB-PASSWORD@" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="@DB-URL@"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaultAutoCommit="true" removeAbandoned="true" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removeAbandonedTimeout="60" logAbandoned="true"/&gt;<br />
&lt;/Context&gt;<br />
2.在你的WEB应用的web.xml中添加:<br />
&lt;resource-ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;DB Connection&lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-ref-name&gt;jdbc/dsname&lt;/res-ref-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />
&nbsp; &lt;/resource-ref&gt;<br />
<br />
第一种和第三种差不多,第一种第一段其实就是用<a href="http://localhost:8080/admin">http://localhost:8080/admin</a>添加DataSource后生成的,要多写一个WEB应用相关的XML来绑定连接池,第三种把这个文件集成到了server.xml中,和连接池的绑定交给了web.xml,但共同不方便的是如果TOMCAT下有多个应用,在开发中可能有的应用是不需要启动的,那你就要去修改server.xml.<br />
第二种方法的优点也正是另外两种方法的缺点,个人比较喜欢第二种方法,一个是TOMCAT版本更换比较方便,是的之前备份应用相关XML就可以了;二是如果不需要启动不相关的应用直接把文件名改一下,比如说加个.bak后缀就可以了.</p>
<br />
<p><br />
</p>
<p><strong>C3P0:</strong></p>
<p>因为TOMCAT自带的DBCP有很多BUG，所有有时会使用C3P0来替代，配置方法和上边的结构基本一样，注意几个参数名称不一样就可以了，另外还要把C3P0的JAR包放到classpath</p>
<p>&lt;Resource name="jdbc/name" auth="Container" type="<strong>com.mchange.v2.c3p0.ComboPooledDataSource</strong>"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxPoolSize="30" minPoolSize="1" initialPoolSize="5" acquireIncrement="2"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idleConnectionTestPeriod="60" maxIdleTime="60"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClass="@DB-DRIVERNAME@"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>user</strong>="@DB-USERNAME@" password="@DB-PASSWORD@" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>jdbcUrl</strong>="@DB-URL@"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>factory</strong>="org.apache.naming.factory.BeanFactory"/&gt;<br />
</p>
<p><font color="#ff0000"><br />
</font></p>
<p><font color="#ff0000">其实还有其它的方法,另外需要注意的一点是数据库相关的JDBC驱动要放到$CATALINA_HOME\common\lib下边,不然会class not found!</font></p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zyb9114/aggbug/87275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2006-12-12 15:41 <a href="http://www.blogjava.net/zyb9114/archive/2006/12/12/87275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>showModalDialog和showModelessDialog使用心得</title><link>http://www.blogjava.net/zyb9114/archive/2006/04/07/39734.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Fri, 07 Apr 2006 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2006/04/07/39734.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/39734.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2006/04/07/39734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/39734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/39734.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent">  showModalDialog和showModelessDialog使用心得 <br /><p>    Javascript有许多内建的方法来产生对话框，如：window.alert(), window.confirm(),window.prompt().等。 然而IE提供更多的方法支持对话框。如： 
</p><p>    showModalDialog() (IE 4+ 支持)<br />　  showModelessDialog() (IE 5+ 支持)</p><p>    window.showModalDialog()方法用来创建一个显示HTML内容的模态对话框，由于是对话框，因此它并没有一般用window.open()打开的窗口的所有属性。</p><p>    window.showModelessDialog()方法用来创建一个显示HTML内容的非模态对话框。 </p><p>    当我们用showModelessDialog()打开窗口时，不必用window.close()去关闭它，当以非模态方式［IE5］打开时， 打开对话框的窗口仍可以进行其他的操作，即对话框不总是最上面的焦点，当打开它的窗口ＵＲＬ改变时，它自动关闭。而模态［ＩＥ４］方式的对话框始终有焦点（焦点不可移走，直到它关闭）。模态对话框和打开它的窗口相联系，因此我们打开另外的窗口时，他们的链接关系依然保存，并且隐藏在活动窗口的下面。</p><p>使用方法如下：<br />    vReturnValue = window.showModalDialog(sURL [, vArguments] [, sFeatures])<br />    vReturnValue = window.showModelessDialog(sURL [, vArguments] [, sFeatures])</p><p>参数说明：<br />    sURL<br />   必选参数，类型：字符串。用来指定对话框要显示的文档的URL。<br />    vArguments<br />   可选参数，类型：变体。用来向对话框传递参数。传递的参数类型不限，包括数组等。对话框通过window.dialogArguments来取得传递进来的参数。<br />    sFeatures<br />   可选参数，类型：字符串。用来描述对话框的外观等信息，可以使用以下的一个或几个，用分号“;”隔开。<br />    dialogHeight 对话框高度，不小于１００px，ＩＥ４中dialogHeight 和 dialogWidth 默认的单位是em，而ＩＥ５中是px，为方便其见，在定义modal方式的对话框时，用px做单位。<br /> 　 dialogWidth: 对话框宽度。<br /> 　 dialogLeft: 距离桌面左的距离。<br /> 　 dialogTop: 离桌面上的距离。<br /> 　 center: {yes | no | 1 | 0 }：窗口是否居中，默认yes，但仍可以指定高度和宽度。<br /> 　 help: {yes | no | 1 | 0 }：是否显示帮助按钮，默认yes。<br /> 　 resizable: {yes | no | 1 | 0 } ［ＩＥ５＋］：是否可被改变大小。默认no。<br /> 　 status: {yes | no | 1 | 0 } ［IE5+］：是否显示状态栏。默认为yes[ Modeless]或no[Modal]。<br />    scroll:{ yes | no | 1 | 0 | on | off }：指明对话框是否显示滚动条。默认为yes。</p><p>还有几个属性是用在HTA中的，在一般的网页中一般不使用。<br />    dialogHide:{ yes | no | 1 | 0 | on | off }：在打印或者打印预览时对话框是否隐藏。默认为no。<br />    edge:{ sunken | raised }：指明对话框的边框样式。默认为raised。<br />    unadorned:{ yes | no | 1 | 0 | on | off }：默认为no。</p><p>传入参数：<br />    要想对话框传递参数，是通过vArguments来进行传递的。类型不限制，对于字符串类型，最大为4096个字符。也可以传递对象，例如：</p><p>test1.htm<br /><span class="code">&lt;script&gt;<br />  var mxh1 = new Array("mxh","net_lover","孟子E章")<br />  var mxh2 = window.open("about:blank","window_mxh")<br />  // 向对话框传递数组<br />  window.showModalDialog("test2.htm",mxh1)<br />  // 向对话框传递window对象<br />  window.showModalDialog("test3.htm",mxh2)<br />&lt;/script&gt;</span>test2.htm<br /><span class="code">&lt;script&gt;<br />  var a = window.dialogArguments<br />  alert("您传递的参数为：" + a)<br />&lt;/script&gt;</span> <br />test3.htm<br /><span class="code">&lt;script&gt;<br />  var a = window.dialogArguments<br />  alert("您传递的参数为window对象，名称：" + a.name)<br /> &lt;/script&gt;</span></p><p> 可以通过window.returnValue向打开对话框的窗口返回信息，当然也可以是对象。例如：</p><p>test4.htm<br /><span class="code">&lt;script&gt;<br />  var a = window.showModalDialog("test5.htm")<br />  for(i=0;i&lt;a.length;i++) alert(a[i])<br />&lt;/script&gt;</span>test5.htm<br /><span class="code"> &lt;script&gt;<br /> function sendTo()<br /> {<br />  var a=new Array("a","b")<br />  window.returnValue = a<br />  window.close()<br /> }<br /> &lt;/script&gt;<br /> &lt;body&gt;<br /> &lt;form&gt;<br />  &lt;input value="返回" type=button onclick="sendTo()"&gt;<br /> &lt;/form&gt;</span></p><p>常见问题：<br />1，如何在模态对话框中进行提交而不新开窗口？<br />   如果你 的 浏览器是IE5.5+,可以在对话框中使用带name属性的iframe，提交时可以制定target为该iframe的name。对于IE4+，你可以用高度为0的frame来作。例如：</p><p> test6.htm<br /><span class="code">&lt;script&gt;<br />  window.showModalDialog("test7.htm")<br /> &lt;/script&gt;</span> test7.htm<br /><span class="code">if(window.location.search) alert(window.location.search)<br /> &lt;frameset rows="0,*"&gt;<br />  &lt;frame src="about:blank"&gt;<br />  &lt;frame src="test8.htm"&gt;<br /> &lt;/frameset&gt;</span> test8.htm<br /><span class="code">&lt;form target="_self" method="get"&gt;<br /> &lt;input name=txt value="test"&gt;<br /> &lt;input type=submit&gt;<br /> &lt;/form&gt;<br /> &lt;script&gt;<br /> if(window.location.search) alert(window.location.search)<br /> &lt;/script&gt;<br /></span> </p><p>2,可以通过http://servername/virtualdirname/test.htm?name=mxh方式直接向对话框传递参数吗？<br /> 答案是不能。但在frame里是可以的。<br /><br />一、showModalDialog和showModelessDialog有什么不同？<br />　　showModalDialog：被打开后就会始终保持输入焦点。除非对话框被关闭，否则用户无法切换到主窗口。类似alert的运行效果。<br />　　showModelessDialog：被打开后，用户可以随机切换输入焦点。对主窗口没有任何影响(最多是被挡住一下而以。:P)</p><p>二、怎样才让在showModalDialog和showModelessDialog的超连接不弹出新窗口？<br />　　在被打开的网页里加上&lt;base target="_self"&gt;就可以了。这句话一般是放在&lt;html&gt;和&lt;body&gt;之间的。</p><p>三、怎样才刷新showModalDialog和showModelessDialog里的内容？<br />　　在showModalDialog和showModelessDialog里是不能按F5刷新的，又不能弹出菜单。这个只能依靠javascript了，以下是相关代码：</p><p>&lt;body onkeydown="if (event.keyCode==116){reload.click()}"&gt;<br />&lt;a id="reload" href="filename.htm" style="display:none"&gt;reload...&lt;/a&gt;</p><p>　　将filename.htm替换成网页的名字然后将它放到你打开的网页里，按F5就可以刷新了，注意，这个要配合&lt;base target="_self"&gt;使用，不然你按下F5会弹出新窗口的。</p><p>四、如何用javascript关掉showModalDialog(或showModelessDialog)打开的窗口。<br />　　&lt;input type="button" value="关闭" onclick="window.close()"&gt;<br />　　也要配合&lt;base target="_self"&gt;，不然会打开一个新的IE窗口，然后再关掉的。</p><p>五、showModalDialog和showModelessDialog数据传递技巧。<br />　　(作者语：本来想用一问一答形式来写的，但是我想不出这个怎么问，所以只好这样了。)<br />　　这个东西比较麻烦，我改了好几次了不是没办法说明白(语文水平越来越差了)，只好用个例子说明了。<br />　　例子：<br />　　　　现在需要在一个showModalDialog(或showModelessDialog)里读取或设置一个变量var_name</p><p>　　　　　　一般的传递方式：<br />　　　　　　　　window.showModalDialog("filename.htm",var_name)<br />　　　　　　　　//传递var_name变量<br />　　　　　　在showModalDialog(或showModelessDialog)读取和设置时：<br />　　　　　　　　alert(window.dialogArguments)//读取var_name变量<br />　　　　　　　　window.dialogArguments="oyiboy"//设置var_name变量<br />　　　　这种方式是可以满足的，但是当你想在操作var_name同时再操作第二个变理var_id时呢？就无法再进行操作了。这就是这种传递方式的局限性。<br />　　　　<br />　　　　　　以下是我建议使用的传递方式：<br />　　　　　　　　window.showModalDialog("filename.htm",window)<br />　　　　　　　　//不管要操作什么变量，只直传递主窗口的window对象<br />　　　　　　在showModalDialog(或showModelessDialog)读取和设置时：<br />　　　　　　　　alert(window.dialogArguments.var_name)//读取var_name变量<br />　　　　　　　　window.dialogArguments.var_name="oyiboy"//设置var_name变量</p><p>　　　　　　　　同时我也可以操作var_id变量<br />　　　　　　　　alert(window.dialogArguments.var_id)//读取var_id变量<br />　　　　　　　　window.dialogArguments.var_id="001"//设置var_id变量</p><p>　　　　　　　　同样还可以对主窗口的任何对象进行操作，如form对象里的元素。<br />　　　　　　　　window.dialogArguments.form1.index1.value="这是在设置index1元素的值"</p><p>六、多个showModelessDialog的相互操作。<br />　　因为光说很费劲，我就偷点懒，直接用代码来说了，如果不明白的话那就直接来信(oyiboy#163.net(使用时请将#改成@))问我吧。</p><p>　　以下代码的主要作用是在一个showModelessDialog里移动别一个showModelessDialog的位置。</p><p>　　主文件的部份js代码。<br />　　var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px"） //打开控制窗口<br />　　var s2=showModelessDialog('about:blank',window,"dialogTop:200px;dialogLeft:300px"）　　//打开被控制窗口</p><p>　　控制.htm的部份代码。<br />　　&lt;script&gt;<br />　　　　//操作位置数据，因为窗口的位置数据是"xxxpx"方式的，所以需要这样的一个特殊操作函数。<br /> function countNumber(A_strNumber,A_strWhatdo)<br /> {<br />  A_strNumber=A_strNumber.replace('px','')<br />  A_strNumber-=0<br />  switch(A_strWhatdo)<br />  {<br />  case "-":A_strNumber-=10;break;<br />  case "+":A_strNumber+=10;break;<br />  }<br />  return A_strNumber + "px"<br /> }<br />　　&lt;/script&gt;<br />　　&lt;input type="button" onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'-')" value="上移"&gt;<br />　　&lt;input type="button" onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'-')" value="左移"&gt;<br />　　&lt;input type="button" onclick="window.dialogArguments.s2.dialogLeft=countNumber(window.dialogArguments.s2.dialogLeft,'+')" value="右移"&gt;<br />　　&lt;input type="button" onclick="window.dialogArguments.s2.dialogTop=countNumber(window.dialogArguments.s2.dialogTop,'+')" value="下移"&gt;</p><p>　　以上关键部份是：<br />　　　　窗口命名方式：var s1=showModelessDialog('控制.htm',window,"dialogTop:1px;dialogLeft:1px"）<br />　　　　变量访问方式：window.dialogArguments.s2.dialogTop</p><p>　　这个例子只是现实showModelessDialog与showModelessDialog之间的位置操作功能，通过这个原理，在showModelessDialog之间相互控制各自的显示页面，传递变量和数据等。这要看各位的发挥了。</p></span>
<img src ="http://www.blogjava.net/zyb9114/aggbug/39734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2006-04-07 10:07 <a href="http://www.blogjava.net/zyb9114/archive/2006/04/07/39734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对一个指定的文件夹中的文件进行按日期，大小，名称来排序</title><link>http://www.blogjava.net/zyb9114/archive/2006/03/01/33031.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Wed, 01 Mar 2006 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2006/03/01/33031.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/33031.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2006/03/01/33031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/33031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/33031.html</trackback:ping><description><![CDATA[得到文件夹的文件列表;<BR>先定义一个类<BR>
<BLOCKQUOTE><FONT size=-1>CODE:</FONT> 
<HR>
<PRE><BR>class&nbsp;SortFile&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;size;<BR>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;date;<BR>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name;<BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;SortFile(String&nbsp;name,&nbsp;long&nbsp;date,&nbsp;long&nbsp;size)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;name;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.date&nbsp;=&nbsp;date;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.size&nbsp;=&nbsp;size;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;SortFile[]&nbsp;sort(SortFile[]&nbsp;src,&nbsp;String&nbsp;mark,&nbsp;boolean&nbsp;rule)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rule)&nbsp;{//升序<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;src.length;&nbsp;i&nbsp;&gt;&nbsp;1;&nbsp;i--)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;i&nbsp;-&nbsp;1;&nbsp;j++)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;change&nbsp;=&nbsp;false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mark.equals("name"))&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(src[j].name.compareTo(src[j&nbsp;+&nbsp;1].name)&nbsp;&gt;&nbsp;0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change&nbsp;=&nbsp;true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(mark.equals("date"))&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(src[j].date&nbsp;&gt;&nbsp;src[j&nbsp;+&nbsp;1].date)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change&nbsp;=&nbsp;true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(src[j].size&nbsp;&gt;&nbsp;src[j&nbsp;+&nbsp;1].size)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change&nbsp;=&nbsp;true;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(change)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SortFile&nbsp;temp&nbsp;=&nbsp;src[j];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src[j]&nbsp;=&nbsp;src[j&nbsp;+&nbsp;1];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src[j&nbsp;+&nbsp;1]&nbsp;=&nbsp;temp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//降序只要把&gt;改成&lt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;src;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR></PRE>
<HR>
</BLOCKQUOTE><BR>这样得到一个目录下文件后:<BR>
<BLOCKQUOTE><FONT size=-1>CODE:</FONT> 
<HR>
<PRE><BR>ArrayList&nbsp;al&nbsp;=&nbsp;new&nbsp;ArrayList();<BR>File&nbsp;f&nbsp;=&nbsp;new&nbsp;File(dir);<BR>String[]&nbsp;names&nbsp;=&nbsp;f.list();<BR>for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;names.length;&nbsp;i++)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;fs&nbsp;=&nbsp;new&nbsp;File(f,&nbsp;names[i]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;SortFile&nbsp;sf&nbsp;=&nbsp;new&nbsp;SortFile(name[i],&nbsp;fs.length(),&nbsp;fs.lastModified);<BR>&nbsp;&nbsp;&nbsp;&nbsp;al.add(sf);<BR>}<BR></PRE>
<HR>
</BLOCKQUOTE><BR><BR>最后把al转换成数组:<BR><BR>SortFile[]&nbsp;sfSrc&nbsp;=&nbsp;new&nbsp;SortFile[al.size()];<BR>for(i=0;i&lt;al.size();i++)<BR>sfSrc[i]&nbsp;=&nbsp;(SortFile)&nbsp;al.get(i);<BR><BR>这样你要按什么排传进去名称,升降传boolean<BR>比如\<BR>SortFile[]&nbsp;forName&nbsp;=&nbsp;SortFile.sort(sfSrc,"name",true);<BR><BR>把得到的ArrayList传入返回排序后的al呢,因为这时多次遍历,只有数组最快.把al转化成数组只是多用了1个时间单位的开销的话,下面用数组来排充就节少了10000个时间单位.<img src ="http://www.blogjava.net/zyb9114/aggbug/33031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2006-03-01 17:02 <a href="http://www.blogjava.net/zyb9114/archive/2006/03/01/33031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDOM入门:使用JDOM解析XML</title><link>http://www.blogjava.net/zyb9114/archive/2006/02/15/30823.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Wed, 15 Feb 2006 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2006/02/15/30823.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/30823.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2006/02/15/30823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/30823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/30823.html</trackback:ping><description><![CDATA[一、前言<BR>&nbsp;&nbsp;&nbsp;&nbsp;JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果，2000年初，JDOM作为一个开放源代码项目正式开始研发。JDOM是一种解析XML的Java工具包。 
<P>&nbsp;&nbsp;&nbsp;&nbsp;DOM适合于当今流行的各种语言，包括Java,JavaScripte,VB,VBScript，Perl,C,C++等。它了为HTML和XML文档提供了一个可应用于不同平台的编程接口。W3C DOM的最新信息可从http://www.w3.org/TR2001/WD-DOM-Lever-3-Core-20010913查阅。微软在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmconxmldomuserguide.asp上也有DOM的详细技术信息。</P>
<P>&nbsp;&nbsp;&nbsp;DOM的设计为了适用于不同的语言，它保留了不同语言中非常相似的API。但是它并不适合于Java编程者的习惯。而JDOM作为一种轻量级API被制定，它最核心的要求是以Java为中心，只适合于Java语言，它遵循DOM的接口主要规则，除去了DOM中为了兼容各语言而与Java习惯的不同。</P>
<P>二、使用JDOM的前提条件<BR>&nbsp;&nbsp;&nbsp;须要有SAX、DOM解析器的类文件，JDOM只是一种适合Java程序员来使用的Java XML解析器，目前流行的Java XML解析器还有：Apache Xerces Java、JAXP。<BR>Xerces Java解析器是完全用Java编写的XML解析器，最新版本是2.5，它支持以下标准和API：<BR>（1） XML1.0规范（第二版本）<BR>（2） XML命名空间规范<BR>（3） DOM2核心标准规范<BR>（4） SAX2核心扩展<BR>（5） JAXP1.2 ：是Sun提供的使用Java处理XML的接口API。<BR>（6） XML Schema结构和数据类型标准</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有最好的是它开放源代码，我们可以在http://xml.apache.org/dist/xerces-j/ 处去下载。下载文件Xerces-J-bin.2.5.0.zip。<BR>解压下载文件，得到四个压缩包加到项目的路径中（其实不要全加，但不熟的情况下考虑这么做）。<BR>JDOM的二进制版本下载：http://www.jdom.org/downloads/index.html<BR>把解压后的jdom.jar文件加到项目的类路径中，另外便于调试，还要下载它的源代码。</P>
<P>三、使用JDOM解析XML<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好了，现在该是正题了。下面通过一个简单的例子说明一下怎么用JDOM这一适合Java程序员习惯的工具包来解析XML文档。<BR>为了简单，我用了如下XML作为要解析的XML文件：<BR>&lt;?xml version="1.0" encoding="gb2312"?&gt;<BR>&lt;books&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;book email="zhoujunhui"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;rjzjh&lt;/name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;price&gt;60.0&lt;/price&gt;<BR>&nbsp;&nbsp;&lt;/book&gt;<BR>&lt;/books&gt;<BR>够简单的吧，但它对于我们关心的东西都有了，子节点，属性。<BR>下面是用于解析这个XML文件的Java文件：<BR><PRE>1 public class JDomParse {
2	public JDomParse(){
3		String xmlpath="library.xml";
4		SAXBuilder builder=new SAXBuilder(false);
5		try {
6			Document doc=builder.build(xmlpath);
7			Element books=doc.getRootElement();
8			List booklist=books.getChildren("book");
9			for (Iterator iter = booklist.iterator(); iter.hasNext();) {
10				Element book = (Element) iter.next();
11				String email=book.getAttributeValue("email");
12				System.out.println(email);
13				String name=book.getChildTextTrim("name");
14				System.out.println(name);
15				book.getChild("name").setText("alterrjzjh");
16				
17			}
18			
19			XMLOutputter outputter=new XMLOutputter();
20			outputter.output(doc,new FileOutputStream(xmlpath));
21			
22		} catch (JDOMException e) {
23			e.printStackTrace();
24		} catch (IOException e) {
25			e.printStackTrace();
26		}
27	}
28	public static void main(String[] args) {
29		new JDomParse();
30	}
31}</PRE>不到30行代码，现在我对代码解释一下：<BR>四、解释代码<BR>引用的类：<BR>import java.io.FileOutputStream;<BR>import java.io.IOException;<BR>import java.util.Iterator;<BR>import java.util.List;<BR>//下面是引用到JDOM中的类<BR>import org.jdom.Document;<BR>import org.jdom.Element;<BR>import org.jdom.JDOMException;<BR>import org.jdom.input.SAXBuilder;<BR>import org.jdom.output.XMLOutputter;<BR>（1）使用JDOM首先要指定使用什么解析器。如：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder builder=new SAXBuilder(false); 这表示使用的是默认的解析器<BR>（2）得到Document，我们以后要进行的所有操作都是对这个Document操作的：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document doc=builder.build(xmlpath);<BR>（3）得到根元素：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element books=doc.getRootElement();<BR>在JDOM中所有的节点（DOM中的概念）都是一个org.jdom.Element类，当然他的子节点也是一个org.jdom.Element类。<BR>（4）得到元素（节点）的集合：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List booklist=books.getChildren("book");<BR>这表示得到“books”元素的所在名称为“book”的元素，并把这些元素都放到一个List集合中<BR>（5）轮循List集合<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (Iterator iter = booklist.iterator(); iter.hasNext();) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element book = (Element) iter.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;｝<BR>还有一种轮循方法是：<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;I&lt;booklist.size();I++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element book=(Element)booklist.get(i);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>（6）取得元素的属性：<BR>&nbsp;&nbsp;&nbsp;&nbsp;String email=book.getAttributeValue("email");<BR>&nbsp;&nbsp;&nbsp;取得元素book的属性名为“email”的属性值。<BR>（7）取得元素的子元素（为最低层元素）的值：<BR>&nbsp;&nbsp;&nbsp;&nbsp;String name=book.getChildTextTrim("name");<BR>&nbsp;&nbsp;&nbsp;&nbsp;注意的是，必须确定book元素的名为“name”的子元素只有一个。<BR>（8）改变元素（为最低层元素）的值：<BR>&nbsp;&nbsp;&nbsp;&nbsp;book.getChild("name").setText("alterrjzjh");<BR>&nbsp;&nbsp;&nbsp;&nbsp;这只是对Document的修改，并没有在实际的XML文档中进行修改<BR>（9）保存Document的修改到XML文件中：<BR>&nbsp;&nbsp;&nbsp;XMLOutputter outputter=new XMLOutputter();<BR>&nbsp;&nbsp;&nbsp;&nbsp;outputter.output(doc,new FileOutputStream(xmlpath));<BR><BR>我们先要有一个XMLOutputter类，再把已经修改了的Document保存进XML文档中。<BR>到此。用JDOM解析和处理XML文档讲解完了，麻雀虽小，五脏俱全。现在已对JDOM有个整体上的概念了吧。<BR><img src ="http://www.blogjava.net/zyb9114/aggbug/30823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2006-02-15 15:39 <a href="http://www.blogjava.net/zyb9114/archive/2006/02/15/30823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用Axis传送附件</title><link>http://www.blogjava.net/zyb9114/archive/2006/02/10/30118.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Fri, 10 Feb 2006 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2006/02/10/30118.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/30118.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2006/02/10/30118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/30118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/30118.html</trackback:ping><description><![CDATA[<P>使用Axis传送附件有两种方式：</P>
<P>1. 将你要传送的文件封装在DataHandler中，然后将DataHandler对象或DataHandler数组（多个文件传送的时候）作为客户端调用函数的参数（从客户端上传文件到服务器）Axis服务的返回类型（从服务器端下载文件到客户端）进行传输。</P>
<P>2. 还有一种方式是直接修改soap信封的内容，将附件信息加到soap信封中发送。</P>
<P>这里我们只讨论第一种方法，因为它实现起来非常简单。关于第二种方法在Axis包的webapps/attachments/TestRf.java中有详细的原码可以参考。</P>
<P>下面的例子是把文件从服务器端下载到客户端：</P>
<P>1.服务端程序：</P>
<P>假设传输多个文件：在服务器端将文件取出来，并将文件封装在DataHandler数组中。<BR>代码如下：</P>
<P>&nbsp;DataHandler[] ret = new DataHandler[totalFileNum];<BR>&nbsp;... ...<BR>&nbsp;java.io.File myFile = new java.io.File(filePath);<BR>&nbsp;if(myFile.isFile() &amp;&amp; myFile.canRead())<BR>&nbsp;{<BR>&nbsp;&nbsp;String fname = myFile.getAbsoluteFile().getCanonicalPath();<BR>&nbsp;&nbsp;DataHandler[0] = new DataHandler(new FileDataSource(fname));<BR>&nbsp;}<BR>&nbsp;... ...</P>
<P>&nbsp;return ret;</P>
<P>上面的代码将所有的文件封装在了DataHandler数组中，并返回。</P>
<P>2. 客户端的访问：</P>
<P>代码如下：<BR>&nbsp;Service service = new Service();<BR>&nbsp;Call call = (Call) service.createCall();</P>
<P>&nbsp;URL myURL = new URL("<A href="http://192.168.0.26:8080/axis/servlet/AxisServlet"><U>http://192.168.0.26:8080/axis/servlet/AxisServlet</U></A>");<BR>&nbsp;call.setTargetEndpointAddress(myURL); //设定服务的主机和位置<BR>&nbsp;call.setOperationName(new QName("urn:MyAttachServer","echoDir")); //设置要调用的服务的方法<BR>&nbsp;QName qnameAttachment = new QName("urn:MyAttachServer","DataHandler");</P>
<P>&nbsp;call.registerTypeMapping(DataHandler.class, qnameAttachment, JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class); //为附件（即DataHandler类）创建序列化生成器</P>
<P>&nbsp;call.addParameter("source", XMLType.XSD_STRING ,ParameterMode.IN);&nbsp;//设置服务调用方法的传入参数类型<BR>&nbsp;call.setReturnType(XMLType.SOAP_ARRAY);&nbsp;//设置调用服务方法的返回类型，由于返回的是DataHandler数组，所以设置为SOAP_ARRAY类型<BR>&nbsp;javax.activation.DataHandler[] ret = (javax.activation.DataHandler[])call.invoke(new Object[]{null}); //调用方法</P>
<P>&nbsp;for (i = 0; i &lt; ret.length; ++i)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataHandler recDH = ret[i];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java.io.File receivedFile = new java.io.File(recDH.getName());&nbsp;//文件生成<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>3. 服务的部署：</P>
<P>注意：你要在部署的时候，定义DataHandler的序列化生成器。</P>
<P><DEPLOYMENT xmlns="”http://xml.apache.org/axis/wsdd/”">&nbsp; 编写deploy.wsdd文件：</SERVICE></P>
<P></DEPLOYMENT></P>
<P>&nbsp;&lt;deployment xmlns="<A href="http://xml.apache.org/axis/wsdd/"><U>http://xml.apache.org/axis/wsdd/</U></A>" xmlns:java="<A href="http://xml.apache.org/axis/wsdd/providers/java"><U>http://xml.apache.org/axis/wsdd/providers/java</U></A>" xmlns:ns1="urn:att_STC_Server" &gt;<BR>&nbsp; &lt;service name="urn:att_STC_Server" provider="java:RPC" &gt;<BR>&nbsp;&nbsp;&nbsp; &lt;parameter name="className" value="samples.att_STC.att_STC_Server"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;parameter name="allowedMethods" value="echoDir"/&gt;</P>
<P>&nbsp;&lt;typeMapping deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"<BR>&nbsp;&nbsp; languageSpecificType="java:javax.activation.DataHandler" qname="ns1:DataHandler"<BR>&nbsp;&nbsp;&nbsp; serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" <BR>&nbsp;&nbsp;&nbsp; encodingStyle="<A href="http://blog.csdn.net/tenwang1977/archive/2004/07/08/'http://schemas.xmlsoap.org/soap/encoding/" ??><U>http://schemas.xmlsoap.org/soap/encoding/"/</U></A>&gt;<BR>&nbsp; &lt;/service&gt;</P>
<P>&lt;/deployment&gt;</SERVICE></P>
<P></DEPLOYMENT></SERVICE></P>
<P></DEPLOYMENT></P>
<P>运行java org.apache.axis.client.AdminClient %* deploy.wsdd，部署服务。</P><img src ="http://www.blogjava.net/zyb9114/aggbug/30118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2006-02-10 12:32 <a href="http://www.blogjava.net/zyb9114/archive/2006/02/10/30118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>李维日志：它终于发生了! 记住这重要的一天</title><link>http://www.blogjava.net/zyb9114/archive/2006/02/10/30109.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Fri, 10 Feb 2006 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2006/02/10/30109.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/30109.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2006/02/10/30109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/30109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/30109.html</trackback:ping><description><![CDATA[<P>本文摘选自 <A href="http://www.dearbook.com.cn/Book/AuthorBlog.aspx?id=18&amp;url=http%3a%2f%2fspaces.msn.com%2fmembers%2fGordonLiWei%2fBlog%2fcns!1pd9F9rOlOiQSBatvHQlivdg!441.entry&amp;t=%d6%d0%ce%c4Borland+Developer+Network%ba%cd%bc%bc%d0g%ce%c4%d5%c2"><FONT color=#ff0000>李维的BLog</FONT></A></P>
<P>虽然今天一大早早上7点我就匆匆上了Internet看看Borland的宣布会造成什么影响，不过心中却早已底定，因为1:我知道这一定会在开发者社群产生巨大的冲击，2:这件事在昨天晚上台北时间下午5:30左右我已经知道这件事了。</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp; 许多朋友和网友一早就开始不断的问我的意见，我在Internet上也看到许多人的响应，我静静的看着，咀嚼着不同的人不同的回应。其实静下心观察现有的响应是很有趣的，因为不管是悲伤的，悲观的，乐观的，观望的，生气的，骂人的，甚至对Borland说再见的都代表这个使用者群组强大的力量，强大的渲染力，和强大的凝聚力。</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实对我个人而言，我觉得这样做是对的，因为不在Borland工作的人不会知道我们这些相信开发工具，喜欢开发工具的人在Borland为开发工具而战是多么的辛苦，Borland已经确定要走ALM的路，因此几乎把所有的资源都投入了ALM，就像David I Blog中说的一样。虽然开发工具仍然是赚钱的生意，但是开发工具部门并没有得到应该有的照顾和资源，Chuck争的累了，Danny争的也累了，我们许多人都累了，因为这些人中大多数只是技术人员，我们不是Borland的高层人员，我们无法决定Borland的走向。</P>
<P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让开发工具部门脱离Borland至少可以让这些我们喜爱的开发工具得到应有的资源，每一分赚来的钱都可以投入做为下一代更好产品的投资，这至少对开发工具部门是公平的。我一直认为开发工具和ALM并不相左，ALM的中心仍然是开发工具，ALM是为了帮企业增加价值，这些增加价值的部份来自更高的生产力和高质量的软件开发，这并不相互违背，无奈……。</P>
<P>
<P>。。。。。。。。。。。</P>
<P>10多年前我从G.I.T.毕业时只想做Borlander或是Microsofter，没想到在为Borland工作了这么多年之后我又站在了十字路口。我还会是我曾经引以为傲的『Borlander』吗? 我也不知道，也许答案要等买主出现之后事情就会明朗了。</P>
<P>记下这一天，『2006年2月8日』 ，因为不管你喜不喜欢Borland，这一天在未来人们回顾IT历史时，将是软件界重要的一日。</P>
<P>阅读全文请到 <A href="http://spaces.msn.com/GordonLiWei/"><FONT color=#ff0000>李维的BLog</FONT></A></P><img src ="http://www.blogjava.net/zyb9114/aggbug/30109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2006-02-10 11:30 <a href="http://www.blogjava.net/zyb9114/archive/2006/02/10/30109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse+MyEclipse+WebLogic8.1配置</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/29/25889.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Thu, 29 Dec 2005 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/29/25889.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25889.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/29/25889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25889.html</trackback:ping><description><![CDATA[<P><FONT face=Verdana>前边的安装都略过......<BR><BR></FONT><FONT face=Verdana size=2>直接配置MyEclipse的WebLogic服务器 <BR>MyEclipse默认的应用服务器为JBoss3，这里我们使用WebLogic8.1。启动Eclipse，选择“窗口\首选项”菜单，打开首选项对话框。展开MyEclipse下的Application Servers结点，点击JBoss 3，选中右面的Disable单选按钮，停用JBoss 3。然后点击WebLogic 8，选中右边的Enable单选按钮，启用WebLogic服务器。同时下面的配置如下： <BR>(1)BEA home directory：E:\BEA<BR>(2)WebLogic installation directory：E:\BEA\weblogic81 <BR>(3)Admin username：admin <BR>(4)Admin password：12345678 <BR>(5)Execution domain root：E:\bea\user_projects\domains\mydomain <BR>(6)Execution domain name：mydomain <BR>(7)Execution server name：myserver <BR>(8)Hostname:PortNumber：localhost:7001。 <BR>(9)Security policy file：E:\bea\weblogic81\server\lib\weblogic.policy <BR>(10)JAAS login configuration file：省略。 <BR><BR>接着展开WebLogic 8结点，点击JDK，在右边的WLS JDK name处选择WebLogic 8的默认JDK。这里组合框中缺省为j2re1.4.2_03，即之前单独安装的jre。单击Add按钮，弹出WebLogic &gt; Add JVM对话框，在JRE名称处随便输入一个名字，如jre1.4.1_02。然后在JRE主目录处选择WebLogic安装文件夹中的JDK文件夹，如E:\BEA\jdk141_02，程序会自动填充Javadoc URL文本框和JRE系统库列表框。单击确定按钮关闭对话框。这时候就可以在WLS JDK name组合框中选择jre1.4.1_02了。之后还要在下面的Optional Java VM arguments，如-ms64m -mx64m -Djava.library.path="E:/BEA/weblogic81/server/bin" -Dweblogic.management.discover=false -Dweblogic.ProductionModeEnabled=false<BR>&nbsp;<BR>最后点击Paths，在右边的Prepend to classpath列表框中，通过Add JAR/ZIP按钮，加入D:\BEA\weblogic81\server\lib\weblogic.jar、D:\BEA\weblogic81\server\lib\webservices.jar。如果用到数据库，还需把数据库的驱动类库加进来，这里我们用WebLogic自带的SQL Server数据库驱动库D:\BEA\weblogic81\server\lib\mssqlserver4v65.jar。 <BR>至此，MyEclipse中WebLogic8的配置工作就算完成了。下面可以看看在Eclipse中能否启动WebLogic了？自从安装了MyEclipse之后，Eclipse工具栏中就会有一个Run/Stop Servers下拉按钮。点击该按钮的下拉部分，选择“WebLogic 8\Start”菜单，即开始启动WebLogic了。通过查看下面的控制台消息，就可以知道启动是否成功，或有什么异常发生。停止WebLogic可选择“WebLogic\Stop”菜单。</FONT></P><img src ="http://www.blogjava.net/zyb9114/aggbug/25889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-29 15:38 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/29/25889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Ajax的挑战</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/29/25845.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Thu, 29 Dec 2005 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/29/25845.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25845.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/29/25845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25845.html</trackback:ping><description><![CDATA[<A class=f1><FONT color=#000000>&nbsp; </FONT>
<DIV class=guanggao><SPAN id=contentAdv></SPAN></DIV>
<P><FONT color=#000000>　　与任何技术一样，使用Ajax在相当多的方面都可能范错误。我在这儿讨论的问题目前都缺少解决方案，并将会随着Ajax的成熟而解决或提高。随着开发 Ajax应用经验的不断获取，开发者社区中将会出现最好的实践经验与指导方针。</FONT></P>
<P><FONT color=#000000>　　<STRONG>1、XMLHttpRequest的有效性</STRONG></FONT></P>
<P><FONT color=#000000>　　Ajax开发者面对的一个最大问题是当XMLHttpRequest不可用时如何反应。虽然大部分现代浏览器支持XMLHttpRequest，但还是有少量的用户，他们的浏览器不能支持，或由于浏览器安全设置而阻止对XMLHttpRequest的使用。若你的Web应用发布于公司内部的 Intranet上，你很可能可以指定支持哪种浏览器，并可以确保XMLHttpRequest是可用的。若你在公共WEB上发布，则你必须意识到由于假定XMLHttpRequest是可用的，所有就阻止了老浏览器、手持设备浏览器等等用户来使用你的系统。</FONT></P>
<P><FONT color=#000000>　　然而，你应该尽力保证应用系统“正常降级”使用，在系统中保留适用于不支持XMLHttpRequest的浏览器的功能。在购物车例子中，最好的方法是有一个Add to Cart按钮，可以进行常规的提交处理，并刷新页面来反映购物车状态的变化。Ajax行卫可以在页面被载入时通过JavaScript添加到页面中，只在 XMLHttpRequest可用的情况下，为每个Add to Cart按钮加上JavaScript处理函数。另一个方法是在用户登录时检测XMLHttpRequest，再决定是提供Ajax版本还是常规基于 form提交的版本。</FONT></P>
<P><FONT color=#000000>　　<STRONG>2、可用性考虑</STRONG></FONT></P>
<P><FONT color=#000000>　　围绕着Ajax应用的大部分问题都是很普通的问题。例如，让用户知道他们的输入已经被注册并处理，是很重要的，因为在XMLHttpRequest处理过程中并不能提供通常的漏斗旋转光标。一种方法是将“确认”按扭上的文本替换为“正在更新中…”，以避免用户在等待响应时多次点击按钮。</FONT></P>
<P><FONT color=#000000>　　另一个问题是，用户可能没有注意到他们正在观看的页面已经被更新。可以通过使用各种视觉技巧来将用户的眼光吸引到页面的更新区域。还有一个问题是通过 Ajax更新页面打断了浏览器“退回前页”按钮的正常工作，地址栏中的URL不能反映页面的全部状态，并且不能使用书签功能。参见Resource章节中列出的网站地址上的文章来了解更多Ajax应用关于可用性方面的问题。</FONT></P>
<P><FONT color=#000000>　　<STRONG>3、服务器负载</STRONG></FONT></P>
<P><FONT color=#000000>　　使用Ajax界面代替传统的基于form的界面可能戏剧性地增加传递到服务器的请求数量。例如，一个普通的Google搜索给服务器造成一次命中，并在用户确认搜索表单时发生。然而，Google Suggest，将会试图自动完成你的搜索词，在用户打字时将会往服务器发送多个请求。在开发一个Ajax应用时，要注意到你将会发送多少请求到用户器端，以及服务器的负载指标。你可以通过在客户端适当地缓存请求、与服务器响应来缓减负载压力。你也应该在设计Ajax应用时尽量在客户端处理更多的逻辑，而不用与服务器端通讯。</FONT></P>
<P><FONT color=#000000>　　<STRONG>4、处理异步</STRONG></FONT></P>
<P><FONT color=#000000>　　一定要记住，没有任何东西可以保证XMLHttpRequest将会按照它们被发送的顺序来依次结束。实际上，你在设计系统时，脑子里应该始终假定它们不会按原来顺序结束。在购物车例子中，使用了一个最后更新的时间戳来保证最新的数据不会被改写。这个非常基本的方法可以在购物车场景中工作，但可能不能在其它情况下工作。在设计时刻就要考虑你该如何处理异步服务器响应。</FONT></P>
<P><FONT color=#000000>　　<STRONG>结论</STRONG></FONT></P>
<P><FONT color=#000000>　　你现在应该对于Ajax的基本原则有了一个良好的了解，另外，你应该理解一些更高级的随Ajax方法而来的设计问题。创建一个成功的Ajax应用需要一系列的方法—从JavaScript UI设计到服务器端架构—但是你现在应该已经具备了需要使用到的Ajax核心知识。</FONT></P></A><img src ="http://www.blogjava.net/zyb9114/aggbug/25845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-29 10:40 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/29/25845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解读Web 2.0流行词</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/29/25844.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Thu, 29 Dec 2005 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/29/25844.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25844.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/29/25844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25844.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25844.html</trackback:ping><description><![CDATA[<A class=f1><FONT color=#000000>&nbsp; </FONT>
<DIV class=guanggao><SPAN id=contentAdv></SPAN></DIV>
<P><FONT color=#000000>　　<STRONG>什么是web 2.0?</STRONG></FONT></P>
<P><FONT color=#000000>　　到目前为止，关于Web2.0并没有清晰的定义。业内普遍的一种说法是，微内容是Web2.0的一个关键词。其中，微内容包括个人所形成的任何数据:比如一则网志、一个评论、一幅图片、收藏的书签、喜好的音乐列表、想结交的朋友等等。这些微内容，充斥在了人们的生活、工作和学习的方方面面。而Web2.0重点要解决的正是对这些微内容的重新发现和利用。于是，我们看到了这样的现象，只要是和微内容相关的技术和架构，都是以Web2.0为名义的。</FONT></P>
<P><FONT color=#000000>　　就目前的发展情况而言，Web2.0是以 Flickr、Craigslist、Linkedin、Tribes、Ryze、 Friendster、Del.icio.us、43Things.com等网站为代表，以Blog、TAG、SNS、RSS、wiki等应用为核心，依据六度分隔、xml、ajax等新理论和技术实现的互联网新一代模式。</FONT></P>
<P><FONT color=#000000>　　<STRONG>什么是博客(Blog)?</STRONG></FONT></P>
<P><FONT color=#000000>　　BLOG也就是WEB LOG的缩写简单来说就是网络日记。一种极其简易便捷的网络个人出版形式，使得任何一位网民都可以在几分钟之内拥有自己的个人网站，自由挥写。但是，越简单越难定义，人们对于博客的理解千姿百态，:博客代表着“新闻媒体3.0”:旧媒体→新媒体→互媒体(硅谷最著名的IT专栏作家丹·吉尔摩);博客是继E-mail、BBS、ICQ(IM)之后的第四种</FONT><A class=bluekey href="http://www.yesky.com/key/1135/166135.html" target=_blank><FONT color=#000000>网络交流</FONT></A><FONT color=#000000>方式;博客就是一个人未经编辑的声音(戴夫·温纳);博客是互联网上独立的思想泡泡(JamesSnell);博客是媒体的开放源代码运动(方兴东);博客是“个人出版2.0”(孙坚华);博客是用文字进行对话的网上咖啡屋(《博客手册》)……著名IT记者和专栏作家保罗·安得鲁斯认为，博客以及其他网络新闻的崛起，在一定程度上是因为媒体</FONT><A class=bluekey href="http://www.yesky.com/key/2613/167613.html" target=_blank><FONT color=#000000>巨头</FONT></A><FONT color=#000000>在公信力方面的快速衰落，他们要努力推翻传统媒体的“守门人”:“新一类新闻记者正在兴起，他们以直接来自新闻源的‘原始素材’为基础。这些记者正在进行新的试水……是对体制官僚化的媒体的报复性破坏……博客改变了‘新闻’从个人传播到公众的信息流动的本性……只要一摁‘张贴’键，任何人都可以出版自己的</FONT><A class=bluekey href="http://www.yesky.com/key/1390/166390.html" target=_blank><FONT color=#000000>作品</FONT></A><FONT color=#000000>，这将改变传统媒体出版模式。”</FONT></P>
<P><FONT color=#000000>　　<STRONG>什么是播客?</STRONG></FONT></P>
<P><FONT color=#000000>　　播客，即英文的Podcast或Podcasting，这个词来源自苹果电脑的"iPod"与"广播"(broadcast)的合成词，其指的是一种在互联网上发布文件并允许用户订阅feed以自动接收新文件的方法，或用此方法来制作的电台节目。这种新方法在2004年下半年开始在互联网上流行以用于发布音频文件。</FONT></P>
<P><FONT color=#000000>　　播客与其他音频内容传送的区别在于其订阅模式，它使用RSS 2.0文件格式传送信息。该技术允许个人进行创建与发布，这种新的传播方式使得人人可以说出他们想说的话。</FONT></P>
<P><FONT color=#000000>　　<STRONG>什么是Tag?</STRONG></FONT></P>
<P><FONT color=#000000>　　Tag(中文叫做“标签”) 是一种新的组织和管理在线信息的方式。它不同于传统的、针对文件本身的关键字检索，而是一种模糊化、智能化的分类。 Tag是一种更为灵活、有趣的分类方式，您可以为每篇日志、每个帖子或者每张图片等添加一个或多个Tag(标签)，你可以看到网站上所有和您使用了相同Tag的内容，由此和他人产生更多的联系。Tag体现了群体的力量，使得内容之间的相关性和用户之间的交互性大大增强。</FONT></P>
<P><FONT color=#000000>　　<STRONG>什么是RSS?</STRONG></FONT></P>
<P><FONT color=#000000>　　RSS就是一种简单的信息发布和传递方式，使得一个网站可以方便地调用其他提供RSS订阅服务的网站的内容，从而形成“新闻聚合”，让网站发布的内容在更大的范围内传播。</FONT></P>
<P><FONT color=#000000>　　如果从RSS阅读者的角度来看，RSS获取信息的模式与加入邮件列表获取信息有一定的相似之处，也就是可以不必登录各个提供信息的网站而通过客户端浏览方式(称为“RSS阅读器”)或者在线RSS阅读方式这些内容。</FONT></P>
<P><FONT color=#000000>　　<STRONG>什么是Wiki?</STRONG></FONT></P>
<P><FONT color=#000000>　　Wiki一词来源于夏威夷语的 "wee kee wee kee" ，原本是“快点”的意思。在这里Wiki指一种超文本系统。这种超文本系统支持面向社群的协作式写作，同时也包括一组支持这种写作的辅助工具。我们可以在Web的基础上对Wiki文本进行浏览、创建、更改，而且创建、更改、发布的代价远比HTML文本为小;同时Wiki系统还支持面向社群的协作式写作，为协作式写作提供必要帮助;最后，Wiki的写作者自然构成了一个社群，Wiki系统为这个社群提供简单的交流工具。与其它超文本系统相比，wiki有使用方便及开放的特点，所以wiki系统可以帮助我们在一个社群内共享某领域的知识。</FONT></P>
<P><FONT color=#000000>　　<STRONG>什么是AJAX?</STRONG></FONT></P>
<P><FONT color=#000000>　　Ajax并不是一种技术。它实际上是几种已经在各自领域大行其道技术的强强结合。Ajax混合了:</FONT></P>
<P><FONT color=#000000>　　*基于XHTML/CSS</FONT></P>
<P><FONT color=#000000>　　* 由DOM(Document Object Model)实现动态显示与交互</FONT></P>
<P><FONT color=#000000>　　* 通过XML和XSLT进行数据交换及处理</FONT></P>
<P><FONT color=#000000>　　* 使用JavaScript整合上述技术</FONT></P>
<P><FONT color=#000000>　　直观一点的说Ajax能够实现不刷新浏览器窗口(当然更不用安装额外的插件)而满足用户的操作，现在一些看上去很Cool的网站，很多是用这项技术实现的，其中包括:orkut、Gmail、Google Group、Google Suggest、Google Maps、Flickr、</FONT><A class=bluekey href="http://www.yesky.com/key/2482/167482.html" target=_blank><FONT color=#000000>A9</FONT></A><FONT color=#000000>.com等。</FONT></P>
<P><FONT color=#000000>　　<STRONG>什么是SNS?</STRONG></FONT></P>
<P><FONT color=#000000>　　SNS:Social Network Sofwaret，社会性网络软件，依据六度理论，以认识朋友的朋友为基础，扩展自己的</FONT><A class=bluekey href="http://www.yesky.com/key/683/165683.html" target=_blank><FONT color=#000000>人脉</FONT></A><FONT color=#000000>。并且无限扩张自己的人脉，在需要的时候，可以随时获取一点，得到该人脉的帮助。</FONT></P>
<P><FONT color=#000000>　　六度关系理论:美国著名社会心理学家米尔格伦(Stanley Milgram)于20世纪60年代最先提出，在人际脉络中，要结识任何一位陌生的朋友，这中间最多只要通过六个朋友就能达到目的。就是说你想认识一个人，托朋友找朋友找认识他的人，之间不会超过六个人。</FONT></P>
<P><FONT color=#000000>　　在经济高速发展的今天，人际关系的作用愈发明显，人脉资源对于一个人的成功非常重要。目前很多职业人士在人际资源方面其实都比较匮乏，因此SNS这种新兴的网络社交方式一出现，迅速流行欧美国家，已经成为精英阶层拓展人际关系的主要方式之一。</FONT></P><img src ="http://www.blogjava.net/zyb9114/aggbug/25844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-29 10:37 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/29/25844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用AJAX开发智能Web应用程序之高级篇</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/29/25839.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Thu, 29 Dec 2005 02:19:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/29/25839.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25839.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/29/25839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25839.html</trackback:ping><description><![CDATA[<A class=f1><FONT color=#000000>&nbsp; 　　<STRONG>一、 引言</STRONG> </FONT>
<P><FONT color=#000000>　　在第一部分中，我们讨论了AJAX基础——建立从脚本到服务器的通讯的能力，这正是使HTML页面具有动态能力的原因所在。然而，这就意味着我们已准备好抛弃我们自己版本的Yahoo邮件吗?不，还没有。原因在于:AJAX是一个混合的祝福。一方面，它使我们能够在Web上创建丰富的桌面级的应用程序;另一方面，如果我们把"翻页面式"的Web应用程序与客户端/服务器或Swing版本的程序进行比较，那么会看到其开发实践并不很相同。我们将需要习惯于这样的事实:构建一个丰富的UI需要时间。须知，允许用户实现更大的灵活性也就相应地需要付出更多的时间为代价。</FONT></P>
<P><FONT color=#000000>　　最后的答案当然要依赖于大量的组件库、框架以及具有工业力量的开发工具。且不考虑工具，本文集中于讨论在今天对于AJAX热心者有哪些技术是可用的。在强调需要构建可重用的商业组件的同时，本文将重点分析"隐含的"JavaScript中的面向对象的力量。另外，在强调需要构建定制的UI组件的同时，本文将介绍一个简便的方法——用定制的客户端HTML标签来封装描述逻辑。</FONT></P>
<P><FONT color=#000000>　　<STRONG>二、 AJAX语言——对象面向的JavaScript</STRONG></FONT></P>
<P><FONT color=#000000>　　由定义来看，JavaScript是典型的AJAX语言。不同于Java，JavaScript并不强调OO风格的编码。然而，令人吃惊的是JavaScript居然全面支持所有的OO语言的主要属性:封装、继承和多态性。Douglas Crockford甚至称JavaScript是"世界上最易被误解的编程语言"。让我们回顾一下JavaScript的面向对象的地方吧。</FONT></P>
<P><FONT color=#000000>　　<STRONG>数据类型</STRONG></FONT></P>
<P><FONT color=#000000>　　在Java中，一个类定义了一个数据和它的相关行为的组合。尽管JavaScript保留了class关键字，但是它不支持与常规OOP语言一样的语义。</FONT></P>
<P><FONT color=#000000>　　这听起来可能觉得奇怪，但是在JavaScript中，对象是用函数来定义的。事实上，通过在下面的示例中定义一个函数，你就定义了一个简单的空类Calculator:</FONT></P>
<P><FONT color=#000000>function Calculator() {}</FONT></P>
<P><FONT color=#000000>　　一个新的实例的创建与在Java中相同-使用new操作符:</FONT></P>
<P><FONT color=#000000>var myCalculator = new Calculator();</FONT></P>
<P><FONT color=#000000>　　上面这个函数不仅定义一个类，而且还担当了一个构造器。在此，操作符new实现了这一魔术-实例化一个类Calculator的对象并且返回一个对象参考而不是只调用该函数。</FONT></P>
<P><FONT color=#000000>　　创建这样的空类是没错，但在实际中并没有多大用处。下面，我们准备使用一个Java-脚本原型结构来填充类定义。JavaScript使用原型当作创建对象的模板。所有的原型属性和方法被参考引用地复制到一个类的每个对象中，所以它们都具有相同的值。你可以改变一个对象中的原型属性的值，并且该新值会覆盖从原型中复制过来的缺省值，但是这仅对于在一个实例中。下列语句将把一个新属性添加到Calculator对象的原型上:</FONT></P>
<P><FONT color=#000000>Calculator.prototype._prop = 0;</FONT></P>
<P><FONT color=#000000>　　既然JavaScript并没有提供一个方法来从句法上表示一个类定义，那么我们将使用with语句来标记该类的定义边界。这也将使得示例代码更为短小，因为该with语句被允许在一个指定的对象上执行一系列的语句而不需要限制属性。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>function Calculator() {};<BR>with (Calculator) {<BR>　prototype._prop = 0;<BR>　prototype.setProp = function(p) {_prop = p};<BR>　prototype.getProp = function() {return _prop};<BR>}</FONT></P>
<P><FONT color=#000000>　　到目前为止，我们定义了并且初始化了公共变量_prop，并且为它提供了getter和setter方法。</FONT></P>
<P><FONT color=#000000>　　需要定义一个静态变量?你可以把静态变量当作是为类所拥有的一个变量。因为在JavaScript中的类用函数对象来描述，所以我们只需要把一个新属性添加到该函数上:</FONT></P>
<P><FONT color=#000000>Calculator.iCount=0;</FONT></P>
<P><FONT color=#000000>　　现在，既然这个iCount变量是一个Calculator对象的属性，那么它将会被类Calculator的所有实例所共享。</FONT></P>
<P><FONT color=#000000>function Calculator() {Calculator.iCount++;};</FONT></P>
<P><FONT color=#000000>　　上面的代码计算类Calculator的所有实例的个数。<BR><BR></FONT></A><A class=f1><FONT color=#000000>&nbsp;</FONT></P>
<DIV class=guanggao><SPAN id=contentAdv><FONT color=#000000></FONT></SPAN></DIV>
<P><FONT color=#000000></FONT></P>
<P><FONT color=#000000>　　<STRONG>封装</STRONG></FONT></P>
<P><FONT color=#000000>　　通过使用如上面所定义的"Calculator"，我们可以存取所有的"class"数据;然而，这增加了派生类中命名冲突的危险性。我们明显地需要封装以把对象看作自包含的实体。</FONT></P>
<P><FONT color=#000000>　　数据封装的一种标准语言机制是使用私有变量。并且一个常用的仿效一个私有变量的JavaScript技术是在构造器中定义一个局部变量;这样以来，该局部变量的存取只能经由getter和setter来实现-它们是该构造器中的内部函数。在下列实例中，_prop变量在Calculator函数中定义并且在函数范围外不可见。其中有两个匿名的内部函数(分别被赋予setProp和getProp属性)让我们存取"私有"变量。另外，请注意，这里this的使用-十分相似于在Java中的用法:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>function Calculator() {<BR>　var _prop = 0;<BR>　this.setProp = function (p){_prop = p};<BR>　this.getProp = function() {return _prop};<BR>};</FONT></P>
<P><FONT color=#000000>　　常常被忽视的是在JavaScript中作如此封装所付出的代价。须知，这种代价可能是巨大的，因为内部函数对象对于该"class"的每一个实例被不断地重复创建。</FONT></P>
<P><FONT color=#000000>　　因此，既然基于原型构建对象速度更快并且消费更少些的内存，那么我们在最强调性能的场所特别支持使用公共的变量。请注意，你可以使用命名惯例来避免名称冲突-例如，在公共的变量的前面加上该类名。</FONT></P>
<P><FONT color=#000000>　　<STRONG>继承</STRONG></FONT></P>
<P><FONT color=#000000>　　乍看之下，JavaScript缺乏对类层次的支持，这很相似于面向对象语言的程序员对于现代语言的期盼。然而，尽管JavaScript句法没有象Java一样支持类继承，但是我们仍然能够在JavaScript中实现继承-通过把已定义类的一个实例拷贝到其派生类的原型当中。</FONT></P>
<P><FONT color=#000000>　　在我们提供举例之前，我们需要介绍一个constructor属性。JavaScript保证每一个原型中包含constructor-它拥有到该构造器函数的一个参考。换句话说，Calculator.prototype.constructor包含一个到Calculator()的参考。</FONT></P>
<P><FONT color=#000000>　　现在，下面的代码显示了怎样从基类Calculator派生类ArithmeticCalculator。其中，"第一行"取得类Calculator的所有的属性，而"第二行"把原型constructor的值恢复成ArithmeticCalculator:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>function ArithmeticCalculator() { };<BR>with (ArithmeticCalculator) {<BR>　ArithmeticCalculator .prototype = new Calculator();//第一行<BR>　prototype.constructor = ArithmeticCalculator;//第二行<BR>}</FONT></P>
<P><FONT color=#000000>　　就算上面的实例看起来象一个合成体而不象是继承，但是JavaScript引擎还是清楚这个原型链的。特别是，instanceof操作符会正确地适用于基类和派生类。假定你创建类ArithmeticCalculator的一个新实例:</FONT></P>
<P><FONT color=#000000>var c = new ArithmeticCalculator;</FONT></P>
<P><FONT color=#000000>　　表达式c instanceof Calculator和c instanceof ArithmeticCalculator都会成立。</FONT></P>
<P><FONT color=#000000>　　注意，在上面示例中的基类的constructor是在初始化ArithmeticCalculator原型时被调用的，而在创建派生类的实例时是不被调用的。这可能会带来不想要的负面影响，而且为了实现初始化你应该考虑创建一个独立的函数。由于该构造器并不是一个成员函数，所以它无法通过this参考引用调用。我们将需要一个能调用超类的"Calculator"成员函数:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" color=#000000>function Calculator(ops) { ...};<BR>with (Calculator) { prototype.Calculator=Calculator;}</FONT></P>
<P><FONT color=#000000>　　现在，我们可以写一个继承类-它显式地调用基类的构造器:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd"><FONT color=#000000>function ArithmeticCalculator(ops) { this.Calculator(ops);};<BR>with (ArithmeticCalculator) {<BR>　ArithmeticCalculator .prototype = new Calculator;<BR>　prototype.constructor = ArithmeticCalculator;<BR>　prototype.ArithmeticCalculator = ArithmeticCalculator;<BR>}</FONT></P></FONT></A><A class=f1></A>
<P><FONT color=#000000>　　<STRONG>多态性</STRONG></FONT></P>
<P><FONT color=#000000>　　JavaScript是一种非类型化的语言-在此，一切都是对象。因此，如果有两个类A和B，它们都定义一个foo()，那么JavaScript将允许在A和B的实例上多态地调用foo()-即使不存在层次关系(虽然是可实现的)。从这一角度来看，JavaScript提供一个比Java更宽的多态性。这种灵活性，象往常一样，也要付出代价。在这种情况中，代价是把类型检查工作代理到应用程序代码。具体地说，如果需要检查一个参考确实指向一个所希望的基类，那么这可以通过instanceof操作符来实现。</FONT></P>
<P><FONT color=#000000>　　另一方面，JavaScript并不检查函数调用中的参数-这可以防止用一样的命名和不同的参数来定义多态函数(并且让编译器选择正确的签名)。代之的是，JavaScript提供了一个Java 5风格的函数范围内的argument对象-它允许你根据参数的类型和数量的不同而实现一个不同的行为。</FONT></P>
<P><FONT color=#000000>　　<STRONG>三、 示例展示</STRONG></FONT></P>
<P><FONT color=#000000>　　本文所附源码列表1实现了一个计算器-它可以计算以一个逆向波兰式标志的表达式。该示例展示了本文中所介绍的主要技术并且也介绍了一些独特的JavaScript特性的用法，例如在一个动态函数调用中以一个数组元素的方式访问对象属性。</FONT></P>
<P><FONT color=#000000>　　为了使列表1工作，我们需要另外准备一些代码-它们用于实例化该计算器对象并且调用evaluate方法:</FONT></P>
<P><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd">var e = new ArithmeticCalcuator([2,2,5,"add","mul"]);<BR>alert(e.evaluate());</FONT> </FONT></P>
<P><FONT color=#000000>　　<STRONG>四、 AJAX组件授权</STRONG></FONT></P>
<P><FONT color=#000000>　　所有的AJAX组件授权方案在今天被逻辑地分成两组。具体地说，第一组用于与基于HTML的UI定义的无缝集成。第二组把HTML当作一个UI定义语言以支持某种XML。在本文中，我们从第一组中来展示一种方法-虽然它存在于浏览器之中却是类似于JSP标签。这些浏览器特定的组件授权扩展在IE情形下称作元素行为，而在最近版本的Firefox，Mozilla和Netscape 8情形下称作可扩展的绑定。</FONT></P>
<P><FONT color=#000000>　　<STRONG>五、 定制标签</STRONG></FONT></P>
<P><FONT color=#000000>　　Internet Explorer，从版本5.5开始，支持定制的客户端HTML元素的JavaScript授权。不象JSP标签，这些对象并没有在服务器端被预处理到HTML中。而是，它们成为一标准HTML对象模型的合法扩展，并且包括构造控件在内的一切事情，都是动态地发生在客户端的。同样，基于Gecko-引擎的浏览器能够用一个可重用功能动态地装饰任何现有的HTML元素。</FONT></P>
<P><FONT color=#000000>　　因此，我们有可能用具有HTML语法的方法、事件和属性来构建一个具有丰富的UI组件的库。这样的组件可以被自由地混合于标准HTML中。内部地，这些组件将会与应用程序服务器进行通讯-以AJAX风格。换句话说，你有可能(并且相对简单地)构建自己的AJAX对象模型。</FONT></P>
<P><FONT color=#000000>　　这种IE风味的方法被称为HTC或HTML组件;其Gecko版本被称为XBL-可扩展的绑定语言(eXtensible Bindings Language)。为了实现本文目的，我们集中于讨论IE。</FONT></P>
<P><FONT color=#000000>　　<STRONG>六、 输入HTML组件-HTC</STRONG></FONT></P>
<P><FONT color=#000000>　　HTC或HTML组件也被称作行为。它们被划分为两种类型:一种是依附的行为-用一组属性、事件和方法装饰任何现有的HTML元素;另一种是元素行为-看上去象宿主页面的定制的HTML标签的一个扩展集合。依附的行为和元素行为一起提供了开发组件和应用程序的一种简单方案。在此，我们将展示一下最为综合的情形-元素行为。</FONT></P>
<P><FONT color=#000000>　　<STRONG>数据绑定复选框控件</STRONG></FONT></P>
<P><FONT color=#000000>　　为了展示元素行为，我们将构建一个定制的数据绑定复选框。构建这样一个控件背后的基本原因在于，一个标准HTML复选框具有下面若干显著的缺点:</FONT></P>
<P><FONT color=#000000>　　·需要应用程序编码来把"checked"属性的值映射到商业域值，例如"Y[es]"/"N[o]"，"M[ale]"/"F[emale]"，等等。HTML复选框使用"checked"属性，而许多其它HTML控件使用的则是"value"属性。</FONT></P>
<P><FONT color=#000000>　　·需要应用程序编码来维持该控件的状态(修改过的/未修改过的)。这实际上是在所有的HTML控件普遍存在的一个问题。</FONT></P>
<P><FONT color=#000000>　　·需要应用程序编码才能创建一个关联标签-它应该接受鼠标点击并相应地改变该复选框的状态。</FONT></P>
<P><FONT color=#000000>　　·标准HTML复选框不支持"校验"事件以允许取消一个GUI行为，而这种要求可能存在于某些应用程序中。</FONT></P>
<P><FONT color=#000000>　　现在，让我们看一个正在构建的该控件的用法示例，它的用法可能如下情形:</FONT></P>
<P><FONT face=Verdana><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd">＜checkbox id="cbx_1" value="N" labelonleft="true"<BR>label="Show Details:" onValue="Y" offValue="N"/＞</FONT> </FONT></FONT>
<P><FONT color=#000000>　　另外，我们的控件将支持可取消的事件onItemChanging和通知事件onItemChanged。<BR><BR></FONT><A class=f1><FONT color=#000000>&nbsp;</FONT></P>
<DIV class=guanggao><SPAN id=contentAdv><FONT color=#000000></FONT></SPAN></DIV>
<P><FONT color=#000000></FONT></P>
<P><FONT color=#000000>　　<STRONG>定义定制标签</STRONG></FONT></P>
<P><FONT color=#000000>　　<FONT face=Verdana>从结构上讲，一个定制标签是一个具有一个HTC扩展名的文件-它在＜PUBLIC:COMPONENT＞和＜/PUBLIC:COMPONENT＞标志之间对它的属性，方法和事件加以描述。</FONT></FONT></P>
<P><FONT color=#000000>　　为了定义一个定制CHECKBOX标签，我们创建一个如下列代码片断中的文件checkbox.htc-其中，第一行负责设置该组件的标签名:</FONT></P>
<P><FONT face=Verdana><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd">＜PUBLIC:COMPONENT NAME="cbx" tagName="CHECKBOX"＞<BR>＜PROPERTY NAME="value" GET="getValue" PUT="putValue" /＞<BR>//我们把组件的所有另外的属性放在这里<BR>＜METHOD NAME="show" /＞<BR>//我们把组件的所有另外的方法放在这里<BR>＜EVENT NAME="onItemChanging" ID="onItemChanging"/＞<BR>//我们把组件将向应用程序激活的所有另外的事件放在这里<BR>＜ATTACH EVENT="oncontentready" HANDLER="constructor" /＞<BR>//我们把组件自己处理的另外的事件放在这里<BR>＜SCRIPT＞<BR>//我们把所有的方法，属性getters和setters和事件处理器放在这里<BR>＜/SCRIPT＞<BR>＜/PUBLIC:COMPONENT＞</FONT> </FONT></FONT></P>
<P><FONT color=#000000>　　<STRONG>使用定制标签</STRONG></FONT></P>
<P><FONT color=#000000>　　尽管HTC文件的内容比较重要，但是这与其文件名是什么无关。值得注意的是，指向该HTC文件的URL需要被使用IMPORT指令指定-这必须在相应的定制标签第一次出现之前(在页面上)完成。下面是最简单的可能的页面使用一个定制的复选框可能看上去的样子-假定该页面和HTC文件处理同一个文件夹下:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>＜HTML xmlns:myns＞<BR>＜?IMPORT namespace="myns" implementation="checkbox.htc" ＞<BR>＜BODY＞<BR>＜myns:checkbox id='cbx_1' label='Hello'/＞<BR>＜/BODY＞<BR>＜/HTML＞</FONT></P>
<P><FONT color=#000000>　　请注意，定制CHECKBOX是怎样在打开的HTML标签中被映射到一个非缺省的命名空间"myns"的。这个IMPORT指令实现把HTC同步加载到浏览器的内存并且还指示浏览器怎样为适当的命名空间实现名称确定的(HTC到命名空间的关联可能是多对一的)。</FONT></P>
<P><FONT color=#000000>　　<STRONG>定制标签的构造器</STRONG></FONT></P>
<P><FONT color=#000000>　　最好的初始化HTC的方法是，一旦它被装载就处理oncontentready事件。因此，我们可以定义处理器函数-为了概念清晰起见，我们称之为构造器:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>＜ATTACH EVENT="oncontentready" HANDLER="constructor" /＞</FONT><ATTACH HANDLER="constructor" EVENT="oncontentready"></ATTACH></P>
<P><FONT color=#000000>　　constructor()的逻辑是简单的:根据属性labelonleft的值(见下面的属性定义)按顺序连接一个常规HTML复选框和HTML标签:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>function constructor() {<BR>　//我们将把一个HTML复选框和标签添加到元素体<BR>　//详细情形见列表2<BR>}</FONT></P>
<P><FONT color=#000000>　　定义定制标签属性</FONT></P>
<P><FONT color=#000000>　　为了定义属性labelonleft，我们又在</FONT><PUBLIC:COMPONENT><FONT color=#000000>部分加上一行:</FONT></P>
<P><FONT color=#000000><FONT face=Verdana><FONT style="BACKGROUND-COLOR: #dddddd">＜PROPERTY NAME="labelonleft" VALUE="true"/＞</FONT> </FONT>　　<PROPERTY NAME="labelonleft" VALUE="true"></PROPERTY></FONT></P>
<P><FONT color=#000000>　　请注意，这个属性并没有包含getter和/或setter方法。属性onValue和offValue不仅提供了从复选框状态到一个商业值域的映射而且不需要getters和setters:</FONT></P>
<P><FONT face=Verdana><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd">＜PROPERTY NAME="onValue" VALUE="true"/＞<BR>＜PROPERTY NAME="offValue" VALUE="false" /＞</FONT> </FONT></FONT></P>
<P><FONT color=#000000>　　然而，属性checked是用两个getter和setter定义的:</FONT></P>
<P><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana>＜PROPERTY NAME="checked" GET="getChecked" PUT="putChecked" /＞</FONT>　<PROPERTY NAME="checked" PUT="putChecked" GET="getChecked"></PROPERTY></FONT></P>
<P><FONT color=#000000>　　因此，<FONT face=Verdana>我们在＜SCRIPT＞部分建立了上面两个方法的定义。正如你所见，setter putChecked()-将在每次复选框状态改变时激发-把value属性设置为下面两个变体之一：onValue或OffValue。请注意，putChecked()将不仅可由在复选框-宿主页面中的脚本触发，而且也能通过在checkbox.htc中的相应的任何赋值操作触发。</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana><FONT color=#000000>var _value;<BR>function putChecked( newValue ) {<BR>　value = (newValue?onValue:offValue);<BR>}<BR>function getChecked(){<BR>　return ( _value == onValue);<BR>} </FONT></P></FONT></PUBLIC:COMPONENT></A>
<P><FONT face=Verdana><FONT color=#000000>　　<STRONG>七、 为定制标签定义事件</STRONG></FONT></FONT></P>
<P><FONT face=Verdana color=#000000>　　让我们看一下onItemChanging和onItemChanged事件的定义以及这些事件是怎样在value属性的setter内部被激发和处理的（见所附源码中的列表2）。方法putValue()有几个让人感兴趣的地方。首先，在分析CHECKBOX标签期间，可以调用这个方法-只要指定这个HTMLvalue属性。这正解释了为什么我们为非构造对象建立一个单独的逻辑分支-为把构造过程与一个对用户击键的反应区别开来。其次，在此我们展示了定制事件onItemChanging的创建和处理-它允许应用程序取消行为。请注意，通过这种方式，无论是击键还是通过编程方式实现赋值都能达到取消的目的。</FONT></P>
<P><FONT face=Verdana><FONT color=#000000>　　<STRONG>事件取消</STRONG></FONT></FONT></P>
<P><FONT face=Verdana color=#000000>　　为了取消事件，一个应用程序应该拦截该事件并且把event.returnValue设置为false。下面的代码片断展示了应用程序是怎样实现取消事件过程的：</FONT></P>
<P><FONT face=Verdana><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd">cbx_1::onItemChanging() {<BR>. . . . .<BR>if (canNotBeAllowed) {<BR>　event.returnValue=false;<BR>　. . . . .<BR>}</FONT> </FONT></FONT></P>
<P><FONT face=Verdana color=#000000>　　如果事件没被取消，putValue()把内部的普通HTML复选框的checked属性设置为每个相应的当前值-如果它等于onValue，这个内部复选框将被选中；如果它等于offValue(不存在第三种选择)，复选框不被选中(完整的列表见本文所附源码中的列表2)。</FONT></P>
<P><FONT face=Verdana><FONT color=#000000>　　<STRONG>复选框的HTML内幕</STRONG></FONT></FONT></P>
<P><FONT face=Verdana color=#000000>　　我们控件的绘制是通过助理函数addLabel()和addCheckBox()来实现的并且从一个constructor()内部调用。这些函数把HTML注入进元素的innerHTML。这种注入式HTML的一种简化形式如下所示：</FONT></P>
<P><FONT face=Verdana><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd">＜LABEL for=cb_{uniqueID}＞Show Details:＜/LABEL＞<BR>＜INPUT id=cb_{uniqueID} type=checkbox /＞</FONT>&nbsp; </FONT></FONT></P>
<P><FONT face=Verdana color=#000000>　　在此，uniqueID是一个由IE所生成的唯一的（在一个页面内）字符串-它用来识别HTC的实例。</FONT></P>
<P><FONT face=Verdana><FONT color=#000000>　　<STRONG>八、 再封装</STRONG></FONT></FONT></P>
<P><FONT face=Verdana color=#000000>　　在我们的CHECKBOX中有一个缺点。按照我们建立它的方式，在constructor()期间被注入的HTML将隶属于宿主该HTC的页面的DOM。而且，全局的JavaScript变量like_value属于它们所在的文档的全局范围。这是危险的，因为我们偶然会遇到命名冲突的可能性：最明显的情形是使用同一个组件的多个实例。另外这还会导致一个可能性-我们的控件可能会偶然地用相同的名称参考其它对象，反之也如此。</FONT></P>
<P><FONT face=Verdana color=#000000>　　为简化起见，需要建立一种专门的机制来为对象授权启动一个真正模块化方法。幸好，HTC技术支持一种智能答案-viewLink。<BR>　 <BR>　　把一个控件声明为封装的最容易的方法是把一个额外声明放到打开和关闭的PUBLIC:COMPONENT标签之间：</FONT></P>
<P><FONT face=Verdana color=#000000>＜PUBLIC:DEFAULTS viewLinkContent/＞&nbsp; </FONT></P>
<P><FONT face=Verdana color=#000000>　　该控件立即就变成封装性的；而且它有自己的HTML文档树-成为主文档的原子组件。该对象的每个实例有它自己的实例值的集合并且只有公共方法和属性能够从外界代码中加以存取。换句话说，该viewLink机制充分地启动了复杂的Web应用程序的设计和实现-通过使用一种真正的OO的基于组件的方法。</FONT></P>
<P><FONT face=Verdana color=#000000>　　特别地，我们可以简化代码-通过从内部复选框和HTML标签的定义中删除uniqueID后缀，因为我们不再担心命名冲突。因此，我们可以替换下面这一行：</FONT></P>
<P><FONT face=Verdana color=#000000>eval( 'cb_'+uniqueID).checked = ( _value == onValue );&nbsp; </FONT></P>
<P><FONT face=Verdana color=#000000>　　用</FONT></P>
<P><FONT face=Verdana color=#000000>cb.checked = ( _value == onValue ); </FONT></P>
<P><FONT face=Verdana color=#000000>　　并相应地改变addCheckbox()和addLabel()。</FONT></P>
<P><FONT face=Verdana><FONT color=#000000>　　<STRONG>九、 结论</STRONG></FONT></FONT></P>
<P><FONT face=Verdana color=#000000>　　既然AJAX竞赛刚刚开始，那么就不存在什么AJAX标准并且没有现成的你可以依赖以构建你的应用程序的可广为接受的RAD工具。虽然软件供应商们可能还需要较长一段时间来创建这种强健的开发平台，AJAX热心者已经开始着手准备-通过一些良好定义的API把可重用的代码块封装为商业组件。</FONT></P>
<P><FONT color=#000000><FONT face=Verdana>　　以这种方向导航，本文概括了AJAX语言的OO"力量"-JavaScript。另外，还展示了一种可用的组件-授权策略-客户端定制标签技术。我们在仅描述IE特定的定制标签的同时，还另外提供了一个可下载的实例-适于Mozilla浏览器的可扩展的绑定实例。</FONT>
<SCRIPT>部分建立了上面两个方法的定义。正如你所见，setter putChecked()-将在每次复选框状态改变时激发-把value属性设置为下面两个变体之一:onValue或OffValue。请注意，putChecked()将不仅可由在复选框-宿主页面中的脚本触发，而且也能通过在checkbox.htc中的相应的任何赋值操作触发。</p>
<p>　　var _value;</p>
<p>　　function putChecked( newValue ) {</p>
<p>　　value = (newValue?onValue:offValue);</p>
<p>　　}</p>
<p>　　function getChecked(){</p>
<p>　　return ( _value == onValue);</p>
<p>　　}</p>
<p>　　七、 为定制标签定义事件</p>
<p>　　让我们看一下onItemChanging和onItemChanged事件的定义以及这些事件是怎样在value属性的setter内部被激发和处理的(见所附源码中的列表2)。方法putValue()有几个让人感兴趣的地方。首先，在分析CHECKBOX标签期间，可以调用这个方法-只要指定这个HTMLvalue属性。这正解释了为什么我们为非构造对象建立一个单独的逻辑分支-为把构造过程与一个对用户击键的反应区别开来。其次，在此我们展示了定制事件onItemChanging的创建和处理-它允许应用程序取消行为。请注意，通过这种方式，无论是击键还是通过编程方式实现赋值都能达到取消的目的。</p>
<p>　　事件取消</p>
<p>　　为了取消事件，一个应用程序应该拦截该事件并且把event.returnValue设置为false。下面的代码片断展示了应用程序是怎样实现取消事件过程的:</p>
<p>　　cbx_1::onItemChanging() {</p>
<p>　　. . . . .</p>
<p>　　if (canNotBeAllowed) {</p>
<p>　　event.returnValue=false;</p>
<p>　　. . . . .</p>
<p>　　}</p>
<p>　　如果事件没被取消，putValue()把内部的普通HTML复选框的checked属性设置为每个相应的当前值-如果它等于onValue，这个内部复选框将被选中;如果它等于offValue(不存在第三种选择)，复选框不被选中(完整的列表见本文所附源码中的列表2)。</p>
<p>　　复选框的HTML内幕</p>
<p>　　我们控件的绘制是通过助理函数addLabel()和addCheckBox()来实现的并且从一个constructor()内部调用。这些函数把HTML注入进元素的innerHTML。这种注入式HTML的一种简化形式如下所示:</p>
<p>　　<LABEL for=cb_{uniqueID}>Show Details:</LABEL></p>
<p>　　<INPUT id=cb_{uniqueID} type=checkbox /></p>
<p>　　在此，uniqueID是一个由IE所生成的唯一的(在一个页面内)字符串-它用来识别HTC的实例。</p>
<p>　　八、 再封装</p>
<p>　　在我们的CHECKBOX中有一个缺点。按照我们建立它的方式，在constructor()期间被注入的HTML将隶属于宿主该HTC的页面的DOM。而且，全局的JavaScript变量like_value属于它们所在的文档的全局范围。这是危险的，因为我们偶然会遇到命名冲突的可能性:最明显的情形是使用同一个组件的多个实例。另外这还会导致一个可能性-我们的控件可能会偶然地用相同的名称参考其它对象，反之也如此。</p>
<p>　　为简化起见，需要建立一种专门的机制来为对象授权启动一个真正模块化方法。幸好，HTC技术支持一种智能答案-viewLink。</p>
<p>　　把一个控件声明为封装的最容易的方法是把一个额外声明放到打开和关闭的PUBLIC:COMPONENT标签之间:</p>
<p>　　<PUBLIC:DEFAULTS viewLinkContent/></p>
<p>　　该控件立即就变成封装性的;而且它有自己的HTML文档树-成为主文档的原子组件。该对象的每个实例有它自己的实例值的集合并且只有公共方法和属性能够从外界代码中加以存取。换句话说，该viewLink机制充分地启动了复杂的Web应用程序的设计和实现-通过使用一种真正的OO的基于组件的方法。</p>
<p>　　特别地，我们可以简化代码-通过从内部复选框和HTML标签的定义中删除uniqueID后缀，因为我们不再担心命名冲突。因此，我们可以替换下面这一行:</p>
<p>　　eval( 'cb_'+uniqueID).checked = ( _value == onValue );</p>
<p>　　用</p>
<p>　　cb.checked = ( _value == onValue );</p>
<p>　　并相应地改变addCheckbox()和addLabel()。</p>
<p>　　九、 结论</p>
<p>　　既然AJAX竞赛刚刚开始，那么就不存在什么AJAX标准并且没有现成的你可以依赖以构建你的应用程序的可广为接受的RAD工具。虽然软件供应商们可能还需要较长一段时间来创建这种强健的开发平台，AJAX热心者已经开始着手准备-通过一些良好定义的API把可重用的代码块封装为商业组件。</p>
<p>　　以这种方向导航，本文概括了AJAX语言的OO"力量"-JavaScript。另外，还展示了一种可用的组件-授权策略-客户端定制标签技术。我们在仅描述IE特定的定制标签的同时，还另外提供了一个可下载的实例-适于Mozilla浏览器的可扩展的绑定实例。</p>
</SCRIPT>
 </FONT></P>
<P><A href="http://searchwebservices.techtarget.com.cn/imagelist/05/12/f6g6m8h87yjx.rar" target=_blank><FONT color=#000000>源码下载</FONT></A></P><img src ="http://www.blogjava.net/zyb9114/aggbug/25839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-29 10:19 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/29/25839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用AJAX开发智能Web应用程序之基础篇</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/29/25838.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Thu, 29 Dec 2005 02:12:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/29/25838.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25838.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/29/25838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25838.html</trackback:ping><description><![CDATA[<A class=f1><FONT color=#000000>&nbsp;　　<STRONG>一. 什么是AJAX?</STRONG> </FONT>
<P><FONT color=#000000>　　这个名字代表了异步JavaScript+XMLHTTPRequest，并且意味着你可以在基于浏览器的JavaScript和服务器之间建立套接字通讯。其实AJAX并不是一种新技术，而是已经成功地用于现代浏览器中的若干成功技术的可能性组合。所有的AJAX应用程序实现了一种“丰富的”UI——这是通过JavaScript操作HTML文档对象模型并且经由XMLHttpRequest实现的精确定位的数据检索来实现的。典型的示例AJAX应用程序是Google Labs(http://labs.google.com)的Google Maps和Google Suggest。这些应用程序现场监视用户输入并且提供实时的页面更新。最重要的是，在用户通过地图导航或输入一个查找字符串的同时，这些事件不需要刷新页面。</FONT></P>
<P><FONT color=#000000>　　事实上，支持这些令人感到惊讶的应用的技术已经出现一段时间了，尽管它们要求复杂的技能以及使用浏览器的技巧。一些专利产品就提供了相似的能力——如Macromedia Flash插件，Java Applets或.NET运行时——在达到实用上已经有一段时间了。把一种可与服务器通话的脚本组件引入到浏览器中的思想早在IE 5.0中就已经存在。Firefox和其它流行的浏览器也加入到浏览器大军中并以一种内置对象形式支持XMLHTTPRequest。随着跨平台浏览器的出现，这些技术得到了认可并在2004年3月一家称为Adaptive Path的公司中正式提出了AJAX。</FONT></P>
<P><FONT color=#000000>　　简而言之，由于来自于Google的支持和安装了一点可用的浏览器技术，加上为了一种"更好的用户体验"，每个人都在把客户端技术添加到Web应用程序上。</FONT></P>
<P><FONT color=#000000>　　<STRONG>二. AJAX与传统应用程序的区别</STRONG></FONT></P>
<P><FONT color=#000000>　　一个传统Web应用程序模型实际上是一种基本的事件——用户被迫提交表单以实现页面交换。也就是说，表单提交和页面传送无法得到保证:还有更坏的情形——用户需要再次点击。这与AJAX截然不同-——数据跨过线路而不是完整的HTML页面传输。这种数据交换是经由特定的浏览器对象:XMLHttpRequest实现的;再由适当的逻辑来处理每个数据请求的结果，页面的特定区域而不是完整的页面被更新。结果是更快的速度，更少的拥挤和更好的信息传送控制。</FONT></P>
<P><FONT color=#000000>　　传统型"click-refresh"Web应用程序强迫用户中断工作过程而等待页面的重装。通过引入AJAX技术，一个客户端脚本能够异步地与服务器通话，而用户仍能保持输入数据。除了对用户透明之外，这样的异步意味着服务器可以有更多时间来处理请求。</FONT></P>
<P><FONT color=#000000>　　传统Web应用程序把所有的处理代理到服务器并且强迫服务器进行状态管理。AJAX允许灵活划分应用程序逻辑以及客户和服务器之间的状态管理。这就消除了一种"click-refresh"依赖性并且提供更好的服务器可伸缩性。当该状态存储在客户端，你就不必跨越服务器来维持会话或保存/结束状态-其使用期限是由客户端来定义的。</FONT></P>
<P><FONT color=#000000>　　<STRONG>三. AJAX——分布式的MVC</STRONG></FONT></P>
<P><FONT color=#000000>　　尽管AJAX应用程序依靠JavaScript来实现描述层，然而处理能力和知识库仍然存在于服务器上。此时，AJAX应用程序大量的与J2EE服务器通讯——把数据输入/输出Web服务和servlets。具有基于AJAX的描述层的J2EE应用程序和标准J2EE应用程序之间的区别首先在于，MVC是通过线路分布的。通过使用AJAX，视图是本地的，而模型和控制器是分布式的——这使得开发者能够灵活地决定哪些部件会是基于客户端的。具体地说，本地视图通过巧妙地操作HTML DOM而生成图形;控制器局部地处理用户输入并且根据开发者的判断扩展到服务器的处理——经由HTTP请求(Web服务，XML/RPC或其它)实现;模型的远程部分是根据客户端需要而下载的以达到实时更新客户端页面;并且状态是在客户端收集的。</FONT></P>
<P><FONT color=#000000>　　在以后的AJAX文章中，我们将比较深入地讨论这里的每一种组件并提供有关它们联合在一起进行应用的示例。现在，先不多说，让我们详细地分析一个简单的AJAX示例。</FONT></P>
<P><FONT color=#000000>　　<STRONG>四. 邮政区号校验和查询</STRONG></FONT></P>
<P><FONT color=#000000>　　我们将创建一个包含三个INPUT字段(Zip，City和State)的HTML页面。我们将保证，只要用户输入邮政区号的前三个数字，该页面上的字段就会用第一个匹配的状态值填充。一旦用户输入了所有五位邮政区号数，我们将立即决定和填充相应的城市。如果邮政区号无效(在服务器的数据库没有找到)，那么我们将把邮政区号的边界设置为红色。这样的可视化线索有助于用户并且在现代浏览器中已经成为一种标准(作为一实例，当Firefox找到一个HTML页面中的匹配关键字时，它会高亮与你在浏览器查找域输入的内容一致的部分)。</FONT></P>
<P><FONT color=#000000>　　让我们首先创建一个简单的包含三个INPUT字段的HTML:zip，city和state。请注意，一旦一个字符输入进邮政区号字段域中，即调用方法zipChanged()。JavaScript函数zipChanged()(见下)在当zip长度为3时调用函数updateState()，而在当zip长度为5时调用函数up-dateCity()。而updateCity()和updateState()把大部分的工作代理到另一个函数ask()。</FONT></P>
<P><FONT face=Verdana><FONT style="BACKGROUND-COLOR: #dddddd"><FONT color=#000000>Zip:＜input id="zipcode" type="text" maxlength="5" onKeyUp="zipChanged()"<BR>style="width:60"/＞<BR>City: ＜input id="city" disabled maxlength="32" style="width:160"/＞<BR>State:＜input id="state" disabled maxlength="2" style="width:30"/＞<BR>＜script src="xmlhttp.js"＞＜/script＞<BR>＜script＞<BR>var zipField = null;<BR>function zipChanged(){<BR>zipField = document.getElementById("zipcode")<BR>var zip = zipField.value;<BR>zip.length == 3?updateState(zip):zip.length == 5?updateCity(zip):"";<BR>}<BR>function updateState(zip) {<BR>　var stateField = document.getElementById("state");<BR>　ask("resolveZip.jsp?lookupType=state&amp;zip="+zip， stateField， zipField);<BR>}<BR>function updateCity(zip) {<BR>　var cityField = document.getElementById("city");<BR>　ask("resolveZip.jsp? lookupType=city&amp;zip="+zip， cityField， zipField);<BR>}<BR>＜/script＞<BR><BR><BR><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;&nbsp;&nbsp; 函数ask()与服务器进行通讯并分配一个回调函数来处理服务器的响应(见下列代码)。后面，我们将分析具有双重特点的resolveZip.jsp的内容-它根据zip字段中的字符数查找city或state信息。重要的是，ask()使用了具有异步特点的XmlHttpRequest，这样填充state和city字段或着色zip字段边界就可以不必减慢数据入口而得以实现。首先，我们调用request.open()-它用服务器打开套接字频道，使用一个HTTP动词(GET或POST)作为第一个参数并且以数据提供者的URL作为第二个参数。request.open()的最后一个参数被设置为true-它指示该请求的异步特性。注意，该请求还没有被提交。随着对request.send()的调用，开始提交-这可以为POST提供任何必要的有效载荷。在使用异步请求时，我们必须使用request.onreadystatechanged属性来分配请求的回调函数。(如果请求是同步的话，我们应该能够在调用request.send之后立即处理结果，但是我们也有可能阻断用户，直到该请求完成为止。)</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>HTTPRequest = function () {<BR>　var xmlhttp=null;<BR>　try {<BR>　　xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");<BR>　} catch (_e) {<BR>　　try {<BR>　　　xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");<BR>　　} catch (_E) { }<BR>　}<BR>　if (!xmlhttp &amp;&amp; typeof XMLHttpRequest != 'undefined') {<BR>　　try {<BR>　　　xmlhttp = new XMLHttpRequest();<BR>　　} catch (e) {<BR>　　　xmlhttp = false;<BR>　　}<BR>　}<BR>　return xmlhttp;<BR>}</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>function ask(url， fieldToFill， lookupField) {<BR>　var http = new HTTPRequest();<BR>　http.open("GET"， url， true);<BR>　http.onreadystatechange = function (){ handleHttpResponse(http， fieldToFill，lookupField)};<BR>　http.send(null);<BR>}</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana color=#000000>function handleHttpResponse(http， fieldToFill， lookupField) {<BR>　if (http.readyState == 4) {<BR>　　result = http.responseText;<BR>　　if ( -1 != result.search("null") ) {<BR>　　　lookupField.style.borderColor = "red";<BR>　　　fieldToFill.value = "";<BR>　　} else {<BR>　　　lookupField.style.borderColor = "";<BR>　　　fieldToFill.value = result;<BR>　　}<BR>　}<BR>}</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　为ask()所使用的HttpRequest()函数(见上)是一跨浏览器的XMLHTTPRequest的一个实例的构造器;稍后我们将分析它。到目前为止，请注意对于handleResponse()的调用是如何用一匿名函数包装的-这个函数是function(){handleHttpResponse(http，fieldToFill， lookupField)}。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　该函数的代码是动态创建的并且在每次我们给http.onreadstatechange属性赋值时被编译。结果，JavaScript创建一个指向上下文(所有的变量都可以存取正在结束的方法-ask())的指针。这样以来，匿名函数和handleResponse()就能够被保证充分存取所有的上下文宿主的变量，直至到匿名函数的参考被垃圾回收站收集为止。换句话说，无论何时我们的匿名函数被调用，它都能无缝地参考request，fieldToFill和lookupField变量，就象它们是全局的一样。而且，每次ask()调用都将创建环境的一个独立拷贝，并且此时这些变量中保存有该函数将结束时的值。</FONT></P>
<P><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff">　　现在，让我们分析一下函数handleResponse()。既然它能够在请求处理的不同状态下激活，那么该函数将忽略所有的情形-除了该请求处理完成之外-这相应于request.readyState属性等于4("Completed")。此时，该函数读取服务器的响应文本。与它的名字所暗示的相反，XmlHttpRequest的输入和输出都不必限于XML格式。特别地，我们的resolveZip.jsp(见源码中的列表1)返回普通文本。如果返回值为"unknown"，那么该函数将假定邮政区号是无效的并且把查找字段(zip)边界颜色置为红色。否则，返回值被用于填充字段state或city，并且zip的边界被赋予一种缺省颜色。<BR></FONT><BR><STRONG><FONT style="BACKGROUND-COLOR: #ffffff">XMLHttpRequest-传输对象</FONT></STRONG></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　让我们返回到我们的XMLHTTPRequest的跨浏览器实现。最后一个列表包含一个HttpRequest()函数-它向上兼容于IE5.0和Mozilla 1.8/FireFox。为简化起见，我们只创建一个微软XMLHTTPRequest对象，而且如果创建失败，我们假定它是Firefox/Mozilla。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　该函数的核心是XMLHTTPRequest-这是一个本机浏览器对象，它为包括HTTP协议的任何东西与服务器之间的通讯提供方便。它允许指定任何HTTP动词，头部和有效载荷，并且能够以异步或同步方式工作。不需要下载也不需要安装任何插件-尽管在IE的情形下，XMLHTTPRequest是一个集成到浏览器内部的ActiveX。因而，"Run ActiveX Control and Plugins"默认IE权限应该正好适合使用它。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　最重要的是，XMLHTTPRequest允许一个到服务器的RPC风格的编程查询而不需要任何页面刷新。它以一种可预测的，可控制的方式来实现此-提供了到HTTP协议的所有细节的完整存取-包括头部和数据的任何定制格式。在以后的文章中，我们将向你展示其它一些业界协议-你可以在这些传输协议(如Web服务和XML-RPC)之上运行-它们极大地简化大规模应用程序的开发和维护。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff"><FONT color=#000000>　　<STRONG>五.服务器端逻辑</STRONG></FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　最后，服务器端的resolveZip.jsp被从函数ask()中调用(见所附源码中的列表1)。这个resolveZip.jsp在两种由当前的邮政区号长度所区分的独立的场所下被调用(见zipChanged()函数)。请求参数lookupType的值或者是state或者是city。为简化起见，我们将假定，两个文件state.properties和city.properties都位于服务器中C驱动器的根目录下。resolveZip.jsp逻辑负责用适当的预装载的文件返回查找值。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　我们的支持AJAX的页面现在已经准备好了。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff"><FONT color=#000000>　　<STRONG>六.远程脚本技术-一种可选方法</STRONG></FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　一些更旧的AJAX实现是基于所谓的远程脚本技术。这种思想是，用户的行为导致经由IFRAME对服务器进行查询，而服务器用JavaScript作出响应，该脚本一旦到达客户端立即被执行。这与XMLHttpRequest方法相比存在较大的区别，在后者情况下，服务器响应数据而客户端解释数据。其好处是这种解决方案支持更旧的浏览器。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　基于IFRAME示例的HTML部分(见所附源码中的列表2)与我们在XMLHTTPRequest场合下所用的极相似，但是这次我们将引入另外一个IFRAME元素-controller:</FONT></P>
<P><FONT face=Verdana><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd">Zip:＜input id="zipcode" type="text" maxlength="5" onKeyUp="zipChanged()"<BR>style="width:60" size="20"/＞<BR>City: ＜input id="city" disabled maxlength="32" style="width:160" size="20"/＞<BR>State:＜input id="state" disabled maxlength="2" style="width:30" size="20"/＞<BR>＜iframe id="controller" style="visibility:hidden;width:0;height:0"＞＜/iframe＞</FONT> </FONT></FONT>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　我们保持每次击键都调用zipChanged()一次，但是这一次，从zipChanged()中被调用的函数ask()(见所附源码中的列表3)负责设置IFRAME的src属性，而不是调用一个XMLHTTPRequest:</FONT></P>
<P><FONT face=Verdana><FONT color=#000000><FONT style="BACKGROUND-COLOR: #dddddd">function ask(url， fieldToFill， lookupField){<BR>　var controller = document.getElementById("controller");<BR>　controller.src= url+"&amp;field="+fieldToFill.id+"&amp;zip="+lookupField.id;<BR>}</FONT> </FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　服务器端逻辑由一个粗略的resolveZip.jsp(见所附源码中的列表4)所描述。它与它的XMLHTTPRequest对应物相区别-它返回JavaScript语句，这些语句设置变量字段lookup和city的全局值，而且一旦它到达浏览器即从全局窗口的执行上下文中调用函数response()。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　函数response()是一修改版本的handleResponse()-这一函数可以免于处理未完成的请求(详见本文所附源码中的列表2)。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff"><FONT color=#000000>　　<STRONG>七. 难题</STRONG></FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　为简化起见，让我们"俯看"一下在我们的示例代码中的一些重要的问题:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　1.事实-XMLHTTPRequest对象实例和回调函数调用在被使用以后并没被破坏-在每次调用后这有可能导致内存泄漏。适当编写的代码应该破坏或重用对象池中的这些实例。而且，客户端必须使用与服务器软件相同的对象管理技术。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　2.在大多数情况下，错误往往得不到有效处理。例如，在方法ask()中对request.open()的调用可能引发一个异常，这是必须要捕获和处理的，即使在浏览器中没有设置JavaScript异常自动捕获功能。而handleResponse()函数又是另外一个例子。它必须要为可能的服务器端和通讯错误而检查headers和responseText值。在发生错误的情况下，它必须尽力恢复并/或者报告错误。正确开发的AJAX应用程序要尽可能避免"提交"松散的数据，因为往往存在线路断开和其它低级通讯的问题-所以这些程序必须建立一个强壮的和自恢复的框架为此提供支持。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　3.当前服务器端框架提供相当多的功能-它们可以与一种自由刷新方法和谐相处。例如，让我们考虑一个定制的在指定时间内的服务器端认证的问题。在这种情况下，我们必须拦截到XMLHTTPRequest调用的安全系统响应，显示登录屏幕，然后在用户被认证后重新发出请求。</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　所有的这些问题只是一些典型的用低级API工作的任何应用程序代码，而且所有这些问题都能被解决。好消息是，解决这些问题所需要的技术十分相似于大多数Java开发技术，如Web服务，定制标签和XML/XSLT。唯一的区别在于，现在这些技术以下列形式用于客户端:</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　·Web服务-使用SOAP/REST/RPC等简单通讯标准</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　·客户端定制标签-打包丰富的客户端控件并集成AJAX功能</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　·数据操作-基于XML和基于XSLT技术</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff"><FONT color=#000000>　　<STRONG>八. 小结</STRONG></FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>　　AJAX方法能够向人们提供一种与桌面应用程序相同的丰富的互联网体验。但是，我们必须有选择地使用AJAX技术，如当你仍在线购物时，你绝对不想让你的信用卡通过后台处理就悄悄地开始付款。AJAX会成为一种持续的动力吗?我们当然希望这样。在过去的五年时间内我们一直在努力开发AJAX应用程序并且能证明它是健全并且很有效的。然而，它要求一个开发者必须精通大量技术而不是在传统的"click-refresh"Web应用程序中所使用的那些。</FONT></P>
<P></A><A href="http://searchwebservices.techtarget.com.cn/imagelist/05/12/0acoy4238m7r.rar" target=_blank><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>源码下载</FONT></A><A class=f1><BR><BR></FONT></FONT></P></A><img src ="http://www.blogjava.net/zyb9114/aggbug/25838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-29 10:12 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/29/25838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java与.NET 的Web Services相互调用</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/29/25835.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Thu, 29 Dec 2005 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/29/25835.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25835.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/29/25835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25835.html</trackback:ping><description><![CDATA[<STRONG>&nbsp;&nbsp;&nbsp;&nbsp; 一:简介</STRONG> 
<P>　　本文介绍了Java与.NET开发的Web Services相互调用的技术。本文包括两个部分，第一部分介绍了<A class=bluekey href="http://www.yesky.com/key/200/65200.html" target=_blank>如何用</A>.NET做客户端调用Java写的Web Services,第二部分介绍了如何用Java做客户端调用.NET开发的Web Services。</P>
<P>　　<STRONG>二:项目需要的工具</STRONG></P>
<P>　　Windows2000 Server(IIS)</P>
<P>　　<A class=bluekey href="http://www.yesky.com/key/197/20197.html" target=_blank>Jbuilder9</A>.0( 含有Tomcat , axis)</P>
<P>　　JDK1.4+Java Web Services Develop</P>
<P>　　VS.Net 2003</P>
<P>　　备注:如果没有JBuilder的话就需要自己下载安装Tomcat4.1 以及 Axis的开<A class=bluekey href="http://www.yesky.com/key/887/30887.html" target=_blank>发包</A>，并做相应配置。由于网上有很多这样的文章，这里就不一一说明了。</P>
<P>　　<STRONG>三:用.NET做客户端调用Java写的Web Services</STRONG></P>
<P>　　1. 生成一个Java Web Services</P>
<P>　　使用JBuilder 生成一个Web Services是非常简单的，我完全是按照它的帮助做的，只要一步步做下去就可以了。具体路径是Developing Web Services -&gt; tutorials : Web Services(Axis) -&gt; Creating a simple Web Services</P>
<P>　　2. 发布这个Web Services并得到它的<A class=bluekey href="http://www.yesky.com/key/3664/18664.html" target=_blank>WSDL</A></P>
<P>　　Web Services生成好之后，F9运行这个项目。然后，单击View浏览现有的Web 服务，单击Bean1的WSDL连接，我们可以在浏览器中察看它的WSDL描述。在浏览器<A class=bluekey href="http://www.yesky.com/key/3035/18035.html" target=_blank>地址栏</A>复制WSDL地址，为下一步使用.NET开发客户端调用程序做准备。</P>
<P>　　3. 用VS.NET生成一个.NET的客户端</P>
<P>　　新建一个项目(WinForm,ASP.net都可以)，我在这里使用的是一个Asp.Net项目。在起始页面上放置一个文本输入框用来显示调用Web Services的结果，放置一个按钮，用来单击调用Web Services。然后，选择添加Web 引用，在WSDL一栏中把刚才得到的WSDL地址复制过来，Web 引用的名称输入JavaService，单击添加引用按钮就可以了。此时，我们可以在VS.net 的Solution Explore中看到这个Web 引用。</P>
<P>　　在按钮的单击事件中输入下列代码:</P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana>　　JavaService.Bean1 bean = new JavaService.Bean1();<BR>　　TextBox1.Text = bean.getSample.ToString ();</FONT></P>
<P>　　这样，一个.NET客户端就完成了，测试一下，工作正常，OK.<BR><BR><STRONG>&nbsp;&nbsp;&nbsp; 四:用Java做客户端调用.NET写的 Web Services</STRONG></P>
<P>　　有了上面的成功，使我以为用Java做客户端调用也是一件十分容易的事情，可实际情况却耗费了我两天时间才得以实现。</P>
<P>　　1. 用VS.NET新建一个Asp Web Services工程，添加一个web 服务，命名为SumService.asmx。新增一个web method，代码如下:</P>
<P><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana>　　[WebMethod]<BR>　　public int IntAdd(int a,int b)<BR>　　{<BR>　　return a+b ;<BR>　　}</FONT></P>
<P>　　然后运行它，并利用IE进行测试成功。</P>
<P>　　2. 打开jbuilder9.0,新建一个项目，添加一个java class ，命名为TestNetService，输入下列代码:</P>
<P><FONT face=Verdana><FONT style="BACKGROUND-COLOR: #dddddd" face=Verdana>package MyWebServiceJavaClient;<BR>import java.util.Date;<BR>import java.text.DateFormat;<BR>import java.util.Date;<BR>import java.text.DateFormat;<BR>import org.apache.axis.client.Call;<BR>import org.apache.axis.client.Service;<BR>import javax.xml.namespace.QName;<BR>import java.lang.Integer;<BR>import javax.xml.rpc.ParameterMode;<BR>/**<BR>* &lt;p&gt;Title: &lt;/p&gt;<BR>* &lt;p&gt;Description: &lt;/p&gt;<BR>* &lt;p&gt;Copyright: Copyright (c) 2004&lt;/p&gt;<BR>* &lt;p&gt;Company: &lt;/p&gt;<BR>* @author not attributable<BR>* @version 1.0<BR>*/<BR>public class TestNetService {<BR>public TestNetService() {<BR>}<BR>public static void main(String[] args) {<BR>try {<BR>Integer i = new Integer(1);<BR>Integer j = new Integer(2);<BR>String endpoint="http://localhost/MyServices/WebServiceTest/SumService.asmx";<BR>Service service = new Service();<BR>Call call = (Call)service.createCall();<BR>call.setTargetEndpointAddress(new java.net.URL(endpoint));<BR>call.setOperationName(new QName("http://www.my.com/SU","IntAdd"));<BR>call.addParameter("a",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);<BR>call.addParameter("b",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);<BR>call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);<BR>call.setUseSOAPAction(true);<BR>call.setSOAPActionURI("http://www.my.com/Rpc");<BR>Integer k = (Integer)call.invoke(new Object[]{i,j});<BR>System.out.println( "result is " + k.toString() + ".");<BR>}<BR>catch (Exception e) {System.err.println(e.toString());}<BR>}<BR>}</P>
<P></FONT></FONT>&nbsp;&nbsp;&nbsp; 运行上面的java客户端程序，你会发现系统会抛出一个SoapAction异常。奇怪，怎么会错误呢?想到了我开发的asp web services没有指定SoapAction，于是在SumService.asmx中的 [web method] 的上一行添加下列代码:</P>
<P><FONT style="BACKGROUND-COLOR: #dddddd">[SoapRpcMethod(Action="http://www.my.com/Rpc",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequestNamespace="http://www.my.com/SU",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResponseNamespace="http://www.my.com/SU")]</FONT></P>
<P>　　重新编译运行asp web services后，在执行java程序，这时会发现输出了正确的结果3。</P>
<P>　　这样，用java调用.net生成的web services也算初步完成了，好像也不是很复杂是吧。其实，在实际工作中，我一开始并没有在网上找到一个很好的代码例子，全部是依靠jbuilder 和 axis的帮助完成的, 可总是提示什么找不到相应的SoapAction。而实际上，我在运行了asp web services后是可以在IE浏览器中看到那个SoapAction的。我试验过将默认的SoapAction拷贝到java代码中，但是java客户端依然抛出同样的异常，这要我也很迷惑。</P>
<P>　　<STRONG>五:总结</STRONG></P>
<P>　　经过两天的试验，终于从技术上明确了通过Web Services实现.net 与 java的互通是可能的。当然有几点是需要注意的:</P>
<P>　　1. 在提供Web Services的时候，尽量使用xml schema中支持的变量类型做参数。如果使用.net 中的dataset这种类型，对于java来说解析起来将是一个灾难，当然，理论上是可以解析的。但是从效率角度来说，在Web Services与客户端交换信息的过程中，始终有一个序列化和反序列化的问题。如果使用dataset这种类型，系统还需要对它进行序列化操作，这将是一个很耗费资源的过程。而使用string类型将简单很多。</P>
<P>　　2. 如果使用了soap header等扩展功能，例如使用了微软提供的WSE技术，它们之间的相互通信需要作特殊处理。<BR></P><img src ="http://www.blogjava.net/zyb9114/aggbug/25835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-29 09:59 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/29/25835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>熟练调用 Web Service</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/29/25833.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Thu, 29 Dec 2005 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/29/25833.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25833.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/29/25833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25833.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25833.html</trackback:ping><description><![CDATA[<STRONG>什么是</STRONG><A class=bluekey href="http://www.yesky.com/key/3509/278509.html" target=_blank><STRONG>Web Services</STRONG></A> 
<P>　　从表面上看，Web service 就是一个应用程序，它向外界暴露出一个能够通过Web进行调用的API。也就是说，可以利用编程的方法通过Web来调用这个应用程序。</P>
<P>　　对Web service 更精确的解释: Web <A class=bluekey href="http://www.yesky.com/key/2009/542009.html" target=_blank>services</A>是建立可互操作的分布式应用程序的新平台。Web service平台是一套标准，它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言，在任何你喜欢的平台上写Web service ，只要我们可以通过Web service标准对这些服务进行查询和访问。</P>
<P>　　不管你的Web service是用什么工具，什么语言写出来的，只要你用SOAP协议通过HTTP来调用它，总体结构都一致。通常，你用你自己喜欢的语言(如VB 6或者VB.NET)来构建你的Web service，然后用SOAP Toolkit或者.NET的内建支持来把它暴露给Web客户。于是，任何语言，任何平台上的客户都可以阅读其WSDL文档，以调用这个Web service。客户根据WSDL描述文档，会生成一个SOAP请求消息。Web service都是放在Web服务器 (如IIS) 后面的，客户生成的SOAP请求会被嵌入在一个HTTP <A class=bluekey href="http://www.yesky.com/key/756/595756.html" target=_blank>POST</A>请求中，发送到Web服务器来。Web服务器再把这些请求转发给Web service请求处理器。请求处理器的作用在于，解析收到的SOAP请求，调用Web service，然后再生成相应的SOAP应答。Web服务器得到SOAP应答后，会再通过HTTP应答的方式把它送回到客户端。</P>
<P>　　<STRONG>基本概念</STRONG></P>
<P>　　SOAP</P>
<P>　　XML和XSD</P>
<P>　　WSDL(Web Services Description Language)</P>
<P>　　WSML(Web Services Meta Language)</P>
<P>　　<STRONG>什么时候使用Web Services</STRONG></P>
<P>　　Web service是创建可互操作的分布式应用程序的新平台。Web service 的主要目标是跨平台的可互操作性。为了达到这一目标，Web service 是完全基于XML、XSD等独立于平台、独立于<A class=bluekey href="http://www.yesky.com/key/4778/284778.html" target=_blank>软件供应商</A>的标准的。</P>
<P>　　Web service在应用程序跨平台和跨网络进行通信的时候是非常有用的。Web service适用于应用程序集成、B2B集成、代码和数据重用，以及通过Web进行客户端和服务器的通信的场合。</P>
<P>　　当然，Web service也不是万能的，你不能到处滥用Web service。在有些情况下，Web service 会降低应用程序的性能，而不会带来任何好处。例如，一台机器或一个局域网里面运行的同构应用程序就不应该用Web service 进行通信。</P>
<P>　　<STRONG>如何调用Web Services</STRONG></P>
<P>　　客户端:取得<A class=bluekey href="http://www.yesky.com/key/1011/541011.html" target=_blank>服务端</A>的服务描述文件WSDL，解析该文件的内容，了解服务端的服务信息，以及调用方式。根据需要，生成恰当的SOAP请求消息(指定调用的方法，已经调用的参数)，发往服务端。等待服务端返回的SOAP回应消息，解析得到返回值。</P>
<P>　　服务端:生成服务描述文件，以供客户端获取。接收客户端发来的SOAP请求消息，解析其中的方法调用和参数格式。根据WSDL和WSML的描述，调用相应的COM对象来完成指定功能，并把返回值放入SOAP回应消息返回给用户。</P>
<P>　　<STRONG>高层接口</STRONG></P>
<P>　　使用高层接口，不需要知道SOAP和XML的任何信息，就可以生成和使用一个WebService。Soap Toolkit 2.0通过提供两个COM对象――SoapClient和SoapServer，来完成这些功能。</P>
<P>　　在客户端，只需要生成一个SoapClient实例，并用WSDL作为参数来调用其中的mssoapinit方法。SoapClient对象会自动解析WSDL文件，并在内部生成所有Web Service的方法和参数信息。之后，你就可以像调用IDispatch接口里的方法一样，调用里面所有的方法。在VB或是脚本语言里，你甚至可以直接在SoapClient对象名后面直接加上.方法(参数…)进行调用。<BR><BR><STRONG>&nbsp;&nbsp;&nbsp; 低层接口</STRONG></P>
<P>　　要使用低层接口，你必须对SOAP和XML有所了解。你可以对SOAP的处理过程进行控制，特别是要做特殊处理的时候。</P>
<P>　　在客户端，首先要创建一个HttpConnector对象，负责HTTP连接。设定Connector的一些头部信息，比如EndPoinURL和SoapAction等。如果网络连接需要使用代理服务器，那也要在这里设定相关的信息。接着创建SoapSerializer对象，用于生成Soap消息。按照WSDL里定义，把所有参数按顺序序列化，得到一个完整的SOAP请求消息。该Soap消息，作为Payload通过HttpConnector被发送到服务端。最后，生成一个SoapReader对象，负责读取服务端返回的SOAP消息，取得其中的返回值。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>相关文章链接</STRONG></P>
<P><FONT face=Verdana><A href="http://searchwebservices.techtarget.com.cn/tips/160/2133660.shtml" target=_blank>什么时候应该使用Web Service</A> </FONT></P>
<P><FONT face=Verdana><A href="http://searchwebservices.techtarget.com.cn/tips/99/2113599.shtml" target=_blank>Web服务系列教学-如何调用WebService(5)<BR>Web服务系列教学-如何调用WebService(4)<BR>Web服务系列教学-如何调用WebService(3)<BR>Web服务系列教学-如何调用WebService(2)</A><BR><A href="http://searchwebservices.techtarget.com.cn/tips/194/2113194.shtml" target=_blank>Web服务系列教学-如何调用WebService(1)</A></FONT></P>
<P><FONT face=Verdana><FONT face=Verdana><A href="http://searchwebservices.techtarget.com.cn/tips/13/2132013.shtml" target=_blank>使用vbscript脚本调用web服务</A><BR><A href="http://searchwebservices.techtarget.com.cn/tips/174/2131674.shtml" target=_blank>Java与.NET 的Web Services相互调用</A><BR><A href="http://searchwebservices.techtarget.com.cn/tips/339/2106839.shtml" target=_blank>ASP调用WebService时的问题<BR>从非windows客户端调用.NET Web服务<BR>Java WS和C#调用</A><BR><A href="http://searchwebservices.techtarget.com.cn/tips/227/2088727.shtml" target=_blank>使用ASP.NET的客户端证书调用Web服务</A><BR><A href="http://searchwebservices.techtarget.com.cn/tips/136/2067136.shtml" target=_blank>.aspx 页面调用 Web 服务的性能优化</A></FONT></FONT></P><img src ="http://www.blogjava.net/zyb9114/aggbug/25833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-29 09:54 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/29/25833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java容器分析--数组</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/27/25547.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Tue, 27 Dec 2005 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/27/25547.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25547.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/27/25547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25547.html</trackback:ping><description><![CDATA[<FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp;<SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数组是</SPAN></FONT><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言内置的类型，除此之外，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有多种保存对象引用的方式。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类库提供了一套相当完整的容器类，使用这些类的方法可以保存和操纵对象。下面分别进行讨论，在研究Java容器类之前，先了解一下Java数组的基本功能和特性。</SPAN> 
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">1.&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数组的基本特性</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数组与其它种类的容器</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(List/Set/Map)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之间的区别在于效率、确定的类型和保存基本类型数据的能力。数组是一种高效的存储和随机访问对象引用序列的方式，使用数组可以快速的访问数组中的元素。但是当创建一个数组对象</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意和对象数组的区别</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后，数组的大小也就固定了，当数组空间不足的时候就再创建一个新的数组，把旧的数组中所有的引用复制到新的数组中。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的数组和容器都需要进行边界检查，如果越界就会得到一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">RuntimeException</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">异常。这点和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">C++</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中有所不同，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">C++</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">vector</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的操作符</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">[]</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不会做边界检查，这在速度上会有一定的提高，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数组和容器会因为时刻存在的边界检查带来一些性能上的开销。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中通用的容器类不会以具体的类型来处理对象，容器中的对象都是以</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Object</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型处理的，这是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中所有类的基类。另外，数组可以保存基本类型，而容器不能，它只能保存任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般情况下，考虑到效率与类型检查，应该尽可能考虑使用数组。如果要解决一般化的问题，数组可能会受到一些限制，这时可以使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的容器类。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">2.&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作数组的实用功能</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">java.util.Arrays</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类中，有许多</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">static</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">静态方法，提供了操作数组的一些基本功能：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">----</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于比较两个数组是否相等，相等的条件是两个数组的元素个数必须相等，并且对应位置的元素也相等。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>fill()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">----</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用以某个值填充整个数组，这个方法有点笨。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>asList()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">----</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接受任意的数组为参数，将其转变为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">List</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">容器。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>binarySearch()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">----</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于在已经排序的数组中查找元素，需要注意的是必须是已经排序过的数组。当</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Arrays.binarySearch()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">找到了查找目标时，该方法将返回一个等于或大于</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">0</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的值，否则将返回一个负值，表示在该数组目前的排序状态下此目标元素所应该插入的位置。负值的计算公式是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">“-x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:chmetcnv UnitName="”" SourceValue="1" HasSpace="False" Negative="True" NumberType="1" TCSC="0" w:st="on">-1”</st1:chmetcnv></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指的是第一个大于查找对象的元素在数组中的位置，如果数组中所有的元素都小于要查找的对象，则</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x = a.size()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果数组中包含重复的元素，则无法保证找到的是哪一个元素，如果需要对没有重复元素的数组排序，可以使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">TreeSet</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">LinkedHashSet</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。另外，如果使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">排序了某个对象数组，在使用该方法时必须提供同样的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型的参数。需要注意的是，基本类型数组无法使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行排序。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>sort()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">----</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对数组进行升序排序。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准类库中，另有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">static</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">System.arraycopy()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用来复制数组，它针对所有类型做了重载。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">3.&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数组的排序</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java1.0</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">1.1</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个版本中，类库缺少基本的算法操作，包括排序的操作，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java2</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对此进行了改善。在进行排序的操作时，需要根据对象的实际类型执行比较操作，如果为每种不同的类型各自编写一个不同的排序方法，将会使得代码很难被复用。一般的程序设计目标应是“将保持不变的事物与会发改变的事物相分离”。在这里，不变的是通用的排序算法，变化的是各种对象相互比较的方式。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有两种方式来实现比较的功能，一种是实现</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">java.lang.Comparable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口，该接口只有一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">compareTo()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，并以一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Object</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类为参数，如果当前对象小于参数则返回负值，如果相等返回零，如果当前对象大于参数则返回正值。另一种比较方法是采用策略</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(strategy)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式，将会发生变化的代码封装在它自己的类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">策略对象</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，再将策略对象交给保持不变的代码中，后者使用此策略实现它的算法。因此，可以为不同的比较方式生成不同的对象，将它们用在同样的排序程序中。在此情况下，通过定义一个实现了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的类而创建了一个策略，这个策略类有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">compare()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个方法，一般情况下实现</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">compare()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法即可。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用上述两种方法即可对任意基本类型的数组进行排序，也可以对任意的对象数组进行排序。再提示一遍，基本类型数组无法使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行排序。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 21pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准类库中的排序算法针对排序的类型进行了优化——针对基本类型设计了“快速排序”，针对对象设计的“稳定归并排序”。一般不用担心其性能。<BR><BR>Tracker:http://www.blogjava.net/flyingis/archive/2005/12/15/24089.html</SPAN></P><img src ="http://www.blogjava.net/zyb9114/aggbug/25547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-27 11:49 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/27/25547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java容器分析--Map</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/27/25546.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Tue, 27 Dec 2005 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/27/25546.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25546.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/27/25546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25546.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25546.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; 标准的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类库中包含了几种类型的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，它们都拥有同样的基本接口</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是行为特性各不相同，主要表现在效率、键值对的保存、元素呈现次序、对象的保存周期和判定键是否等价的策略等方面。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">1.Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的功能方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map(interface): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">维护</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关联性，使得可以通过</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查找</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap: Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于散列表的实现，取代了</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Hashtable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。插入和查询</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label/value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的开销是固定的，并且可以通过构造器设置容量和负载因子，以调整容器的性能。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">LinkedHashMap: </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的基础上做了一些改进，在迭代遍历它时，取得</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label/value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的顺序是其插入的次序，或者是最近最少使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(LRU)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的次序，速度上比</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要慢一点，但在迭代访问时速度会更快，主要原因是它使用了链表维护内部次序。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">TreeMap: </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查看</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label/value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，元素会被排序，其次序由</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparable</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Comparator</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">决定，因此查询所得到的结果是经过排序的。另外，它是唯一带有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">subMap()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">具体类，即返回一个子树。它也是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">SortedMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的唯一实现，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">subMap()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法也是从该接口继承的。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">WeakHashMap: Weak Key</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射，允许释放映射所指向的对象。当映射之外没有引用指向某个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，此</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以被垃圾收集器回收。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">IdentityHashMap: </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">==</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代替</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行比较的散列映射。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">2.hashCode()<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当使用标准库中的类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Integer</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，程序能够正常运行，但是使用自己创建的类作为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，通常犯一个错误。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中通过</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查找</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，实际上是计算</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象地址的散列码来确定</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">value</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的。一般情况下，我们是使用基类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Object</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来生成散列码，它默认是使用对象的地址来计算的，因此由第一个对象</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">new Apple(5)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和第二个对象</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">new Apple(5)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成的散列码是不同的，不能完成正确的查找。通常，我们可以编写自己的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来覆盖基类的原始方法，但与此同时，我们必须同时实现</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来判断当前的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是否与表中存在的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相同。正确的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法满足五个条件：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(1)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自反性。对于任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(x)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(2)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对称性。对于任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y.equals(x)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，则</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(y)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(3)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">传递性。对于任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">z</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果有</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(y)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y.equals(z)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，则</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(z)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(4)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一致性。对于任意的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">y</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果对象中用于等价比较的信息没有改变，那么无论调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(y)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多少次，返回的结果应该保持一致，要么一直是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">true</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，要么一直是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">false</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(5)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对任何不是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">null</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">x.equals(null)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定返回</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">false</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较的是对象的地址，如果要使用自己的类作为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，必须同时重载</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用散列的目的：想要使用一个对象来查找另一个对象。使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">TreeSet</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">TreeMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也能实现此目的。另外，还可以自己实现一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，此时，必须提供</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map.entrySet()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来生成</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Map.Entry</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Set</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用散列的价值：速度，散列使得查询可以快速进行。散列将</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保存载数组中方便快速查询，因为存储一组元素最快的数据结构是数组，用它来表示</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的信息</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后面有信息的描述</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而不是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身。通过</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象计算得到一个数字，作为数组的下标，这个数字就是散列码</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即前面所述的信息</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。该散列码具体是通过定义在基类</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Object</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，可能由程序员自定义的类覆盖的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，即散列函数生成。为了解决数组容量带来的限制，可以使不同的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">生成相同的下标，保存在一个链表</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，每一个链表就是数组的一个元素。查询</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时就可以通过对</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的信息进行查找，当散列函数比较好，数组的每个位置中的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">长度较短，则可以快速查找到数组元素</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的某个位置，提高了整体速度。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列表中的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">slot</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常称为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，为了使散列分步均匀，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的值一般取质数。但事实证明，质数实际上并不是散列</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的理想容量，近来</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Java</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列实现都使用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">2</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的幂，具体如何验证以后再续。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">3.HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的性能因子</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">容量</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(capacity): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列表中</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数量。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">初始化容量</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(initial capacity): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建散列表时</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数量。可以在构造方法中指定</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashMap</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">HashSet</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的初始化容量。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尺寸</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(size): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列表中记录的数量。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数组的元素个数，非</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">list</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中元素总和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">负载因子</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">(load factor): </SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">尺寸</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">/</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">容量。负载因子为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">0</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，表示空的散列表，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">0.5</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示半满的散列表。轻负载的散列表具有冲突少，适宜插入与查询的特点，但是使用迭代器遍历会比较慢。较高的负载会减少所需空间大小。当负载达到指定值时，容器会自动成倍地增加容量，并将原有的对象重新分配，存入新的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">bucket</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，这个过程称为“重散列”。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt">4.</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重写</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关键</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(1)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对同一个对象调用</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都应该生成同样的值。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(2)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法不要依赖于对象中易变的数据，当数据发生变化时，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就会生成一个不同的散列码，即产生了一个不同的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">label</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(3)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不应依赖于具有唯一性的对象信息，例如对象地址。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(4)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">散列码应该更关心速度，而不是唯一性，因为散列码不必是唯一的。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm 6pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><SPAN lang=EN-US style="FONT-SIZE: 10pt; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(5)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应该产生分步均匀的散列码。在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Effective Java(Addison-Wesley 2001)</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">Joshua Bloch</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">给</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">给出了设计指导，可以参考。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">编写正确高效的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">hashCode()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">equals()</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">可以参考</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Apache</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Jakarta Commons</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">项目中的工具。</SPAN><img src ="http://www.blogjava.net/zyb9114/aggbug/25546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-27 11:45 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/27/25546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java容器分析--List和Set</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/27/25545.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Tue, 27 Dec 2005 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/27/25545.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/25545.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/27/25545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/25545.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/25545.html</trackback:ping><description><![CDATA[<SPAN lang=EN-US><FONT size=2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp; 容器类可以大大提高编程效率和编程能力，在</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Java2</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，所有的容器都由</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">SUN</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公司的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Joshua Bloch</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行了重新设计，丰富了容器类库的功能。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Java2</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">容器类类库的用途是“保存对象”，它分为两类：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT face="Times New Roman"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt">Collection</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 10pt">----</SPAN></FONT><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一组独立的元素，通常这些元素都服从某种规则。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">List</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">必须保持元素特定的顺序，而</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><FONT face="Times New Roman">Set</FONT></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不能有重复元素。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 6pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Map</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">----</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">一组成对的“键值对”对象，即其元素是成对的对象，最典型的应用就是数据字典，并且还有其它广泛的应用。另外，</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">可以返回其所有键组成的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Set</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">和其所有值组成的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Collection</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">，或其键值对组成的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Set</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">，并且还可以像数组一样扩展多维</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">，只要让</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">中键值对的每个“值”是一个</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">Map</SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">即可。</SPAN></SPAN></FONT><FONT size=2><BR><BR><FONT face="宋体, MS Song">1.</FONT></FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=2>迭代器</FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">迭代器是一种设计模式，它是一个对象，它可以遍历并选择序列中的对象，而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象，因为创建它的代价小。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</SPAN><SPAN lang=EN-US>Iterator</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">功能比较简单，并且只能单向移动：</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm 7.8pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT size=2><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(1)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用方法</SPAN><SPAN lang=EN-US>iterator()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要求容器返回一个</SPAN><SPAN lang=EN-US>Iterator</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。第一次调用</SPAN><SPAN lang=EN-US>Iterator</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>next()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法时，它返回序列的第一个元素。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm 7.8pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT size=2><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(2)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>next()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得序列中的下一个元素。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm 7.8pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT size=2><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(3)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>hasNext()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">检查序列中是否还有元素。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm 7.8pt 18pt; TEXT-INDENT: -18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 18.0pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><FONT size=2><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">(4)<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>remove()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将迭代器新返回的元素删除。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; TEXT-INDENT: 18pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>Iterator</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">迭代器最简单的实现，为</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计的</SPAN><SPAN lang=EN-US>ListIterator</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">具有更多的功能，它可以从两个方向遍历</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也可以从</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中插入和删除元素。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>2.List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的功能方法</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>List(interface): </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次序是</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最重要的特点；它确保维护元素特定的顺序。</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</SPAN><SPAN lang=EN-US>Collection</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">添加了许多方法，使得能够向</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中间插入与移除元素</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只推荐</SPAN><SPAN lang=EN-US>LinkedList</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。一个</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以生成</SPAN><SPAN lang=EN-US>ListIterator</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，使用它可以从两个方向遍历</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也可以从</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中间插入和删除元素。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>ArrayList: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由数组实现的</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。它允许对元素进行快速随机访问，但是向</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中间插入与移除元素的速度很慢。</SPAN><SPAN lang=EN-US>ListIterator</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只应该用来由后向前遍历</SPAN><SPAN lang=EN-US>ArrayList</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而不是用来插入和删除元素，因为这比</SPAN><SPAN lang=EN-US>LinkedList</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开销要大很多。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>LinkedList: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对顺序访问进行了优化，向</SPAN><SPAN lang=EN-US>List</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中间插入与删除得开销不大，随机访问则相对较慢</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可用</SPAN><SPAN lang=EN-US>ArrayList</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代替</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。它具有方法</SPAN><SPAN lang=EN-US>addFirst()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>addLast()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>getFirst()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>getLast()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>removeFirst()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>removeLast()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这些方法</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">没有在任何接口或基类中定义过</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使得</SPAN><SPAN lang=EN-US>LinkedList</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以当作堆栈、队列和双向队列使用。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>3.Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的功能方法</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>Set(interface): </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存入</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的每个元素必须是唯一的，因为</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不保存重复元素。加入</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>Object</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">必须定义</SPAN><SPAN lang=EN-US>equals()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法以确保对象的唯一性。</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</SPAN><SPAN lang=EN-US>Collection</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有完全一样的接口。</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口不保证维护元素的次序。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>HashSet: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为快速查找而设计的</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。存入</SPAN><SPAN lang=EN-US>HashSet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的对象必须定义</SPAN><SPAN lang=EN-US>hashCode()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>TreeSet: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保持次序的</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，底层为树结构。使用它可以从</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中提取有序的序列。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US>LinkedHashSet: </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">具有</SPAN><SPAN lang=EN-US>HashSet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的查询速度，且内部使用链表维护元素的顺序</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">插入的次序</SPAN><SPAN lang=EN-US>)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。于是在使用迭代器遍历</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，结果会按元素插入的次序显示。</SPAN></FONT></P>
<P class=MsoNormal style="MARGIN: 7.8pt 0cm; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 0cm"><FONT size=2><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>HashSet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用散列函数对元素进行排序，这是专门为快速查询而设计的；</SPAN><SPAN lang=EN-US>TreeSet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">采用红黑树的数据结构进行排序元素；</SPAN><SPAN lang=EN-US>LinkedHashSet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内部使用散列以加快查询速度，同时使用链表维护元素的次序，使得看起来元素是以插入的顺序保存的。需要注意的是，生成自己的类时，</SPAN><SPAN lang=EN-US>Set</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要维护元素的存储顺序，因此要实现</SPAN><SPAN lang=EN-US>Comparable</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口并定义</SPAN><SPAN lang=EN-US>compareTo()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</SPAN></FONT></P><img src ="http://www.blogjava.net/zyb9114/aggbug/25545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-27 11:40 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/27/25545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE脚本里插入特殊字符</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/12/23430.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Mon, 12 Dec 2005 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/12/23430.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/23430.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/12/23430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/23430.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/23430.html</trackback:ping><description><![CDATA[<DIV><FONT size=2>比如:&amp;<BR>发现有时在前边加"\"不起作用,可以用如下方法:<BR>splplus 里 set define off<BR>@name.sql<BR>commit;</FONT></DIV><img src ="http://www.blogjava.net/zyb9114/aggbug/23430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-12 11:34 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/12/23430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP标签库Ajax JSP Tag Library 1.1.5 发布</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/11/23356.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Sun, 11 Dec 2005 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/11/23356.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/23356.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/11/23356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/23356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/23356.html</trackback:ping><description><![CDATA[<P>AjaxTags项目组近日宣布Ajax JSP library 1.1.5 发布。</P>
<P>AJAXTag 是一组JSP标签，用来简化AJAX 技术在JSP页面中的使用。它提供了一些常见功能的标签如下拉级联选择，用户在文本框中输入字符自动从指定的数据中匹配用户输入的字符等。它构建在JavaScript框架之上。 </P>
<P>报道中指出，该新版本主要是一个漏洞修补版本。希望之前所有用户都来获取升级版本。</P>
<P>下载地址：<A href="http://sourceforge.net/projects/ajaxtags/"><FONT color=#000066>http://sourceforge.net/projects/ajaxtags/</FONT></A></P><img src ="http://www.blogjava.net/zyb9114/aggbug/23356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-11 16:11 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/11/23356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用ASCII码对照表</title><link>http://www.blogjava.net/zyb9114/archive/2005/12/09/23116.html</link><dc:creator>月亮的太阳</dc:creator><author>月亮的太阳</author><pubDate>Fri, 09 Dec 2005 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/zyb9114/archive/2005/12/09/23116.html</guid><wfw:comment>http://www.blogjava.net/zyb9114/comments/23116.html</wfw:comment><comments>http://www.blogjava.net/zyb9114/archive/2005/12/09/23116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zyb9114/comments/commentRss/23116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zyb9114/services/trackbacks/23116.html</trackback:ping><description><![CDATA[<TABLE height=100 cellSpacing=0 cellPadding=0 width=500 border=1>
<TBODY>
<TR>
<TD align=middle width=35><FONT color=#006400>键盘</FONT></TD>
<TD align=middle><FONT color=#006400>ASCII码</FONT></TD>
<TD align=middle><FONT color=#006400>键盘</FONT></TD>
<TD align=middle><FONT color=#006400>ASCII码 </FONT></TD>
<TD align=middle><FONT color=#006400>键盘 </FONT></TD>
<TD align=middle><FONT color=#006400>ASCII码 </FONT></TD>
<TD align=middle><FONT color=#006400>键盘 </FONT></TD>
<TD align=middle><FONT color=#006400>ASCII码 </FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>ESC</FONT></TD>
<TD align=middle><FONT color=#006400>27</FONT></TD>
<TD align=middle><FONT color=#006400>SPACE</FONT></TD>
<TD align=middle><FONT color=#006400>32</FONT></TD>
<TD align=middle><FONT color=#006400>！</FONT></TD>
<TD align=middle><FONT color=#006400>33</FONT></TD>
<TD align=middle><FONT color=#006400>“</FONT></TD>
<TD align=middle><FONT color=#006400>34</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>#</FONT></TD>
<TD align=middle><FONT color=#006400>35</FONT></TD>
<TD align=middle><FONT color=#006400>$</FONT></TD>
<TD align=middle><FONT color=#006400>36</FONT></TD>
<TD align=middle><FONT color=#006400>%</FONT></TD>
<TD align=middle><FONT color=#006400>37</FONT></TD>
<TD align=middle><FONT color=#006400>&amp;</FONT></TD>
<TD align=middle><FONT color=#006400>38</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>'</FONT></TD>
<TD align=middle><FONT color=#006400>39</FONT></TD>
<TD align=middle><FONT color=#006400>(</FONT></TD>
<TD align=middle><FONT color=#006400>40</FONT></TD>
<TD align=middle><FONT color=#006400>)</FONT></TD>
<TD align=middle><FONT color=#006400>41</FONT></TD>
<TD align=middle><FONT color=#006400>*</FONT></TD>
<TD align=middle><FONT color=#006400>42</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>+</FONT></TD>
<TD align=middle><FONT color=#006400>43</FONT></TD>
<TD align=middle><FONT color=#006400>,</FONT></TD>
<TD align=middle><FONT color=#006400>44</FONT></TD>
<TD align=middle><FONT color=#006400>-</FONT></TD>
<TD align=middle><FONT color=#006400>45</FONT></TD>
<TD align=middle><FONT color=#006400>.</FONT></TD>
<TD align=middle><FONT color=#006400>46</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>/</FONT></TD>
<TD align=middle><FONT color=#006400>47</FONT></TD>
<TD align=middle><FONT color=#006400>0</FONT></TD>
<TD align=middle><FONT color=#006400>48</FONT></TD>
<TD align=middle><FONT color=#006400>1</FONT></TD>
<TD align=middle><FONT color=#006400>49</FONT></TD>
<TD align=middle><FONT color=#006400>2</FONT></TD>
<TD align=middle><FONT color=#006400>50</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>3</FONT></TD>
<TD align=middle><FONT color=#006400>51</FONT></TD>
<TD align=middle><FONT color=#006400>4</FONT></TD>
<TD align=middle><FONT color=#006400>52</FONT></TD>
<TD align=middle><FONT color=#006400>5</FONT></TD>
<TD align=middle><FONT color=#006400>53</FONT></TD>
<TD align=middle><FONT color=#006400>6</FONT></TD>
<TD align=middle><FONT color=#006400>54</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>7</FONT></TD>
<TD align=middle><FONT color=#006400>55</FONT></TD>
<TD align=middle><FONT color=#006400>8</FONT></TD>
<TD align=middle><FONT color=#006400>56</FONT></TD>
<TD align=middle><FONT color=#006400>9</FONT></TD>
<TD align=middle><FONT color=#006400>57</FONT></TD>
<TD align=middle><FONT color=#006400>:</FONT></TD>
<TD align=middle><FONT color=#006400>58</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>;</FONT></TD>
<TD align=middle><FONT color=#006400>59</FONT></TD>
<TD align=middle><FONT color=#006400>&lt;</FONT></TD>
<TD align=middle><FONT color=#006400>60</FONT></TD>
<TD align=middle><FONT color=#006400>=</FONT></TD>
<TD align=middle><FONT color=#006400>61</FONT></TD>
<TD align=middle><FONT color=#006400>&gt;</FONT></TD>
<TD align=middle><FONT color=#006400>62</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>?</FONT></TD>
<TD align=middle><FONT color=#006400>63</FONT></TD>
<TD align=middle><FONT color=#006400>@</FONT></TD>
<TD align=middle><FONT color=#006400>64</FONT></TD>
<TD align=middle><FONT color=#006400>A</FONT></TD>
<TD align=middle><FONT color=#006400>65</FONT></TD>
<TD align=middle><FONT color=#006400>B</FONT></TD>
<TD align=middle><FONT color=#006400>66</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>C</FONT></TD>
<TD align=middle><FONT color=#006400>67</FONT></TD>
<TD align=middle><FONT color=#006400>D</FONT></TD>
<TD align=middle><FONT color=#006400>68</FONT></TD>
<TD align=middle><FONT color=#006400>E</FONT></TD>
<TD align=middle><FONT color=#006400>69</FONT></TD>
<TD align=middle><FONT color=#006400>F</FONT></TD>
<TD align=middle><FONT color=#006400>70</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>G</FONT></TD>
<TD align=middle><FONT color=#006400>71</FONT></TD>
<TD align=middle><FONT color=#006400>H</FONT></TD>
<TD align=middle><FONT color=#006400>72</FONT></TD>
<TD align=middle><FONT color=#006400>I</FONT></TD>
<TD align=middle><FONT color=#006400>73</FONT></TD>
<TD align=middle><FONT color=#006400>J</FONT></TD>
<TD align=middle><FONT color=#006400>74</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>K</FONT></TD>
<TD align=middle><FONT color=#006400>75</FONT></TD>
<TD align=middle><FONT color=#006400>L</FONT></TD>
<TD align=middle><FONT color=#006400>76</FONT></TD>
<TD align=middle><FONT color=#006400>M</FONT></TD>
<TD align=middle><FONT color=#006400>77</FONT></TD>
<TD align=middle><FONT color=#006400>N</FONT></TD>
<TD align=middle><FONT color=#006400>30</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>O</FONT></TD>
<TD align=middle><FONT color=#006400>79</FONT></TD>
<TD align=middle><FONT color=#006400>P</FONT></TD>
<TD align=middle><FONT color=#006400>80</FONT></TD>
<TD align=middle><FONT color=#006400>Q</FONT></TD>
<TD align=middle><FONT color=#006400>81</FONT></TD>
<TD align=middle><FONT color=#006400>R</FONT></TD>
<TD align=middle><FONT color=#006400>82</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>S</FONT></TD>
<TD align=middle><FONT color=#006400>83</FONT></TD>
<TD align=middle><FONT color=#006400>T</FONT></TD>
<TD align=middle><FONT color=#006400>84</FONT></TD>
<TD align=middle><FONT color=#006400>U</FONT></TD>
<TD align=middle><FONT color=#006400>85</FONT></TD>
<TD align=middle><FONT color=#006400>V</FONT></TD>
<TD align=middle><FONT color=#006400>86</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>W</FONT></TD>
<TD align=middle><FONT color=#006400>87</FONT></TD>
<TD align=middle><FONT color=#006400>X</FONT></TD>
<TD align=middle><FONT color=#006400>88</FONT></TD>
<TD align=middle><FONT color=#006400>Y</FONT></TD>
<TD align=middle><FONT color=#006400>89</FONT></TD>
<TD align=middle><FONT color=#006400>Z</FONT></TD>
<TD align=middle><FONT color=#006400>90</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>[</FONT></TD>
<TD align=middle><FONT color=#006400>91</FONT></TD>
<TD align=middle><FONT color=#006400>\</FONT></TD>
<TD align=middle><FONT color=#006400>92</FONT></TD>
<TD align=middle><FONT color=#006400>]</FONT></TD>
<TD align=middle><FONT color=#006400>93</FONT></TD>
<TD align=middle><FONT color=#006400>^</FONT></TD>
<TD align=middle><FONT color=#006400>94</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>_</FONT></TD>
<TD align=middle><FONT color=#006400>95</FONT></TD>
<TD align=middle><FONT color=#006400>`</FONT></TD>
<TD align=middle><FONT color=#006400>96</FONT></TD>
<TD align=middle><FONT color=#006400>a</FONT></TD>
<TD align=middle><FONT color=#006400>97</FONT></TD>
<TD align=middle><FONT color=#006400>b</FONT></TD>
<TD align=middle><FONT color=#006400>98</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>c</FONT></TD>
<TD align=middle><FONT color=#006400>99</FONT></TD>
<TD align=middle><FONT color=#006400>d</FONT></TD>
<TD align=middle><FONT color=#006400>100</FONT></TD>
<TD align=middle><FONT color=#006400>e</FONT></TD>
<TD align=middle><FONT color=#006400>101</FONT></TD>
<TD align=middle><FONT color=#006400>f</FONT></TD>
<TD align=middle><FONT color=#006400>102</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>g</FONT></TD>
<TD align=middle><FONT color=#006400>103</FONT></TD>
<TD align=middle><FONT color=#006400>h</FONT></TD>
<TD align=middle><FONT color=#006400>104</FONT></TD>
<TD align=middle><FONT color=#006400>i</FONT></TD>
<TD align=middle><FONT color=#006400>105</FONT></TD>
<TD align=middle><FONT color=#006400>j</FONT></TD>
<TD align=middle><FONT color=#006400>106</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>k</FONT></TD>
<TD align=middle><FONT color=#006400>107</FONT></TD>
<TD align=middle><FONT color=#006400>l</FONT></TD>
<TD align=middle><FONT color=#006400>108</FONT></TD>
<TD align=middle><FONT color=#006400>m</FONT></TD>
<TD align=middle><FONT color=#006400>109</FONT></TD>
<TD align=middle><FONT color=#006400>n</FONT></TD>
<TD align=middle><FONT color=#006400>110</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>o</FONT></TD>
<TD align=middle><FONT color=#006400>111</FONT></TD>
<TD align=middle><FONT color=#006400>p</FONT></TD>
<TD align=middle><FONT color=#006400>112</FONT></TD>
<TD align=middle><FONT color=#006400>q</FONT></TD>
<TD align=middle><FONT color=#006400>113</FONT></TD>
<TD align=middle><FONT color=#006400>r</FONT></TD>
<TD align=middle><FONT color=#006400>114</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>s</FONT></TD>
<TD align=middle><FONT color=#006400>115</FONT></TD>
<TD align=middle><FONT color=#006400>t</FONT></TD>
<TD align=middle><FONT color=#006400>116</FONT></TD>
<TD align=middle><FONT color=#006400>u</FONT></TD>
<TD align=middle><FONT color=#006400>117</FONT></TD>
<TD align=middle><FONT color=#006400>v</FONT></TD>
<TD align=middle><FONT color=#006400>118</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>w</FONT></TD>
<TD align=middle><FONT color=#006400>119</FONT></TD>
<TD align=middle><FONT color=#006400>x</FONT></TD>
<TD align=middle><FONT color=#006400>120</FONT></TD>
<TD align=middle><FONT color=#006400>y</FONT></TD>
<TD align=middle><FONT color=#006400>121</FONT></TD>
<TD align=middle><FONT color=#006400>z</FONT></TD>
<TD align=middle><FONT color=#006400>122</FONT></TD></TR>
<TR>
<TD align=middle width=30><FONT color=#006400>{</FONT></TD>
<TD align=middle><FONT color=#006400>123</FONT></TD>
<TD align=middle><FONT color=#006400>|</FONT></TD>
<TD align=middle><FONT color=#006400>124</FONT></TD>
<TD align=middle><FONT color=#006400>}</FONT></TD>
<TD align=middle><FONT color=#006400>125</FONT></TD>
<TD align=middle><FONT color=#006400>~</FONT></TD>
<TD align=middle><FONT color=#006400>126</FONT></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/zyb9114/aggbug/23116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zyb9114/" target="_blank">月亮的太阳</a> 2005-12-09 11:41 <a href="http://www.blogjava.net/zyb9114/archive/2005/12/09/23116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>