﻿<?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-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-转载</title><link>http://www.blogjava.net/rain1102/category/16395.html</link><description>&lt;b&gt;&lt;font color="#3C1435"&gt;08年奋斗目标：&lt;/font&gt;&lt;font color="#F70E0A"&gt;赚钱买个房子！&lt;/font&gt;&lt;/b&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 15 May 2008 15:33:01 GMT</lastBuildDate><pubDate>Thu, 15 May 2008 15:33:01 GMT</pubDate><ttl>60</ttl><item><title>Red5+OpenOffice+OpenMeetings架设视频会议网络(转)</title><link>http://www.blogjava.net/rain1102/archive/2008/05/15/200591.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 15 May 2008 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/05/15/200591.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/200591.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/05/15/200591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/200591.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/200591.html</trackback:ping><description><![CDATA[因工作需要，这两天弄了一个视频会议服务器。采用了flash流媒体服务器Red5+OpenMeetings。其实是OpenMeetings的运行依 赖于Red5，也就是说OpenMeetings是一个基于Flash的视频会议解决方案。OpenMeetings的一大亮点是能够在会议过程中做 PPT的演示，这一功能得益于OpenOffice的文档转换能力和提供Java远程访问的能力。<br />
&nbsp;&nbsp;&nbsp; 整个架设过程非常简单。<br />
&nbsp;&nbsp;&nbsp; 1、Red5提供了个常见操作系统的安装包，完全傻瓜式的安装，下一步下一步解决。<br />
&nbsp;&nbsp;&nbsp; 2、从OpenMeetings的网站（http://code.google.com/p/openmeetings/downloads/list）下载最新的Web应用，解压到Red5的webapps目录下（Red5内置Tomcat服务器）；<br />
&nbsp;&nbsp;&nbsp; 3、在OpenMeetings的web应用的install目录下修改hibernate.cfg.xml文件，将数据库配置到已创建的数据库（只需要创建数据库，不需要手工建表）；<br />
&nbsp;&nbsp;&nbsp; 4、重启Red5服务，加载OpenMettings应用；<br />
&nbsp;&nbsp;&nbsp; 5、打开浏览器输入http://localhost:5080/xmlcrm/Install(注意大小写，如果你修改了Red5的端口，将5080修 改成您指定的端口)；在现实的页面上点击&#8220;Step 1&#8221;开始OpenMeetings配置。需要注意的是邮件服务器必须正确的填写，否则无法进行用户注册，也就没有用户可以登录使用了。部署时还需要注意两 个工具的配置，一个是SWF工具（完成其它类型文档到swf的转换）和图形工具，这两个工具在配置页面上提供了下载地址（google so cool！），再输入工具地址的时候要以"/"结束。<br />
&nbsp;&nbsp;&nbsp; 6、上一步输入完成后点击&#8220;send&#8221;开始配置，这个配置的过程大概需要5--10分钟，不要以为应用死翘翘了:-)。<br />
&nbsp;&nbsp;&nbsp; 7、配置完成以后就可以登录使用了，enjoy it！<br />
<br />
后记：由于OpenMeetings默认的一个会议室只能4个人参加，不知道老外怎么想的。没办法，只能下载OpeenMeetings的源码作修改。 OpenMeetins的客户端源码是一个&#8220;OpenLaszlo &#8221;的应用，被逼无奈研究了一下OpenLaszlo ，感觉还算是个不错的RIA解决方案。放开人员的限制只需要修改videoconference\xmlcrm\content\conference\ roomlistItem.lzx文件的maxUsers变量的值就可以了；但是你会发现人员限制放开了，但是会议室里面的摄像头个数还是4个，怎么办？ 这个只需要修改一下videoconference\xmlcrm\content\conference\conference.lzx文件，参考原来 的摄像头布局，添加摄像头个数就可以了，不过摄像头个数确实不适合太多，因为摄像头一多数据流量会相当大，服务器压力太大，而且一般的视频会议也就是几个 领导+几个小兵，小兵就不用摄像头了嘛，乖乖的看和听就可以了。&nbsp;<img src ="http://www.blogjava.net/rain1102/aggbug/200591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-05-15 10:58 <a href="http://www.blogjava.net/rain1102/archive/2008/05/15/200591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript类库 - Rico</title><link>http://www.blogjava.net/rain1102/archive/2008/05/13/200217.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 13 May 2008 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/05/13/200217.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/200217.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/05/13/200217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/200217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/200217.html</trackback:ping><description><![CDATA[<p>Apache License的，一个免费使用的东东。<br />
Rico (http://openrico.org/)是开源的JavaScript类库，用来创建丰富的internet应用。<br />
1、可以方便地制作很玄地圆角矩形。<br />
2、可以设置TAB面板<br />
3、支持DRAG&amp;DROP<br />
4、提供一个LiveGrid的数据表格，支持Title Sorting和Page splite<br />
5、提供一个Ajax引擎。<br />
6、提供一个色彩库，默认一些色彩。<br />
7、主页是<a href="http://openrico.org/rico/home.page">http://openrico.org/rico/home.page</a>。&nbsp;<br />
<br />
因为Rico是建立在Prototype类库之上的，所以你在使用Rico的时候必须对Prototype进行引用： <br />
&lt;script type="text/javascript" <br />
&nbsp;src="prototype.js"&gt; <br />
&lt;/script&gt; <br />
&lt;script type="text/javascript" <br />
&nbsp;src="rico.js"&gt; <br />
&lt;/script&gt;</p><img src ="http://www.blogjava.net/rain1102/aggbug/200217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-05-13 15:28 <a href="http://www.blogjava.net/rain1102/archive/2008/05/13/200217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于T60、X60重装系统的解决方案</title><link>http://www.blogjava.net/rain1102/archive/2008/05/06/198758.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 06 May 2008 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/05/06/198758.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/198758.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/05/06/198758.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/198758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/198758.html</trackback:ping><description><![CDATA[&nbsp;<span style="font-size: 11.5pt; color: black; font-family: Arial"><font face="宋体" size="2">T60、X60</font></span><span style="font-size: 11.5pt; color: black; font-family: 宋体">联想采用了</span><span style="font-size: 11.5pt; color: black; font-family: Arial">sata</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">接口的硬盘，安装系统时会出现蓝屏而终止，解决方案如下：</span><span style="font-size: 11.5pt; color: black; font-family: Arial"><br />
</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">开机进</span><span style="font-size: 11.5pt; color: black; font-family: Arial">bios</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">，将</span><span style="font-size: 11.5pt; color: black; font-family: Arial">sata</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">里的</span><span style="font-size: 11.5pt; color: black; font-family: Arial">AHCI</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">模式改为</span><span style="font-size: 11.5pt; color: black; font-family: Arial">compatibility</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">模式，</span><span style="font-size: 11.5pt; color: black; font-family: Arial">F10</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">保存重启，然后安装系统</span><span style="font-size: 11.5pt; color: black; font-family: Arial"><br />
</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">安装完系统后下载</span><span style="font-size: 11.5pt; color: black; font-family: Arial">Intel Matrix Storage Manager Driver</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">（见我贴的附件），默认解压缩至</span><span style="font-size: 11.5pt; color: black; font-family: Arial">C:"DRIVERS"WIN"IMSM</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">，执行</span><span style="font-size: 11.5pt; color: black; font-family: Arial">C:"DRIVERS"WIN"IMSM"prepare"install.bat</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">，重启，</span><span style="font-size: 11.5pt; color: black; font-family: Arial">f1</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">进入</span><span style="font-size: 11.5pt; color: black; font-family: Arial">bios</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">，</span><span style="font-size: 11.5pt; color: black; font-family: Arial">sata</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">改回</span><span style="font-size: 11.5pt; color: black; font-family: Arial">AHCI<br />
</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">进入</span><span style="font-size: 11.5pt; color: black; font-family: Arial">win</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">，发现</span><span style="font-size: 11.5pt; color: black; font-family: Arial">sata</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">控制器，不要搜索，安装驱动时指向</span><span style="font-size: 11.5pt; color: black; font-family: Arial">C:"DRIVERS"WIN"IMSM</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">，系统至此就</span><span style="font-size: 11.5pt; color: black; font-family: Arial">ok</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">了</span><span style="font-size: 11.5pt; color: black; font-family: Arial"><br />
<br />
</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">前面的太简单了，来个详细的</span><span style="font-size: 11.5pt; color: black; font-family: Arial"><br />
T60/X60</span><span style="font-size: 11.5pt; color: black; font-family: 宋体">安装操作系统全攻略</span><span style="font-size: 11.5pt; color: black; font-family: Arial"><br />
<br />
</span><span style="font-size: 10pt; color: black; font-family: Arial">1</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">bios</span><span style="font-size: 10pt; color: black; font-family: 宋体">设置。这一步是针对</span><span style="font-size: 10pt; color: black; font-family: Arial">T60/X60</span><span style="font-size: 10pt; color: black; font-family: 宋体">的。开机按</span><span style="font-size: 10pt; color: black; font-family: Arial">f1</span><span style="font-size: 10pt; color: black; font-family: 宋体">进入</span><span style="font-size: 10pt; color: black; font-family: Arial">bios</span><span style="font-size: 10pt; color: black; font-family: 宋体">，进入</span><span style="font-size: 10pt; color: black; font-family: Arial">configuration</span><span style="font-size: 10pt; color: black; font-family: 宋体">，然后在</span><span style="font-size: 10pt; color: black; font-family: Arial">SATA</span><span style="font-size: 10pt; color: black; font-family: 宋体">里面将</span><span style="font-size: 10pt; color: black; font-family: Arial">SATA</span><span style="font-size: 10pt; color: black; font-family: 宋体">的模式设置成</span><span style="font-size: 10pt; color: black; font-family: Arial">compatibility</span><span style="font-size: 10pt; color: black; font-family: 宋体">（兼容模式），默认的是</span><span style="font-size: 10pt; color: black; font-family: Arial">AHCI</span><span style="font-size: 10pt; color: black; font-family: 宋体">模式（高级主控接口），这一步很重要，否则安装操作系统时会蓝屏，其中的原因，是因为</span><span style="font-size: 10pt; color: black; font-family: Arial">XP</span><span style="font-size: 10pt; color: black; font-family: 宋体">系统安装盘一般不带</span><span style="font-size: 10pt; color: black; font-family: Arial">SATA</span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动。然后按</span><span style="font-size: 10pt; color: black; font-family: Arial">f10</span><span style="font-size: 10pt; color: black; font-family: 宋体">，回车，退出</span><span style="font-size: 10pt; color: black; font-family: Arial">bios</span><span style="font-size: 10pt; color: black; font-family: 宋体">。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;2</span><span style="font-size: 10pt; color: black; font-family: 宋体">、安装光盘。用一张可以光盘启动的</span><span style="font-size: 10pt; color: black; font-family: Arial">XP</span><span style="font-size: 10pt; color: black; font-family: 宋体">安装光盘启动你的电脑，接下来就开始安装了，相对于准备工作，安装倒是轻松很多，经过很多大家熟悉的画面后，</span><span style="font-size: 10pt; color: black; font-family: Arial">XP</span><span style="font-size: 10pt; color: black; font-family: 宋体">安装完成。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;3</span><span style="font-size: 10pt; color: black; font-family: 宋体">、安装系统之后驱动程序的安装还是有点讲究的。最先安装的应该是</span><span style="font-size: 10pt; color: black; font-family: Arial">SATA</span><span style="font-size: 10pt; color: black; font-family: 宋体">硬盘的驱动，否则你就只能一直用兼容模式运行了，那不是可惜了</span><span style="font-size: 10pt; color: black; font-family: Arial">sata</span><span style="font-size: 10pt; color: black; font-family: 宋体">的传输速度了。先在恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里，找到</span><span style="font-size: 10pt; color: black; font-family: Arial">Matrix Storage.exe </span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，双击，会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/drivers/win/imsm</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录，然后运行</span><span style="font-size: 10pt; color: black; font-family: Arial">c:/drivers/win/imsm/prepare</span><span style="font-size: 10pt; color: black; font-family: 宋体">里面的</span><span style="font-size: 10pt; color: black; font-family: Arial">install.bat</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，完成之后，重启，就可以在</span><span style="font-size: 10pt; color: black; font-family: Arial">bios</span><span style="font-size: 10pt; color: black; font-family: 宋体">里面把</span><span style="font-size: 10pt; color: black; font-family: Arial">sata</span><span style="font-size: 10pt; color: black; font-family: 宋体">的模式改回</span><span style="font-size: 10pt; color: black; font-family: Arial">ahci</span><span style="font-size: 10pt; color: black; font-family: 宋体">了，进入系统之后会提示发现</span><span style="font-size: 10pt; color: black; font-family: Arial">ide</span><span style="font-size: 10pt; color: black; font-family: 宋体">控制器，安装驱动时指向</span><span style="font-size: 10pt; color: black; font-family: Arial">c:/drivers/win/imsm</span><span style="font-size: 10pt; color: black; font-family: 宋体">即可。</span><span style="font-size: 11.5pt; color: black; font-family: Arial"><br />
</span><span style="font-size: 10pt; color: black; font-family: Arial">4</span><span style="font-size: 10pt; color: black; font-family: 宋体">、接下来安装其他驱动程序和软件。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">一、芯片组驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;Intel</span><span style="font-size: 10pt; color: black; font-family: 宋体">芯片组驱动</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，它会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERS/WIN/INTELINF</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。到此目录下运行</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;setup.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">就可以安装了。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">二、显卡驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60</span><span style="font-size: 10pt; color: black; font-family: 宋体">显卡驱动</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，它会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERS/WIN/VIDEO</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。到此目录下运行</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;setup.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">就可以安装了。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">三、电源管理驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;IBM</span><span style="font-size: 10pt; color: black; font-family: 宋体">电源管理</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，它会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERS/WIN/IBMPM</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。到此目录下运行</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;setup.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">就可以安装了。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">四、安全芯片驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;</span><span style="font-size: 10pt; color: black; font-family: 宋体">安全芯片</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，它会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERSWIN/TPM</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。到此目录下运行</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;setup.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">就可以安装了。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">五、</span><span style="font-size: 10pt; color: black; font-family: Arial">HD</span><span style="font-size: 10pt; color: black; font-family: 宋体">总线驱动。装驱动第二个难点在于</span><span style="font-size: 10pt; color: black; font-family: Arial">HD</span><span style="font-size: 10pt; color: black; font-family: 宋体">总线，这是</span><span style="font-size: 10pt; color: black; font-family: Arial">T60/X60</span><span style="font-size: 10pt; color: black; font-family: 宋体">上的一个高端东西，就是高清晰的音频总线。在设备管理器里有个未知设备，把它的驱动程序路径指向恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">－</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;HD</span><span style="font-size: 10pt; color: black; font-family: 宋体">总线</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录，就可以顺利安装了。只有先安装了</span><span style="font-size: 10pt; color: black; font-family: Arial">HD</span><span style="font-size: 10pt; color: black; font-family: 宋体">总线，才能安装声卡和</span><span style="font-size: 10pt; color: black; font-family: Arial">modem</span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动，切记！</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">六、声卡、</span><span style="font-size: 10pt; color: black; font-family: Arial">modem</span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;</span><span style="font-size: 10pt; color: black; font-family: 宋体">声卡驱动</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件和</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;modem</span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，它会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERS/WINAudio</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。到此目录下运行</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;setup.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">就可以安装了。</span><span style="font-size: 10pt; color: black; font-family: Arial">modem </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERS/HDAMODEM </span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">七、网卡、无线网卡驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;</span><span style="font-size: 10pt; color: black; font-family: 宋体">网卡驱动</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件和</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;</span><span style="font-size: 10pt; color: black; font-family: 宋体">无线网卡驱动</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，它会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERS/WIN/ETHERNET </span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: Arial"> WLANINT </span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。到此目录下运行</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;setup.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">就可以安装了。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">八、鼠标、触摸板驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;UltraNav.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件（</span><span style="font-size: 10pt; color: black; font-family: Arial">X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">是</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;Trackpoint.exe</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件），它会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERS/W2K/UNAV </span><span style="font-size: 10pt; color: black; font-family: 宋体">和</span><span style="font-size: 10pt; color: black; font-family: Arial"> TPOINT </span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。到此目录下运行</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;setup.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">就可以安装了。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">九、指纹识别驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;</span><span style="font-size: 10pt; color: black; font-family: 宋体">指纹识别</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，就可以安装了。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">十、蓝牙驱动。运行恢复光盘里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;T60/X60 </span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动和软件</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;</span><span style="font-size: 10pt; color: black; font-family: 宋体">蓝牙</span><span style="font-size: 10pt; color: black; font-family: Arial">.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">文件，它会解压到</span><span style="font-size: 10pt; color: black; font-family: Arial">C:/DRIVERS/WIN/TPBTooth</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录下。到此目录下运行</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;setup.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">就可以安装了。</span><span style="font-size: 11.5pt; color: black; font-family: Arial"><br />
<br />
</span><span style="font-size: 10pt; color: black; font-family: Arial">IBM</span><span style="font-size: 10pt; color: black; font-family: 宋体">的各种工具软件，有些很实用，有些没用，大家各取所需吧。下面一一介绍：</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;1</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Configuration utility</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－系统实用配置工具，在这里，你可以了解你电脑的方方面面，包括系统信息、操作使用和配置。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;2</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Hotkey</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－快捷键及屏幕显示工具。如果你突然发现你按了音量键或者调整屏幕亮度，却没看到屏幕上有显示，安装它就没错了。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;3</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">power manager</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－察看你的电池信息，调整电源使用方案。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;4</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">APS</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－硬盘保护工具，保护你的硬盘不受伤害。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;5</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">EasyEject</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－快速弹出</span><span style="font-size: 10pt; color: black; font-family: Arial">USB </span><span style="font-size: 10pt; color: black; font-family: 宋体">设备的工具，要想使用</span><span style="font-size: 10pt; color: black; font-family: Arial">Fn</span><span style="font-size: 10pt; color: black; font-family: 宋体">＋</span><span style="font-size: 10pt; color: black; font-family: Arial">F9</span><span style="font-size: 10pt; color: black; font-family: 宋体">的功能键，就先安装它。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;6</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Keyboard Customizer</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－定制键盘快捷键的工具。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;7</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">systemupdate</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－要保持你的驱动和软件是最新版本就用它吧，会为你上网搜索最新的驱动和工具软件。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;8</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Access Connections</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－让你在不同的网络环境下自由切换，减少烦琐的设置。如果你想使用</span><span style="font-size: 10pt; color: black; font-family: Arial">Fn</span><span style="font-size: 10pt; color: black; font-family: 宋体">＋</span><span style="font-size: 10pt; color: black; font-family: Arial">F5</span><span style="font-size: 10pt; color: black; font-family: 宋体">的快捷键，也要安装它。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;9</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">UltraNav Wizard</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－小红帽与触摸板的调整工具，安装它，你可以使用</span><span style="font-size: 10pt; color: black; font-family: Arial">Fn</span><span style="font-size: 10pt; color: black; font-family: 宋体">＋</span><span style="font-size: 10pt; color: black; font-family: Arial">F8</span><span style="font-size: 10pt; color: black; font-family: 宋体">的快捷键。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;10</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Presentation</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－把电脑输出到投影仪上的调整工具。</span><span style="font-size: 11.5pt; color: black; font-family: Arial"><br />
</span><span style="font-size: 10pt; color: black; font-family: Arial">11</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Productivity</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－一个介绍怎样使用小黑各种功能的工具。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;12</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Help Center</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－帮助中心，有问题就到这里找答案。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;13</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Message Center</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－发布关于小黑的最新消息。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;14</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Away Manager</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－当你离开电脑的时候，可以用这个工具来设置，让小黑继续按照你的意愿继续工作。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;15</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Client Security Solution</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－客户端安装解决方案，可以用它来为文件加密，还有密码管理器功能。提醒大家一定要小心使用，如果因为使用它而导致任何数据及资料损失，本站概不负责！</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
&nbsp;&nbsp;16</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Rescue and Recovery</span><span style="font-size: 10pt; color: black; font-family: 宋体">－－备份与恢复软件。要使用到</span><span style="font-size: 10pt; color: black; font-family: Arial">IBM</span><span style="font-size: 10pt; color: black; font-family: 宋体">的一键恢复功能，一定要先安装它。本人认为，这是一个笨拙、烦琐的东西，不推荐使用。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
<br />
</span><span style="font-size: 10pt; color: black; font-family: 宋体">备注：安装</span><span style="font-size: 10pt; color: black; font-family: Arial">Windows 2003 </span><span style="font-size: 10pt; color: black; font-family: 宋体">的要点：</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
1</span><span style="font-size: 10pt; color: black; font-family: 宋体">、先升级到</span><span style="font-size: 10pt; color: black; font-family: Arial">SP1</span><span style="font-size: 10pt; color: black; font-family: 宋体">；</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
2</span><span style="font-size: 10pt; color: black; font-family: 宋体">、安装</span><span style="font-size: 10pt; color: black; font-family: Arial">2003</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里的</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;WindowsServer2003-KB901105-v3-x86-CHS.exe&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">补丁，否则无法安装声卡驱动和</span><span style="font-size: 10pt; color: black; font-family: Arial">modem</span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动；</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
3</span><span style="font-size: 10pt; color: black; font-family: 宋体">、有个未知设备是</span><span style="font-size: 10pt; color: black; font-family: Arial">SD</span><span style="font-size: 10pt; color: black; font-family: 宋体">读卡器，驱动在</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8220;2003&#8221;-&#8220;SD</span><span style="font-size: 10pt; color: black; font-family: 宋体">驱动</span><span style="font-size: 10pt; color: black; font-family: Arial">&#8221;</span><span style="font-size: 10pt; color: black; font-family: 宋体">里；</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
4</span><span style="font-size: 10pt; color: black; font-family: 宋体">、</span><span style="font-size: 10pt; color: black; font-family: Arial">Windows 2003 </span><span style="font-size: 10pt; color: black; font-family: 宋体">企业版本身不支持红外线设备，所以必须另外安装红外线驱动。驱动也在</span><span style="font-size: 10pt; color: black; font-family: Arial">2003</span><span style="font-size: 10pt; color: black; font-family: 宋体">目录里。</span><span style="font-size: 10pt; color: black; font-family: Arial"><br />
</span><span style="font-size: 10pt; color: black; font-family: 宋体">其余驱动的安装方法与</span><span style="font-size: 10pt; color: black; font-family: Arial">XP</span><span style="font-size: 10pt; color: black; font-family: 宋体">一样。</span><img src ="http://www.blogjava.net/rain1102/aggbug/198758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-05-06 17:29 <a href="http://www.blogjava.net/rain1102/archive/2008/05/06/198758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Commons工具集简介[转]</title><link>http://www.blogjava.net/rain1102/archive/2008/05/04/198009.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sun, 04 May 2008 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/05/04/198009.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/198009.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/05/04/198009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/198009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/198009.html</trackback:ping><description><![CDATA[Apache&nbsp;Commons包含了很多开源的工具，用于解决平时编程经常会遇到的问题，减少重复劳动。我选了一些比较常用的项目做简单介绍。文中用了很多网上现成的东西，我只是做了一个汇总整理。<br />
<br />
<strong>Commons&nbsp;BeanUtils</strong><br />
<a href="http://jakarta.apache.org/commons/beanutils/index.html">http://jakarta.apache.org/commons/beanutils/index.html</a><br />
说明：针对Bean的一个工具集。由于Bean往往是有一堆get和set组成，所以BeanUtils也是在此基础上进行一些包装。<br />
使用示例：功能有很多，网站上有详细介绍。一个比较常用的功能是Bean&nbsp;Copy，也就是copy&nbsp;bean的属性。如果做分层架构开发的话就会用到，比如从PO（Persistent&nbsp;Object）拷贝数据到VO（Value&nbsp;Object）。<br />
传统方法如下：<br />
//得到TeacherForm<br />
&nbsp;TeacherForm&nbsp;teacherForm=(TeacherForm)form;<br />
&nbsp;//构造Teacher对象<br />
&nbsp;Teacher&nbsp;teacher=new&nbsp;Teacher();<br />
&nbsp;//赋值<br />
&nbsp;teacher.setName(teacherForm.getName());<br />
&nbsp;teacher.setAge(teacherForm.getAge());<br />
&nbsp;teacher.setGender(teacherForm.getGender());<br />
&nbsp;teacher.setMajor(teacherForm.getMajor());<br />
&nbsp;teacher.setDepartment(teacherForm.getDepartment());<br />
&nbsp;&nbsp;<br />
&nbsp;//持久化Teacher对象到数据库<br />
&nbsp;HibernateDAO=&nbsp;;<br />
&nbsp;HibernateDAO.save(teacher);<br />
<br />
使用BeanUtils后，代码就大大改观了，如下所示：<br />
//得到TeacherForm<br />
&nbsp;TeacherForm&nbsp;teacherForm=(TeacherForm)form;<br />
&nbsp;//构造Teacher对象<br />
&nbsp;Teacher&nbsp;teacher=new&nbsp;Teacher();<br />
&nbsp;//赋值<br />
&nbsp;BeanUtils.copyProperties(teacher,teacherForm);<br />
&nbsp;//持久化Teacher对象到数据库<br />
&nbsp;HibernateDAO=&nbsp;;<br />
&nbsp;HibernateDAO.save(teacher);<br />
<br />
<strong>Commons&nbsp;CLI</strong><br />
<a href="http://jakarta.apache.org/commons/cli/index.html">http://jakarta.apache.org/commons/cli/index.html</a><br />
说明：这是一个处理命令的工具。比如main方法输入的string[]需要解析。你可以预先定义好参数的规则，然后就可以调用CLI来解析。<br />
使用示例：<br />
//&nbsp;create&nbsp;Options&nbsp;object<br />
Options&nbsp;options&nbsp;=&nbsp;new&nbsp;Options();<br />
//&nbsp;add&nbsp;t&nbsp;option,&nbsp;option&nbsp;is&nbsp;the&nbsp;command&nbsp;parameter,&nbsp;false&nbsp;indicates&nbsp;that&nbsp;<br />
//&nbsp;this&nbsp;parameter&nbsp;is&nbsp;not&nbsp;required.<br />
options.addOption(&#8220;t&#8221;,&nbsp;false,&nbsp;&#8220;display&nbsp;current&nbsp;time&#8221;);<br />
options.addOption("c",&nbsp;true,&nbsp;"country&nbsp;code");<br />
CommandLineParser&nbsp;parser&nbsp;=&nbsp;new&nbsp;PosixParser();<br />
CommandLine&nbsp;cmd&nbsp;=&nbsp;parser.parse(&nbsp;options,&nbsp;args);<br />
if(cmd.hasOption("t"))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;print&nbsp;the&nbsp;date&nbsp;and&nbsp;time<br />
}<br />
else&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;print&nbsp;the&nbsp;date<br />
}<br />
//&nbsp;get&nbsp;c&nbsp;option&nbsp;value<br />
String&nbsp;countryCode&nbsp;=&nbsp;cmd.getOptionValue("c");<br />
<br />
if(countryCode&nbsp;==&nbsp;null)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;print&nbsp;default&nbsp;date<br />
}<br />
else&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;print&nbsp;date&nbsp;for&nbsp;country&nbsp;specified&nbsp;by&nbsp;countryCode<br />
}<br />
<br />
<strong>Commons&nbsp;Codec</strong><br />
<a href="http://jakarta.apache.org/commons/codec/index.html">http://jakarta.apache.org/commons/codec/index.html</a><br />
说明：这个工具是用来编码和解码的，包括Base64，URL，Soundx等等。用这个工具的人应该很清楚这些，我就不多介绍了。<br />
<br />
<strong>Commons&nbsp;Collections</strong><br />
<a href="http://jakarta.apache.org/commons/collections/">http://jakarta.apache.org/commons/collections/</a><br />
说明：你可以把这个工具看成是java.util的扩展。<br />
使用示例：举一个简单的例子<br />
OrderedMap&nbsp;map&nbsp;=&nbsp;new&nbsp;LinkedMap();<br />
map.put("FIVE",&nbsp;"5");<br />
map.put("SIX",&nbsp;"6");<br />
map.put("SEVEN",&nbsp;"7");<br />
map.firstKey();&nbsp;&nbsp;//&nbsp;returns&nbsp;"FIVE"<br />
map.nextKey("FIVE");&nbsp;&nbsp;//&nbsp;returns&nbsp;"SIX"<br />
map.nextKey("SIX");&nbsp;&nbsp;//&nbsp;returns&nbsp;"SEVEN"<br />
<br />
<strong>Commons&nbsp;Configuration<br />
</strong><a href="http://jakarta.apache.org/commons/configuration/">http://jakarta.apache.org/commons/configuration/</a><br />
说明：这个工具是用来帮助处理配置文件的，支持很多种存储方式<br />
1.&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;files<br />
2.&nbsp;&nbsp;&nbsp;&nbsp;XML&nbsp;documents<br />
3.&nbsp;&nbsp;&nbsp;&nbsp;Property&nbsp;list&nbsp;files&nbsp;(.plist)<br />
4.&nbsp;&nbsp;&nbsp;&nbsp;JNDI<br />
5.&nbsp;&nbsp;&nbsp;&nbsp;JDBC&nbsp;Datasource<br />
6.&nbsp;&nbsp;&nbsp;&nbsp;System&nbsp;properties<br />
7.&nbsp;&nbsp;&nbsp;&nbsp;Applet&nbsp;parameters<br />
8.&nbsp;&nbsp;&nbsp;&nbsp;Servlet&nbsp;parameters<br />
使用示例：举一个Properties的简单例子<br />
#&nbsp;usergui.properties,&nbsp;definining&nbsp;the&nbsp;GUI,<br />
colors.background&nbsp;=&nbsp;#FFFFFF<br />
colors.foreground&nbsp;=&nbsp;#000080<br />
<br />
window.width&nbsp;=&nbsp;500<br />
window.height&nbsp;=&nbsp;300<br />
<br />
PropertiesConfiguration&nbsp;config&nbsp;=&nbsp;new&nbsp;PropertiesConfiguration("usergui.properties");<br />
config.setProperty("colors.background",&nbsp;"#000000);<br />
config.save();<br />
config.save("usergui.backup.properties);//save&nbsp;a&nbsp;copy<br />
Integer&nbsp;integer&nbsp;=&nbsp;config.getInteger("window.width");<br />
<br />
<strong>Commons&nbsp;DBCP<br />
</strong><a href="http://jakarta.apache.org/commons/dbcp/">http://jakarta.apache.org/commons/dbcp/</a><br />
说明：Database&nbsp;Connection&nbsp;pool,&nbsp;Tomcat就是用的这个，不用我多说了吧，要用的自己去网站上看说明。<br />
<br />
<strong>Commons&nbsp;DbUtils</strong><br />
<a href="http://jakarta.apache.org/commons/dbutils/">http://jakarta.apache.org/commons/dbutils/</a><br />
说明：我以前在写数据库程序的时候，往往把数据库操作单独做一个包。DbUtils就是这样一个工具，以后开发不用再重复这样的工作了。值得一体的是，这个工具并不是现在流行的OR-Mapping工具（比如Hibernate），只是简化数据库操作，比如<br />
QueryRunner&nbsp;run&nbsp;=&nbsp;new&nbsp;QueryRunner(dataSource);<br />
//&nbsp;Execute&nbsp;the&nbsp;query&nbsp;and&nbsp;get&nbsp;the&nbsp;results&nbsp;back&nbsp;from&nbsp;the&nbsp;handler<br />
Object[]&nbsp;result&nbsp;=&nbsp;(Object[])&nbsp;run.query(<br />
&nbsp;&nbsp;&nbsp;&nbsp;"SELECT&nbsp;*&nbsp;FROM&nbsp;Person&nbsp;WHERE&nbsp;name=?",&nbsp;"John&nbsp;Doe");<br />
<br />
<strong>Commons&nbsp;FileUpload</strong><br />
<a href="http://jakarta.apache.org/commons/fileupload/">http://jakarta.apache.org/commons/fileupload/</a><br />
说明：jsp的上传文件功能怎么做呢？<br />
使用示例：<br />
//&nbsp;Create&nbsp;a&nbsp;factory&nbsp;for&nbsp;disk-based&nbsp;file&nbsp;items<br />
FileItemFactory&nbsp;factory&nbsp;=&nbsp;new&nbsp;DiskFileItemFactory();<br />
<br />
//&nbsp;Create&nbsp;a&nbsp;new&nbsp;file&nbsp;upload&nbsp;handler<br />
ServletFileUpload&nbsp;upload&nbsp;=&nbsp;new&nbsp;ServletFileUpload(factory);<br />
<br />
//&nbsp;Parse&nbsp;the&nbsp;request<br />
List&nbsp;/*&nbsp;FileItem&nbsp;*/&nbsp;items&nbsp;=&nbsp;upload.parseRequest(request);<br />
//&nbsp;Process&nbsp;the&nbsp;uploaded&nbsp;items<br />
Iterator&nbsp;iter&nbsp;=&nbsp;items.iterator();<br />
while&nbsp;(iter.hasNext())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;FileItem&nbsp;item&nbsp;=&nbsp;(FileItem)&nbsp;iter.next();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(item.isFormField())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processFormField(item);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processUploadedFile(item);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<strong>Commons&nbsp;HttpClient</strong><br />
<a href="http://jakarta.apache.org/commons/httpclient/">http://jakarta.apache.org/commons/httpclient/</a><br />
说明：这个工具可以方便通过编程的方式去访问网站。<br />
使用示例：最简单的Get操作<br />
GetMethod&nbsp;get&nbsp;=&nbsp;new&nbsp;GetMethod("http://jakarta.apache.org");<br />
//&nbsp;execute&nbsp;method&nbsp;and&nbsp;handle&nbsp;any&nbsp;error&nbsp;responses.<br />
&nbsp;&nbsp;...<br />
InputStream&nbsp;in&nbsp;=&nbsp;get.getResponseBodyAsStream();<br />
//&nbsp;Process&nbsp;the&nbsp;data&nbsp;from&nbsp;the&nbsp;input&nbsp;stream.<br />
&nbsp;get.releaseConnection();<br />
<br />
<strong>Commons&nbsp;IO</strong><br />
http://jakarta.apache.org/commons/io/<br />
说明：可以看成是java.io的扩展，我觉得用起来非常方便。<br />
使用示例：<br />
1．读取Stream<br />
标准代码：<br />
InputStream&nbsp;in&nbsp;=&nbsp;new&nbsp;URL(&nbsp;"http://jakarta.apache.org"&nbsp;).openStream();<br />
&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;InputStreamReader&nbsp;inR&nbsp;=&nbsp;new&nbsp;InputStreamReader(&nbsp;in&nbsp;);<br />
&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;buf&nbsp;=&nbsp;new&nbsp;BufferedReader(&nbsp;inR&nbsp;);<br />
&nbsp;&nbsp;&nbsp;String&nbsp;line;<br />
&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;(&nbsp;line&nbsp;=&nbsp;buf.readLine()&nbsp;)&nbsp;!=&nbsp;null&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;line&nbsp;);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;}&nbsp;finally&nbsp;{<br />
&nbsp;&nbsp;&nbsp;in.close();<br />
&nbsp;}<br />
使用IOUtils<br />
InputStream&nbsp;in&nbsp;=&nbsp;new&nbsp;URL(&nbsp;"http://jakarta.apache.org"&nbsp;).openStream();<br />
&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;IOUtils.toString(&nbsp;in&nbsp;)&nbsp;);<br />
&nbsp;}&nbsp;finally&nbsp;{<br />
&nbsp;&nbsp;&nbsp;IOUtils.closeQuietly(in);<br />
&nbsp;}<br />
<br />
2．读取文件<br />
File&nbsp;file&nbsp;=&nbsp;new&nbsp;File("/commons/io/project.properties");<br />
List&nbsp;lines&nbsp;=&nbsp;FileUtils.readLines(file,&nbsp;"UTF-8");<br />
<br />
3．察看剩余空间<br />
long&nbsp;freeSpace&nbsp;=&nbsp;FileSystemUtils.freeSpace("C:/");<br />
<br />
<br />
<strong>Commons&nbsp;JXPath</strong><br />
http://jakarta.apache.org/commons/jxpath/<br />
说明：Xpath你知道吧，那么JXpath就是基于Java对象的Xpath，也就是用Xpath对Java对象进行查询。这个东西还是很有想像力的。<br />
使用示例：<br />
Address&nbsp;address&nbsp;=&nbsp;(Address)JXPathContext.newContext(vendor).<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getValue("locations[address/zipCode='90210']/address");<br />
上述代码等同于<br />
Address&nbsp;address&nbsp;=&nbsp;null;<br />
Collection&nbsp;locations&nbsp;=&nbsp;vendor.getLocations();<br />
Iterator&nbsp;it&nbsp;=&nbsp;locations.iterator();<br />
while&nbsp;(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;location&nbsp;=&nbsp;(Location)it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;zipCode&nbsp;=&nbsp;location.getAddress().getZipCode();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(zipCode.equals("90210")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address&nbsp;=&nbsp;location.getAddress();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<br />
<strong>Commons&nbsp;Lang</strong><br />
http://jakarta.apache.org/commons/lang/<br />
说明：这个工具包可以看成是对java.lang的扩展。提供了诸如StringUtils,&nbsp;StringEscapeUtils,&nbsp;RandomStringUtils,&nbsp;Tokenizer,&nbsp;WordUtils等工具类。<br />
<br />
<strong>Commons&nbsp;Logging<br />
</strong>http://jakarta.apache.org/commons/logging/<br />
说明：你知道Log4j吗？<br />
<br />
<strong>Commons&nbsp;Math</strong><br />
http://jakarta.apache.org/commons/math/<br />
说明：看名字你就应该知道这个包是用来干嘛的了吧。这个包提供的功能有些和Commons&nbsp;Lang重复了，但是这个包更专注于做数学工具，功能更强大。<br />
<br />
<strong>Commons&nbsp;Net</strong><br />
http://jakarta.apache.org/commons/net/<br />
说明：这个包还是很实用的，封装了很多网络协议。<br />
1.&nbsp;&nbsp;&nbsp;&nbsp;FTP<br />
2.&nbsp;&nbsp;&nbsp;&nbsp;NNTP<br />
3.&nbsp;&nbsp;&nbsp;&nbsp;SMTP<br />
4.&nbsp;&nbsp;&nbsp;&nbsp;POP3<br />
5.&nbsp;&nbsp;&nbsp;&nbsp;Telnet<br />
6.&nbsp;&nbsp;&nbsp;&nbsp;TFTP<br />
7.&nbsp;&nbsp;&nbsp;&nbsp;Finger<br />
8.&nbsp;&nbsp;&nbsp;&nbsp;Whois<br />
9.&nbsp;&nbsp;&nbsp;&nbsp;rexec/rcmd/rlogin<br />
10.&nbsp;&nbsp;&nbsp;&nbsp;Time&nbsp;(rdate)&nbsp;and&nbsp;Daytime<br />
11.&nbsp;&nbsp;&nbsp;&nbsp;Echo<br />
12.&nbsp;&nbsp;&nbsp;&nbsp;Discard<br />
13.&nbsp;&nbsp;&nbsp;&nbsp;NTP/SNTP<br />
使用示例：<br />
TelnetClient&nbsp;telnet&nbsp;=&nbsp;new&nbsp;TelnetClient();<br />
telnet.connect(&nbsp;"192.168.1.99",&nbsp;23&nbsp;);<br />
InputStream&nbsp;in&nbsp;=&nbsp;telnet.getInputStream();<br />
PrintStream&nbsp;out&nbsp;=&nbsp;new&nbsp;PrintStream(&nbsp;telnet.getOutputStream()&nbsp;);<br />
...<br />
telnet.close();<br />
<br />
<strong>Commons&nbsp;Validator</strong><br />
http://jakarta.apache.org/commons/validator/<br />
说明：用来帮助进行验证的工具。比如验证Email字符串，日期字符串等是否合法。<br />
使用示例：<br />
//&nbsp;Get&nbsp;the&nbsp;Date&nbsp;validator<br />
DateValidator&nbsp;validator&nbsp;=&nbsp;DateValidator.getInstance();<br />
//&nbsp;Validate/Convert&nbsp;the&nbsp;date<br />
Date&nbsp;fooDate&nbsp;=&nbsp;validator.validate(fooString,&nbsp;"dd/MM/yyyy");<br />
if&nbsp;(fooDate&nbsp;==&nbsp;null)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;error...not&nbsp;a&nbsp;valid&nbsp;date<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
}<br />
<br />
<strong>Commons&nbsp;Virtual&nbsp;File&nbsp;System<br />
</strong>http://jakarta.apache.org/commons/vfs/<br />
说明：提供对各种资源的访问接口。支持的资源类型包括<br />
1.&nbsp;&nbsp;&nbsp;&nbsp;CIFS&nbsp;<br />
2.&nbsp;&nbsp;&nbsp;&nbsp;FTP&nbsp;<br />
3.&nbsp;&nbsp;&nbsp;&nbsp;Local&nbsp;Files&nbsp;<br />
4.&nbsp;&nbsp;&nbsp;&nbsp;HTTP&nbsp;and&nbsp;HTTPS&nbsp;<br />
5.&nbsp;&nbsp;&nbsp;&nbsp;SFTP&nbsp;<br />
6.&nbsp;&nbsp;&nbsp;&nbsp;Temporary&nbsp;Files&nbsp;<br />
7.&nbsp;&nbsp;&nbsp;&nbsp;WebDAV&nbsp;<br />
8.&nbsp;&nbsp;&nbsp;&nbsp;Zip,&nbsp;Jar&nbsp;and&nbsp;Tar&nbsp;(uncompressed,&nbsp;tgz&nbsp;or&nbsp;tbz2)&nbsp;<br />
9.&nbsp;&nbsp;&nbsp;&nbsp;gzip&nbsp;and&nbsp;bzip2&nbsp;<br />
10.&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;<br />
11.&nbsp;&nbsp;&nbsp;&nbsp;ram&nbsp;<br />
这个包的功能很强大，极大的简化了程序对资源的访问。<br />
使用示例：<br />
从jar中读取文件<br />
//&nbsp;Locate&nbsp;the&nbsp;Jar&nbsp;file<br />
FileSystemManager&nbsp;fsManager&nbsp;=&nbsp;VFS.getManager();<br />
FileObject&nbsp;jarFile&nbsp;=&nbsp;fsManager.resolveFile(&nbsp;"jar:lib/aJarFile.jar"&nbsp;);<br />
<br />
//&nbsp;List&nbsp;the&nbsp;children&nbsp;of&nbsp;the&nbsp;Jar&nbsp;file<br />
FileObject[]&nbsp;children&nbsp;=&nbsp;jarFile.getChildren();<br />
System.out.println(&nbsp;"Children&nbsp;of&nbsp;"&nbsp;+&nbsp;jarFile.getName().getURI()&nbsp;);<br />
for&nbsp;(&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;children.length;&nbsp;i++&nbsp;)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;children[&nbsp;i&nbsp;].getName().getBaseName()&nbsp;);<br />
}<br />
从smb读取文件<br />
StaticUserAuthenticator&nbsp;auth&nbsp;=&nbsp;new&nbsp;StaticUserAuthenticator("username",&nbsp;"password",&nbsp;null);<br />
FileSystemOptions&nbsp;opts&nbsp;=&nbsp;new&nbsp;FileSystemOptions();<br />
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts,&nbsp;auth);&nbsp;<br />
FileObject&nbsp;fo&nbsp;=&nbsp;VFS.getManager().resolveFile("smb://host/anyshare/dir",&nbsp;opts);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
有人说Apache就像是丐帮，里面的项目多而杂。的确如此，Apache的项目水平参差不齐，而且不同的项目之间也常常会有功能重叠，甚至有撞车，比如Ant和Maven。不过Apache的优秀项目还是有很多的，比如Apache&nbsp;Http&nbsp;Server，Tomcat，Ant,&nbsp;Geronimo等等。Apache&nbsp;Commons是工具包，为其他项目提供支持，很多Commons中的项目就是从其他项目中抽取出来的。希望我的介绍能对你有所帮助，有些我提到的Commons中的项目我也没有用过，只是现学现卖，难免错误和疏漏，希望谅解。<br /><img src ="http://www.blogjava.net/rain1102/aggbug/198009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-05-04 10:27 <a href="http://www.blogjava.net/rain1102/archive/2008/05/04/198009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[译]volatile关键字有什么用？[转载]</title><link>http://www.blogjava.net/rain1102/archive/2008/04/24/195408.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 24 Apr 2008 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/24/195408.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/195408.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/24/195408.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/195408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/195408.html</trackback:ping><description><![CDATA[<p>最近看LumaQQ的源码发现一个volatile（中文意思是&#8220;可变的、不稳定的&#8221;），找了篇英文介绍。抽空我翻译了一下，翻错了大家不要见笑。。。</p>
<p>volatile关键字有什么用？<br />
　　恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符，而synchronized则作用于一段代码或方法；看如下三句get代码：</p>
<span style="color: olive">
<li class="hl-firstline"><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">i1</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">geti1</span><span style="color: olive">()</span><span style="color: gray"> </span><span style="color: olive">{</span><span style="color: green">return</span><span style="color: gray"> </span><span style="color: blue">i1</span><span style="color: gray">;</span><span style="color: olive">}</span>
<li><span style="color: green">volatile</span><span style="color: gray">&nbsp;</span><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">i2</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">geti2</span><span style="color: olive">()</span><span style="color: gray"> </span><span style="color: olive">{</span><span style="color: green">return</span><span style="color: gray"> </span><span style="color: blue">i2</span><span style="color: gray">;</span><span style="color: olive">}</span>
<li><span class="hl-types">int</span><span style="color: gray">&nbsp;</span><span style="color: blue">i3</span><span style="color: gray">; </span><span style="color: green">synchronized</span><span style="color: gray">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">geti3</span><span style="color: olive">()</span><span style="color: gray"> </span><span style="color: olive">{</span><span style="color: green">return</span><span style="color: gray"> </span><span style="color: blue">i3</span><span style="color: gray">;</span><span style="color: olive">}</span></li>
</span>
<p>　　geti1()得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝，而且这些i1之间可以互不相同。换句话说，另一个线程可能已经改变了它线程内的i1值，而这个值可以和当前线程中的i1值不相同。事实上，Java有个思想叫&#8220;主&#8221;内存区域，这里存放了变量目前的&#8220;准确值&#8221;。每个线程可以有它自己的变量拷贝，而这个变量拷贝值可以和&#8220;主&#8221;内存区域里存放的不同。因此实际上存在一种可能：&#8220;主&#8221;内存区域里的i1值是1，线程1里的i1值是2，线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值，而且这个改变还没来得及传递给&#8220;主&#8221;内存区域或其他线程时就会发生。<br />
　　而geti2()得到的是&#8220;主&#8221;内存区域的i2数值。用volatile修饰后的变量不允许有不同于&#8220;主&#8221;内存区域的变量拷贝。换句话说，一个变量经volatile修饰后在所有线程中必须是同步的；任何线程中改变了它的值，所有其他线程立即获取到了相同的值。理所当然的，volatile修饰的变量存取时比一般变量消耗的资源要多一点，因为线程有它自己的变量拷贝更为高效。<br />
　　既然volatile关键字已经实现了线程间数据同步，又要synchronized干什么呢？呵呵，它们之间有两点不同。首先，synchronized获得并释放监视器——如果两个线程使用了同一个对象锁，监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事实。但是，synchronized也同步内存：事实上，synchronized在&#8220;主&#8221;内存区域同步整个线程的内存。因此，执行geti3()方法做了如下几步：<br />
1. 线程请求获得监视this对象的对象锁（假设未被锁，否则线程等待直到锁释放）<br />
2. 线程内存的数据被消除，从&#8220;主&#8221;内存区域中读入（Java虚拟机能优化此步。。。[后面的不知道怎么表达,汗]）<br />
3. 代码块被执行<br />
4. 对于变量的任何改变现在可以安全地写到&#8220;主&#8221;内存区域中（不过geti3()方法不会改变变量值）<br />
5. 线程释放监视this对象的对象锁<br />
　　因此volatile只是在线程内存和&#8220;主&#8221;内存间同步某个变量的值，而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。</p>
<p>附英文原文：<br />
What does volatile do? </p>
<li class="hl-firstline"><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">i1</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">geti1</span><span style="color: olive">()</span><span style="color: gray"> </span><span style="color: olive">{</span><span style="color: green">return</span><span style="color: gray"> </span><span style="color: blue">i1</span><span style="color: gray">;</span><span style="color: olive">}</span>
<li><span style="color: green">volatile</span><span style="color: gray">&nbsp;</span><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">i2</span><span style="color: gray">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">geti2</span><span style="color: olive">()</span><span style="color: gray"> </span><span style="color: olive">{</span><span style="color: green">return</span><span style="color: gray"> </span><span style="color: blue">i2</span><span style="color: gray">;</span><span style="color: olive">}</span>
<li><span class="hl-types">int</span><span style="color: gray">&nbsp;</span><span style="color: blue">i3</span><span style="color: gray">; </span><span style="color: green">synchronized</span><span style="color: gray">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="hl-types">int</span><span style="color: gray"> </span><span style="color: blue">geti3</span><span style="color: olive">()</span><span style="color: gray"> </span><span style="color: olive">{</span><span style="color: green">return</span><span style="color: gray"> </span><span style="color: blue">i3</span><span style="color: gray">;</span><span style="color: olive">}</span></li>
<p>geti1() accesses the value currently stored in i1 in the current thread. Threads can have local copies of variables, and the data does not have to be the same as the data held in other threads. In particular, another thread may have updated i1 in it&#8217;s thread, but the value in the current thread could be different from that updated value. In fact <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> has the idea of a &#8220;main&#8221; memory, and this is the memory that holds the current &#8220;correct&#8221; value for variables. Threads can have their own copy of data for variables, and the thread copy can be different from the &#8220;main&#8221; memory. So in fact, it is possible for the &#8220;main&#8221; memory to have a value of 1 for i1, for thread1 to have a value of 2 for i1 and for thread2 to have a value of 3 for i1 if thread1 and thread2 have both updated i1 but those updated value has not yet been propagated to &#8220;main&#8221; memory or other threads. </p>
<p>On the other hand, geti2() effectively accesses the value of i2 from &#8220;main&#8221; memory. A volatile variable is not allowed to have a local copy of a variable that is different from the value currently held in &#8220;main&#8221; memory. Effectively, a variable declared volatile must have it&#8217;s data synchronized across all threads, so that whenever you access or update the variable in any thread, all other threads immediately see the same value. Of course, it is likely that volatile variables have a higher access and update overhead than &#8220;plain&#8221; variables, since the reason threads can have their own copy of data is for better efficiency. </p>
<p>Well if volatile already synchronizes data across threads, what is synchronized for? Well there are two differences. Firstly synchronized obtains and releases locks on monitors which can force only one thread at a time to execute a code block, if both threads use the same monitor (effectively the same object lock). That&#8217;s the fairly well known aspect to synchronized. But synchronized also synchronizes memory. In fact synchronized synchronizes the whole of thread memory with &#8220;main&#8221; memory. So executing geti3() does the following: </p>
<p>1. The thread acquires the lock on the monitor for object this (assuming the monitor is unlocked, otherwise the thread waits until the monitor is unlocked).<br />
2. The thread memory flushes all its variables, i.e. it has all of its variables effectively read from &#8220;main&#8221; memory (JVMs can use dirty sets to optimize this so that only &#8220;dirty&#8221; variables are flushed, but conceptually this is the same. See section 17.9 of the <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> language specification).<br />
3. The code block is executed (in this case setting the return value to the current value of i3, which may have just been reset from &#8220;main&#8221; memory).<br />
4. (Any changes to variables would normally now be written out to &#8220;main&#8221; memory, but for geti3() we have no changes.)<br />
5. The thread releases the lock on the monitor for object this. </p>
<p>So where volatile only synchronizes the value of one variable between thread memory and &#8220;main&#8221; memory, synchronized synchronizes the value of all variables between thread memory and &#8220;main&#8221; memory, and locks and releases a monitor to boot. Clearly synchronized is likely to have more overhead than volatile.</p><img src ="http://www.blogjava.net/rain1102/aggbug/195408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-24 10:15 <a href="http://www.blogjava.net/rain1102/archive/2008/04/24/195408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 下配置一个ip绑定多个域名</title><link>http://www.blogjava.net/rain1102/archive/2008/04/22/194908.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 22 Apr 2008 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/22/194908.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/194908.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/22/194908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/194908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/194908.html</trackback:ping><description><![CDATA[tomcat下配置 一ip对多域名的方法详细如下,按下面配置一定能成功,经过测试了.
<p>&lt;Host name="localhost" debug="0" appBase="D:\\Tomcat 5.0\\webapps"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlValidation="false" xmlNamespaceAware="false"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Alias&gt;localhost.com&lt;/Alias&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; directory="logs"&nbsp; prefix="localhost_log." suffix=".txt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timestamp="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Context path="" docBase="D:\\Tomcat 5.0\\webapps\\gg"&nbsp; reloadable="true" caseSensitive="false" debug="0"&gt;&lt;/Context&gt;<br />
&lt;/Host&gt;</p>
<p>&lt;Host name="one.localhost" debug="0" appBase="D:\\Tomcat 5.0\\webapps"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlValidation="false" xmlNamespaceAware="false"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Alias&gt;one.localhost.com&lt;/Alias&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; directory="logs"&nbsp; prefix="localhost_log." suffix=".txt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timestamp="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Context path="" docBase="D:\\Tomcat 5.0\\webapps\\kk\\a"&nbsp; reloadable="true" caseSensitive="false" debug="0"&gt;&lt;/Context&gt;<br />
&lt;/Host&gt;</p>
<p>&lt;Host name="two.localhost" debug="0" appBase="D:\\Tomcat 5.0\\webapps"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlValidation="false" xmlNamespaceAware="false"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Alias&gt;two.localhost.com&lt;/Alias&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Logger className="org.apache.catalina.logger.FileLogger"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; directory="logs"&nbsp; prefix="localhost_log." suffix=".txt"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timestamp="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Context path="" docBase="D:\\Tomcat 5.0\\webapps\\kk\\b"&nbsp; reloadable="true" caseSensitive="false" debug="0"&gt;&lt;/Context&gt;<br />
&lt;/Host&gt;</p>
<p>因无域名解析服务器,所以在hosts上配,来模拟dns解析.</p>
<p>10.1.1.241&nbsp; localhost&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向gg文件夹<br />
10.1.1.241&nbsp; localhost.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向gg文件夹<br />
10.1.1.241&nbsp; one.localhost&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向a文件夹<br />
10.1.1.241&nbsp; one.localhost.com&nbsp;&nbsp;&nbsp;指向a文件夹<br />
10.1.1.241&nbsp; two.localhost&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向b文件夹<br />
10.1.1.241&nbsp; two.localhost.com&nbsp;&nbsp; 指向b文件夹</p>
<p>经过多方面尝试,终于在tomcat下配置成功了.</p><img src ="http://www.blogjava.net/rain1102/aggbug/194908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-22 23:34 <a href="http://www.blogjava.net/rain1102/archive/2008/04/22/194908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何用JNI技术提高Java的性能详解</title><link>http://www.blogjava.net/rain1102/archive/2008/04/14/192771.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 14 Apr 2008 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/14/192771.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/192771.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/14/192771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/192771.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/192771.html</trackback:ping><description><![CDATA[<table style="margin-bottom: 20px" cellspacing="0" cellpadding="0" width="560" border="0">
    <tbody>
        <tr>
            <td align="center"><span class="b">发布时间：2006.03.01 08:22</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="b"> 来源：赛迪网Java开发者论坛</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="b">作者：灰色依旧</span></td>
        </tr>
    </tbody>
</table>
<table class="p11" cellspacing="0" cellpadding="0" width="560" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" align="left">
            <p class="a14c" style="text-indent: 2em"><span class="a14c" id="zoom">
            <p style="text-indent: 2em">
            <p class="a14">阻碍Java获得广泛应用的一个主要因素是Java程序的运行效率。Java是介于解释型和编译型之间的一种语言，同样的程序，如果用编译型语言C来实现，其运行速度一般要比Java快一倍以上。Java具有平台无关性，这使人们在开发企业级应用的时候总是把它作为主要候选方案之一，但是性能方面的因素又大大削弱了它的竞争力。为此，提高Java的性能就显得十分重要。
            <p class="a14"><strong>问题的提出</strong>
            <p class="a14">Sun公司及Java的支持者们为提高Java的运行速度已经做出了许多努力，其中大多数集中在程序设计的方法和模式选择方面。由于算法和设计模式的优化是通用的，对Java有效的优化算法和设计模式，对其他编译语言也基本同样适用，因此不能从根本上改变Java程序与编译型语言在执行效率方面的差异。
            <p class="a14">JIT(Just In Time，及时编译)技术是个比较好的思想。它的基本原理是：首先通过Java编译器把Java源代码编译成平台无关的二进制字节码。然后在Java程序真正执行之前，系统通过JIT编译器把Java的字节码编译为本地化机器码。最后，系统执行本地化机器码，节省了对字节码进行解释的时间。这样做的优点是大大提高了Java程序的性能，缩短了加载程序的时间；同时，由于编译的结果并不在程序运行间保存，因此也节约了存储空间。缺点是由于JIT编译器对所有的代码都想优化，因此同样也占用了很多时间。
            <p class="a14">动态优化技术是提高Java性能的另一个尝试。该技术试图通过把Java源程序直接编译成机器码，以充分利用Java动态编译和静态编译技术来提高Java的性能。该方法把输入的Java源码或字节码转换为经过高度优化的可执行代码和动态库 (Windows中的. dll文件或Unix中的. so文件)。该技术能大大提高程序的性能，但却破坏了Java的可移植性。
            <p class="a14"><strong>JNI技术</strong>
            <p class="a14">实际上，有一种通常为我们忽视的技术可以在很大程度上解决这个难题，那就是JNI(Java Native Interface, Java本地化方法)。主张采用纯Java的人们通常反对本地化代码的使用，他们认为在Java程序执行的过程中调用C/C++程序会影响程序的可移植性和安全性。还有一些人认为JNI只是对过去混合编程技术的简单扩展，其实际目的是为了充分利用大量原有的C程序库。
            <p class="a14">其实，我们不必拘泥于严格的平台独立性限制，因为采用JNI技术只是针对一些严重影响Java性能的代码段，该部分可能只占源程序的极少部分，所以几乎可以不考虑该部分代码在主流平台之间移植的工作量。同时，也不必过分担心类型匹配问题，我们完全可以控制代码不出现这种错误。此外，也不必担心安全控制问题，因为Java安全模型已扩展为允许非系统类加载和调用本地方法。根据Java规范，从JDK 1. 2开始，FindClass将设法找到与当前的本地方法关联的类加载器。如果平台相关代码属于一个系统类，则无需涉及任何类加载器; 否则，将调用适当的类加载器来加载和链接已命名的类。换句话说，如果在Java程序中直接调用C/C++语言产生的机器码，该部分代码的安全性就由Java虚拟机控制。
            <p class="a14"><strong>JNI实现步骤</strong>
            <p class="a14">编写JNI代码的大致流程如下图所示：
            <p align="center"><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" src="http://java.ccidnet.com/col/attachment/2006/2/596881.jpg"  alt="" />
            <p class="a14">JNI实现流程图
            <p class="a14">1. 首先编写需要JNI功能的Java类源文件。其中，需要JNI实现的方法应当用native关键字声明。在该类中，用System. loadLibrary()方法加载需要的动态链接库。关键代码如下：
            <p class="a14">//Compute.java
            <p class="a14">&#8230;&#8230;
            <p class="a14">public class Compute {
            <p class="a14">public native double comp (double [] params);
            <p class="a14">&#8230;&#8230;
            <p class="a14">static {
            <p class="a14">// 调用动态链接库
            <p class="a14">System. loadLibrary(&#8220;mathlib&#8221;);
            <p class="a14">}
            <p class="a14">&#8230;&#8230;
            <p class="a14">}
            <p class="a14">2. 将该类源文件用Java类编译器编译成二进制字节码文件。由于采用了native关键字声明，编译器会忽视没有代码体的JNI方法部分。
            <p class="a14">3. 利用javah -jni *.class 生成相关JNI方法的头文件。我们可以手工生成该文件，但是由于Java虚拟机是根据一定的命名规范完成对JNI方法的调用，所以手工编写头文件需要特别小心。
            <p class="a14">上述文件产生的头文件部分代码如下：
            <p class="a14">//Compute. h
            <p class="a14">&#8230;&#8230;
            <p class="a14">extern &#8220;C&#8221; {
            <p class="a14">JNIEXPORT jdouble JNICALL Java_Compute_comp (JNIEnv *, jobject, jdoubleArray);
            <p class="a14">}
            <p class="a14">&#8230;&#8230;
            <p class="a14">可以看出，JNI函数名称分为三部分：首先是Java关键字，供Java虚拟机识别；然后是调用者类名称（全限定的类名，其中用下划线代替名称分隔符）；最后是对应的方法名称，各段名称之间用下划线分割。
            <p class="a14">JNI函数的参数也由三部分组成: 首先是JNIEnv *，是一个指向JNI运行环境的指针；第二个参数随本地方法是静态还是非静态而有所不同——非静态本地方法的第二个参数是对对象的引用，而静态本地方法的第二个参数是对其 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 类的引用; 其余的参数对应通常 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 方法的参数，参数类型需要根据一定规则进行映射。
            <p class="a14">4. 根据头文件编写相应方法的实现代码。由于篇幅所限，具体的实现部分在此不再赘述。在编码过程中，需要注意变量的长度问题，例如Java的整型变量长度为32位，而C语言为16位，所以要仔细核对变量类型映射表，防止在传值过程中出现问题。
            <p class="a14">5. 利用C/C++编译器将JNI实现代码编译成动态链接库。调用者类中需要显式调用该链接库。
            <p class="a14">在Win32环境下，可以利用Visual C ++或其他能产生DLL文件的C/C++编译器将实现代码编译成动态链接库。笔者利用的是Microsoft.NET Framework的编译器。编译指令如下，其中%Java_HOME%是笔者的jdk安装目录变量：
            <p class="a14">cl -I%Java_HOME%\include
            <p class="a14">-I%Java_HOME%\include\win32
            <p class="a14">-LD jnicomp. c -Femathlib. dll
            <p class="a14">在Sun Soloaris下，相应指令为：
            <p class="a14">cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris jnicomp. c \
            <p class="a14">-o mathlib. so
            <p class="a14">注意，编译的时候需要用I指令包含必要的库文件路径。
            <p class="a14">经过上述处理，就基本上完成了一个包含本地化方法的Java类的开发。
            <p class="a14"><strong>JNI技术的应用</strong>
            <p class="a14">一些主要的Java技术，如JDBC和RMI，大部分都采用JNI方式实现。但是，采用JNI确实会影响程序的平台无关性，所以只能在特别需要的地方才能使用。通常来说，如果遇到下面的情况，我们可以考虑JNI:
            <p class="a14">● 需要直接操作物理设备，而没有相关的驱动程序，这时候我们可能需要用C甚至汇编语言来编写该设备的驱动，然后通过JNI调用；
            <p class="a14">● 涉及大量数学运算的部分，用Java会带来些效率上的损失；
            <p class="a14">● 用Java会产生系统难以支付的开销，如需要大量网络链接的场合；
            <p class="a14">● 存在大量可重用的C/C++代码，通过JNI可以减少开发工作量，避免重复开发。
            <p class="a14">另外，在利用JNI技术的时候要注意以下几点：
            <p class="a14">● 由于Java安全机制的限制，不要试图通过Jar文件的方式发布包含本地化方法的Applet到客户端；
            <p class="a14">● 注意内存管理问题，虽然在本地方法返回 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 后将自动释放局部引用，但过多的局部引用将使虚拟机在执行本地方法时耗尽内存；
            <p class="a14">● JNI技术不仅可以让Java程序调用C/C++代码，也可以让C/C++代码调用Java代码。 </p>
            <p class="a14">(T117)</p>
            </span></td>
        </tr>
    </tbody>
</table><img src ="http://www.blogjava.net/rain1102/aggbug/192771.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-14 14:32 <a href="http://www.blogjava.net/rain1102/archive/2008/04/14/192771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源ROME处理RSS</title><link>http://www.blogjava.net/rain1102/archive/2008/04/11/192227.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 11 Apr 2008 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/11/192227.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/192227.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/11/192227.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/192227.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/192227.html</trackback:ping><description><![CDATA[ROME是一组Atom/RSS工具类它使得用Java来操作大部份syndication格式变得更加容易: <br />
<li>RSS 0.90
<li>RSS 0.91 Netscape
<li>RSS 0.91 Userland
<li>RSS 0.92
<li>RSS 0.93
<li>RSS 0.94
<li>RSS 1.0
<li>RSS 2.0
<li>Atom 0.3
<li>Atom 1.0 <br />
ROME不仅包括各种syndication feeds的解析器与生成器,而且还包括能够把一种格式转换成另外一种格式的转换器。 </li>
<p><br />
Tutorials<br />
</p>
<p>The following tutorials show how to use the ROME API. They focus on the higher abstraction layer of classes offered by ROME, what we call the Synd* classes. By using the Synd* classes developers don't have to deal with the specifics of any syndication feed. They work with normalized feeds, the Synd* feeds. This makes it much easier to write applications that have to deal with all the variety of syndication feed types in use today.
<p>
<ol>
    <li><a class="twikiLink" href="http://wiki.java.net/bin/view/Javawsxml/Rome05TutorialFeedReader?TWIKISID=3a1cf01647196714b8f8a04c5903bc8d">Using ROME to read a syndication feed</a>
    <li><a class="twikiLink" href="http://wiki.java.net/bin/view/Javawsxml/Rome05TutorialFeedConverter?TWIKISID=3a1cf01647196714b8f8a04c5903bc8d">Using ROME to convert a syndication feed from one type to another</a>
    <li><a class="twikiLink" href="http://wiki.java.net/bin/view/Javawsxml/Rome05TutorialFeedAggregator?TWIKISID=3a1cf01647196714b8f8a04c5903bc8d">Using ROME to aggregate many syndication feeds into a single one</a>
    <li><a class="twikiLink" href="http://wiki.java.net/bin/view/Javawsxml/Rome05TutorialFeedWriter?TWIKISID=3a1cf01647196714b8f8a04c5903bc8d">Using ROME to create and write a feed</a>
    <li><a class="twikiLink" href="http://wiki.java.net/bin/view/Javawsxml/Rome05TutorialSampleModule?TWIKISID=3a1cf01647196714b8f8a04c5903bc8d">Defining a Custom Module bean, parser and generator</a>
    <li><a class="twikiLink" href="http://wiki.java.net/bin/view/Javawsxml/Rome05TutorialFeedServlet?TWIKISID=3a1cf01647196714b8f8a04c5903bc8d">Using ROME within a Servlet to create and return a feed</a> </li>
</ol>
<p>For instructions on how to build and run the samples used in the tutorials <a class="twikiLink" href="http://wiki.java.net/bin/view/Javawsxml/Rome05SamplesHowTo?TWIKISID=3a1cf01647196714b8f8a04c5903bc8d">click here</a>. </p><img src ="http://www.blogjava.net/rain1102/aggbug/192227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-11 17:01 <a href="http://www.blogjava.net/rain1102/archive/2008/04/11/192227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十个习惯让你精通新的开发技术</title><link>http://www.blogjava.net/rain1102/archive/2008/04/10/191803.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 10 Apr 2008 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/10/191803.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/191803.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/10/191803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/191803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/191803.html</trackback:ping><description><![CDATA[<p><strong>【IT168 管理文档】</strong></p>
<p>&nbsp;&nbsp;&nbsp; Ben Watson，知名开发者。任职于GeoEye，是其所属开发团队的领导者。本文发表于他自己的博客，阐述了十种学习新技术的方法。</p>
<p>&nbsp;&nbsp;&nbsp; 这篇文章，是从我的《高效开发人员的五个特征》一文中抽出的一个观点。从我自身的事业和习惯中，我考虑了很多方式怎么样才能有效地学习。</p>
<p>&nbsp;&nbsp;&nbsp; 1. 要看书。在成千上万的编程图书中，可能很大一部分根本毫无用处。但是仍然有很多图书对你的(编程)能力有很大的提升。我一直坚持，相比在网络上查找很多有用信息，在同类图书中查找要来得更容易更快捷。阅读技术图书可心更好地抓住核心内容。对于理论，架构和设计等方面来说，图书也一样很有帮助。只不过要找到高质量的、权威的信息，就不如网络上可供查找的范围广。</p>
<p>&nbsp;&nbsp;&nbsp; 2. 读代码。这也是我很喜欢的一种方式。如果我并没有几年的专业编程工作经验，在学习之初我并不会去读很多复杂的代码。如果我要是早些开始学习，我将是一个比现在更好的程序员。但是，开始时我会从一些开源项目里，去学习那些源代码(当然，这些代码不能与我的工作有关，也不是我自己写的)。要从自己会使用到的，或者自己感兴趣的程序开始这项工作。我是从 Paint.net 这个网站里开始学习的，而且已经积累了很多关于 .NET 的编程技术。</p>
<p>&nbsp;&nbsp;&nbsp; 读别人的代码可以为你提供更多不同的工作思路，这比你完全凭自己思考得到的工作方式要多。</p>
<p>&nbsp;&nbsp;&nbsp; 3. 写代码。谨记，要写大量的代码。从根本上来讲，最好的学习方法就是实践。如果不写代码，你根本不能把(某种语言中)内在的东西学习透彻。学习之初，可以从一些技术指南和图书中照搬一些尽量简单的程序。当然，这种照搬是要自己完全手工输入，而不是复制和粘贴，这两种之间的效果差别是很大的。这种方法的主旨就在于，使知识内在化，并思考其用法，而不是盲目照抄。学习过程中，要时常查找新的 API 调用方法，这其实是简单的事情。</p>
<p>&nbsp;&nbsp;&nbsp; 最重要的是，要写一个你自己的程序，不管它是一个简单的游戏，或者是一个参与开源项目的程序，还是一个公为你自己使用的简单插件。用不同的方式来写程序，尽量尝试使用新的技术，新的技巧，新的设计方式。一定要让现在的项目比以往的项目更好。想要成一个优秀的开发者，这一点是核心。</p>
<p>&nbsp;&nbsp;&nbsp; 4. 与其他开发者交流。像 Apple，微软，Google 等大公司一样的新闻描述的一样，(与其他开发者交流)可以让你解决一些复杂的问题。虽然这并不能让你感觉到自己已经成一个团队或是社区的成员，但是这种方法可以让你接触到更多不同的想法。</p>
<p>&nbsp;&nbsp;&nbsp; 不同类型的项目要求不同的设计方法，代码技术，开发流程和设计思想。如果你工作在一个小团队里，你不必与太多的人接触，只要在用户群会议中找到一些人(来讨论)即可。如果这样还不行的话，参与到在线论坛中与其他人讨论(这时你需要更努力地寻找高质量的讨论内容)。</p>
<p>&nbsp;&nbsp;&nbsp; 6. 教会别人。相对于仅仅读代码之类的工作，教其他人学习可以让你更深入地学习某个技术，这种方法有着非凡的效果。教会别人某个技术，同样也会让你更专注于这种技术，并且可以比别人更深层次地理解它。同样你也会面对一些问题。</p>
<p>&nbsp;&nbsp;&nbsp; &#8220;如果你不能向一个六岁的儿童解析清楚一个概念，那么其实是你并没有完全理解它。&#8221;Albert Einstein说。</p>
<p>&nbsp;&nbsp;&nbsp; 教学场景可以是无穷无尽的：与工作搭档一对一交流，休息碰面，非正式周会，学习茶会，教室，讨论发表会，等等。每周在相同理念开发者之间举办一次30分钟的非正式会议怎么样？每周，让几个人来就他们想要更深入了解话题，向大家传授这些技术知识，并且展开讨论。如果你知道你将要向团队成员们传授正学学习的知识，你是不是更想要了解这项技术的每个细节呢？</p>
<p>&nbsp;&nbsp;&nbsp; 6. 收听网络电台。如果你有空闲的时间，可以订阅网络电台节目。我现在最喜欢的编程节目就是 .Net Rocks。这个节目还会做一些视频节目，叫做 dnrTV 。这样会让你即时捕捉到最新最好的技术。一个人是不能学习到所有知识的，而网络电台刚是一个学习了解广泛知识的途径。</p>
<p>&nbsp;&nbsp;&nbsp; 7. 阅读博客。博客远远比阅读者要多，但是其中有一些却是极其优秀的。我这里不并不是要推荐博客，因为网络上已经有了足够多的博客。这是与真正在开发你所喜欢和使用的软件的开者联系的好方法。</p>
<p>&nbsp;&nbsp;&nbsp; 8. 学习新的语言。即使你已经在 C(++,#) / <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> 等语言上有很好的造诣，仍然有很多其他可以解决问题的编程语言。学习新的语言，是对你已有思维方式的挑战。这不仅仅是另一种语言，更是对思维的重新架构。的确，所有的语言最后都会被编译成汇编程序，但是这并不意味着高级语言毫无价值。</p>
<p>&nbsp;&nbsp;&nbsp; 9. 学习不正确的方式。除了要学习应该怎么做，还要学习不应该怎么做。经常阅读 Dailywtf.com ，学习你并不知道的经验与教训。学习适当的面向对象设计方式，代码写作方式，和必须要写的代码等，是很好的方式，但是如果不细心的话也容易养成不良习惯。学习认识不正确的思路是负责项目开发至关重要的一环。</p>
<p>&nbsp;&nbsp;&nbsp; 维基百科对很多觉的不正确方式有十分透彻的分类。</p>
<p>&nbsp;&nbsp;&nbsp; 10. 要谦虚。</p>
<p>&nbsp;&nbsp;&nbsp; 学习，意味着：</p>
<ul>
    <li>用更好的知识代替不完美的知识
    <li>增长你所不知道的知识 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 只有承认自己有所不足，才能有学习的动力。归根到底，就是谦虚，不对吗？如果你开始认为你已经掌握了所有需要的知识，那么你就危险了。真正的学习是如饥似渴地追逐知识并使其内在化，这需要很大的努力。我们都知道这一点，但是要必须时常不断地提醒自己。</p><img src ="http://www.blogjava.net/rain1102/aggbug/191803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-10 11:14 <a href="http://www.blogjava.net/rain1102/archive/2008/04/10/191803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jMaki</title><link>http://www.blogjava.net/rain1102/archive/2008/04/08/191499.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 08 Apr 2008 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/08/191499.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/191499.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/08/191499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/191499.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/191499.html</trackback:ping><description><![CDATA[jMaki是SUN支持的一个AJAX框架。这个项目的是让Java开发人员在其基于Java的应用程序中(不管是JSP标签库还是JSF组件)都能使用AJAX技术。jMaki使用了Java与JavaScript中最优秀的部分以此来提供一些Rich AJAX style widgets。jMaki当前提供的bootstrap widget是来自<a href="http://dojotoolkit.org/">Dojo</a>,<a href="http://script.aculo.us/">Scriptaculus</a>,<a href="http://developer.yahoo.com/yui/">Yahoo UI Widgets</a>,<a href="http://labs.adobe.com/technologies/spry/">Spry</a>,<a href="http://www.dhtmlgoodies.com/">DHTML Goodies</a>,和<a href="http://www.google.com/">Google</a>等组件库。jMaki提供为这些widget组件库提供了一个公共接口以便让你可以在同一页面中一起使用这些组件库。如果你有兴趣利用jMaki项目来快速开发Web应用程序，可以使用NetBeans 5.5的jMaki插件。这个插件可以直接把jMaki组件拖放到JSP页面中。如果不熟悉该插件可以通过其网站提供一段<a href="https://ajax.dev.java.net/screencast/jMakiDemo.html">视频</a>来学习。<img src ="http://www.blogjava.net/rain1102/aggbug/191499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-08 15:10 <a href="http://www.blogjava.net/rain1102/archive/2008/04/08/191499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解密Google成功七大密码</title><link>http://www.blogjava.net/rain1102/archive/2008/04/06/191114.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sun, 06 Apr 2008 13:12:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/06/191114.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/191114.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/06/191114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/191114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/191114.html</trackback:ping><description><![CDATA[一、消费者的方便性
<p>　　茫茫网海，获取有用的相关信息犹如大海捞针，LarryPage和SergeyBrin设计了Google搜索引擎。由于Google致力于提供全球最优秀的搜索引擎服务，通过其强大的、迅速和方便的搜索引擎，Google每天为全球上百万的用户提供准确详实、符合他们需要的信息。</p>
<p>　　二、专注和执着 </p>
<p>　　Google不是第一家做互联网搜索技术的公司，之前的搜索引擎公司，包括AltaVista、Lycos、Excite、Infoseek、Inktomi在内，大都成功上市、融资，迅速膨胀，兼并或被兼并，很多公司后来转型做起了门户网站。这些曾经风光一时的互联网公司，今天大部分仍在亏损的深渊中挣扎。Google没有过早上市，集中精力于搜索业务。正是这样的专注和执着，使Google能够把搜索引擎做得如此有用。 </p>
<p>　　三、先进的技术 </p>
<p>　　关注于技术也给Google带来了幸运。越来越多的网站上遍布散乱的广告，网民已不堪其扰，而Google的主页始终保持着清新的风格，一下子就给人留下了好印象。Google以其强大的功能赢得了越来越多的用户，它支持包括简体中文和繁体中文在内的多达132种语言的搜索。 </p>
<p>　　四、当Google成为文化 </p>
<p>　　Google的负责人认为，决定文档在搜索结果排列位置的因素是一个文档在其它网页中出现的频率和这些网页的可信度，网页在受众中的知名度和质量是决定性因素。事实证明，这一判断是正确的，Google的使用率越来越高，每天的搜索量由四年前的100万次增至目前的1.5亿次。 </p>
<p>　　五、关注消费者的利益 </p>
<p>　　有用户投诉，总是收到Google发送的弹出式广告，Google于是发表了一份公告，称弹出式广告是&#8220;令人讨厌&#8221;的，如果用户收到了弹出式广告，它们并不是由Google发送的，而是由第三方的应用程序引起的。Google公司建议，如果用户受到弹出式广告的侵扰，可以安装广告探查软件，阻截弹出式广告。这表明，尽管Google需要盈利，但绝没有一味地钻到钱眼中而忽略用户的利益，能够具有这样的责任感，我们相信其基础是很牢固的。 </p>
<p>　　六、不一样的收入模式 </p>
<p>　　打开Google的主页，你根本看不到任何广告，但事实上广告却是Google创收的主要源泉。其奥秘在于Google独特的广告经营方式，Google的广告形式不采用横幅广告，也没有Flash动画广告，所有的广告都是文字格式的，同时这种文字信息的广告被列入搜索信息条中。这种机动灵活的广告方式不仅在技术上处于领先，而且深受商家欢迎，用户也不会有太大的反感，同时也为Google带来滚滚财源。 </p>
<p>　　七、简单就是美 </p>
<p>　　当其他的竞争者想方设法地把首页复杂化，股价查询、天气预报等等过量的信息被填塞在页面上时，极端的实用主义却统治着Google的网站风格：其首页上只有一个搜索框，别无他物。调查发现，人们如果在12秒钟内找不到自己所需的内容的话就会超出忍耐限度。这也许说明了为何Google每月会有至少5000万的忠实用户，且用户满意率竟高达97%。</p><img src ="http://www.blogjava.net/rain1102/aggbug/191114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-06 21:12 <a href="http://www.blogjava.net/rain1102/archive/2008/04/06/191114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AICC和SCORM介绍</title><link>http://www.blogjava.net/rain1102/archive/2008/04/01/190178.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 01 Apr 2008 10:52:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/01/190178.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/190178.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/01/190178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/190178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/190178.html</trackback:ping><description><![CDATA[AICC简介： <br />
AICC（The Aviation Industry CBT Committee）即航空工业CBT（计算机辅助培训）委员会（AICC），它是一个国际性的培训技术专业性组织。AICC为航空业的发展、传送和CBT评价及相关的培训技术制定指导方针。AICC最重要的贡献就是定出了许多共通性的技术规范—AGRs(AICC Guidelines and Recommendations)系列规范。虽然AICC主要侧重于航空工业，但它多年来制定的一些标准以及在教育方面的经验都可供其他领域借鉴。 <br />
 <br />
AICC标准由于需要跨过电子远程教育功能性的三个关键域而显得尤为重要：内容编辑、内容管理及传输和电子远程教育的学员评估。可以说AICC已成为未来教育的一个范本。因为飞机的寿命有二十年，需要许多维修人员，为提高训练成效，航空业大都用计算机软件来训练维修工程师，但因计算机技术的变换快速，为维持训练软件的可用性，从使用者角度提出CMI规范，希望飞航训练单位依此规范所采用的软件，能够避免因计算机软硬件环境的改变而失效。这些规范主要为维持早期开发的训练软件能够持续使用并适用于网络环境而制定。这是最新出现的一种教育模式，对于航空业具有重大影响，但航空业是一个特殊的行业，我们要合理采用其教育与培训的理念过行移植，从而在其他行业产生价值，但是这个过程需要较长时间的摸索与较大的投入。 <br />
 <br />
目前AICC的规范覆盖了九个主要领域，从学习物件到学习管理系统，主要围绕CMI（Computer Managed Instruction）系统的互操作性提供了整体的规划，目前已提交到IEEE/LTSC作为规范草案，并开始影响到了各种行业。 <br />
 <br />
SCORM简介： <br />
SCORM（The Sharable Content Object Reference Model）即可共享内容对象参考模型，是美国国防部于1997年启动的一个称为&#8220;高级分布式学习&#8221;（ ADL: Advanced Distributed Learning）研究项目制订的一份规范。它定义了一个网络化学习的&#8220;内容聚合模型&#8221;（Content Aggregation Model）和学习对象的&#8220;运行环境&#8221;（Run-time Environment）。简单说，它就是为了满足对网络化学习内容的高水平要求而设计的。其目的是为了解决: 使课程能够从一个平台迁移到另一个平台，创建可供不同课程共享的可重用构件，以及快速又准确地寻找课程素材。 <br />
 <br />
AICC和SCORM应用： <br />
在远程教育行业，AICC和SCORM是已经被广泛采用的两个标准。 <br />
 <br />
实现标准化接口，实现跟踪、管理等功能是标准的第一个层次，AICC与SCORM都可以实现，AICC是由CBT标准发展而来，对课件开发而言比较符合&#8220;脚本&#8221;的思路，SCORM更多考虑网络化，提倡LO（学习对象）的可重用性，虽然AU与SCO形式上是一致的，但体现的理念却完全不同，AICC中的AU是死的，SCORM的SCO确是活的，当前我们确实看不到AICC的发展方向（可能也到了尽头），SCORM却对未来描述的十分清楚，而且越来越多的平台、课程开发商加入SCORM的行列。 <br />
 <br />
其实AICC不是被网络教育淘汰了，而是被网络的发展淘汰了，目前很多课件是基于web的，我们会发现，AICC的数据模型和http绑定实现方法91年后好像就没有新版本了，因为那时美国航天部为了自己的培训而做的，那是采用的课件大多是本地程序，只不过是在学习后有本地程序将学习成果发给CMI(在标准领域LMS与CMI没有区别)。随着网络的WEB发展，AICC的东西已经不好用了，当然是通讯方式HTTP绑定不好用了，因为web课件不依赖服务器时无法独立发http请求，除非靠activex or <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> applet等，这样不方便。因此SCORM的API绑定更适用WEB。因此要注意到，AICC与SCORM的数据模型很像，只是SCORM去掉了web不用的数据字段。IEEE原来引用AICC的东西，现在改用SCORM的了，这大概就是将来的发展趋势了。 <br />
 <br />
总结： <br />
对于AICC----AICC课件因为已经经营管理了10多年，因此市场上大量的采购课件都是AICC标准的，尽管SCORM课件的推进速度很快，但是毕竟只有很短的时间，让AICC退出历史舞台，还需要很长的时间，因为大家都知道，skillsoft、netg、smartfouce的课件都是AICC标准的， AICC的课件制作工具目前仍在使用，很多的课件制作公司并没有放弃，因为不想去改变它。 <br />
对于SCORM----相信SCORM将会成为在线教育的未来标准。它显著提高了内容开发和LMS领域的竞争性，提高了学习质量、降低了开发成本、在线教育课程素材的市场响应时间。 只须要有一个依从标准的学习平台，便可从众多的内容服务供货商选取现成的教材，辅以根据公司所需而自制的教材，这样便能合乎经济成本效益，以更低的成本而享有更高的灵活度。 <br />
 <br />
对课程设置的影响： <br />
考虑到远程教育平台的支持，AICC对平台的要求相对简单一些，对课件制作的难度较大，SCORM正好相反。目前同时支持AICC\SCORM的平台很少，一般国内平台都是支持AICC，而且支持的程度、标准化都是根据自己的理解进行的，在某些地方并不是很完善，所以在实际制作过程中有许多意想不到的问题，我们作出的产品如果同时要支持两种标准，这对我们来说是一种挑战。 <br />
 <br />
同时，AICC/SCORM并不是简单的数据模型、协议，事实上贯穿课件开发整个过程，从设计开始就需要有AU\SCO等方面的考虑，而这些往往对制作人员的要求很高，工作量也会放大。<img src ="http://www.blogjava.net/rain1102/aggbug/190178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-01 18:52 <a href="http://www.blogjava.net/rain1102/archive/2008/04/01/190178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CsvJdbc - a JDBC driver for CSV files</title><link>http://www.blogjava.net/rain1102/archive/2008/03/19/187236.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 19 Mar 2008 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/03/19/187236.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/187236.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/03/19/187236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/187236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/187236.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: Arial">About<span style="font-size: 12pt; font-family: 宋体">&nbsp; </p>
<hr align="center" width="100%" color="gray" noShade size="1" />
<p style="text-align: left" align="left"></span></span></strong></p>
<p><span style="font-size: 10pt; font-family: Arial">CsvJdbc is a simple read-only JDBC driver that uses Comma Separated Value (CSV) files as database tables. It is ideal for writing data importing programs</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: Arial">How is it used<br />
<span style="font-size: 12pt; font-family: 宋体"></p>
<hr align="center" width="100%" color="gray" noShade size="1" />
<p style="text-align: left" align="left"></span></span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Arial">The CsvJDBC driver is used just like any other JDBC driver. This example code shows how the driver is used. </span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.sql.*;</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">public class DemoDriver</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">{</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;public static void main(String[] args)</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;{</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; try</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // load the driver into memory</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("org.relique.jdbc.csv.CsvDriver");</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create a connection. The first command line parameter is assumed to</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;be the directory in which the .csv files are held</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = DriverManager.getConnection("jdbc:relique:csv:" + args[0] );</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create a Statement object to execute the query with</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = conn.createStatement();</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Select the ID and NAME columns from sample.csv</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet results = stmt.executeQuery("SELECT ID,NAME FROM sample");</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // dump out the results</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (results.next())</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ID= " + results.getString("ID") + "&nbsp;&nbsp; NAME= " + results.getString("NAME"));</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // clean up</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results.close();</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stmt.close();</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; catch(Exception e)</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; {</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Oops-&gt; " + e);</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;}</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 12pt; font-family: Arial">Advanced Options<span style="font-size: 12pt; font-family: 宋体">&nbsp; </p>
<hr align="center" width="100%" color="gray" noShade size="1" />
<p style="text-align: left" align="left"></span></span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Arial">The driver also supports a number of parameters that change the default behaviour of the driver.</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Arial">These properties are:</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; font-family: Arial">separator</span></strong></p>
<p style="margin-left: 36pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: Arial">Used to specify a different column separator (Default is ','). </span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; font-family: Arial">suppressHeaders</span></strong></p>
<p style="margin-left: 36pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: Arial">Used to specify if the first line contains column header information (Default is </span><span style="font-size: 12pt; font-family: 宋体">false</span><span style="font-size: 10pt; font-family: Arial">; column headers are on first line). </span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; font-family: Arial">fileExtension</span></strong></p>
<p style="margin-left: 36pt; text-align: left" align="left"><span style="font-size: 10pt; font-family: Arial">Used to specify a different file extension (Default is ".csv") </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: Arial">This following example code shows how these properties are used. </span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;...</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;Properties props = new <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Properties();</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;props.put("separator","|");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // separator is a bar</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;props.put("suppressHeaders","true");&nbsp;&nbsp;&nbsp;&nbsp; // first line contains data</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;props.put("fileExtension",".txt");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // file extension is .txt</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6p