﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-记载</title><link>http://www.blogjava.net/qianbiguabi/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 21:12:50 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 21:12:50 GMT</pubDate><ttl>60</ttl><item><title>《转》43个热门Flex和ActionScript 3.0 APIs,技巧和工具</title><link>http://www.blogjava.net/qianbiguabi/archive/2009/01/17/251707.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Sat, 17 Jan 2009 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2009/01/17/251707.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/251707.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2009/01/17/251707.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/251707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/251707.html</trackback:ping><description><![CDATA[<div id="news_content">
<p><strong>Sean Moore Bio 说道</strong>：秋天又一次来临了，是时候回顾一下2008年最热门的Flex和ActionScript 3.0 APIs,技巧和工具了，下面是我的总结，收集的比较全，Flex开发必备，欢迎补充。<img alt="" src="http://www.javaeye.com/images/smiles/icon_biggrin.gif" _counted="undefined" /></p>
<p>&nbsp;</p>
<p><strong>介绍 Flex SDK 3.1 和 Flex Builder 3.0.1</strong></p>
<p>Flex SDK 3.1 是一个Flex SDK里程碑式的版本，推荐开发者使用。<br />
<a href="http://www.adobe.com/devnet/flex/articles/sdk3_fb301.html" target="_blank">http://www.adobe.com/devnet/flex/articles/sdk3_fb301.html</a><br />
<strong></strong></p>
<p><strong>Cairngorm 迁移进入Adobe开源网站(<em><em>Cairngorm</em>是Adobe 实验室中的Flex MVC框架</em></strong><strong>)</strong><br />
<a href="http://weblogs.macromedia.com/amcleod/archives/2008/08/cairngorm_moved.html" target="_blank">http://weblogs.macromedia.com/amcleod/archives/2008/08/cairngorm_moved.html</a></p>
<p><strong><br />
Flex 架构基础 - 模块和数据转换对象</strong><br />
展示一个简单的方式使用模块和数据转换对象来设置简单Flex应用<br />
<a href="http://nwebb.co.uk/blog/?p=228" target="_blank">http://nwebb.co.uk/blog/?p=228</a></p>
<p><strong><br />
教程： ActionScript 3 拖动函数</strong><br />
这个教程介绍ActionScript 3在布景中的拖动函数。<br />
<a href="http://flashmymind.com/Tutorials/Actionscript/Advanced/actionscript-dragging.php" target="_blank">http://flashmymind.com/Tutorials/Actionscript/Advanced/actionscript-dragging.php</a></p>
<p><strong><br />
Flex 分页组件</strong><br />
一个小的Flex分页组件<br />
<a href="http://www.darklump.co.uk/blog/?p=112" target="_blank">http://www.darklump.co.uk/blog/?p=112</a></p>
<p><strong><br />
ModuleManager 和 IModuleInfo - 自动加载Flex模块</strong><br />
<a href="http://lowpitch.com/blog/2008/08/17/modulemanager-and-imoduleinfo-loading-flex-modules-dynamically/" target="_blank">http://lowpitch.com/blog/2008/08/17/modulemanager-and-imoduleinfo-loading-flex-modules-dynamically/</a></p>
<p><strong><br />
Degrafa初学教程 </strong><br />
Degrafa是一个Flex扩展，在FLEX中增加了对矢量数据的动态处理，包括动态添加，删除和修改，并支持SVG的路径格式数据。Mike Huntington一篇优秀文章。<br />
<a href="http://www.mikehuntington.com/?p=22" target="_blank">http://www.mikehuntington.com/?p=22</a></p>
<p><strong><br />
同时使用Degrafa</strong><strong>高级CSS技巧</strong><br />
依然是Mike Huntington的文章。质量很高，推荐。<br />
<a href="http://www.mikehuntington.com/?p=31" target="_blank">http://www.mikehuntington.com/?p=31</a></p>
<p><strong><br />
Alcon 3</strong><br />
为Adobe AIR重写过，一个简单好用的调试/日志工具。很酷。<br />
<a href="http://blog.hexagonstar.com/alcon/" target="_blank">http://blog.hexagonstar.com/alcon/</a></p>
<p><strong><br />
在Flex Builder中删除</strong> <strong>css type selector 警告</strong><br />
在Flex Builder中删除 css type selector 警告的快速技巧<br />
<a href="http://www.nutrixinteractive.com/blog/?p=135" target="_blank">http://www.nutrixinteractive.com/blog/?p=135</a></p>
<p><strong><br />
</strong><strong>在倾斜背景中的VBox, HBox Flex箱式模型</strong><br />
<a href="http://www.igorcosta.org/?p=160" target="_blank">http://www.igorcosta.org/?p=160</a></p>
<p><strong><br />
Flex 设计/开发工作流程视频教程</strong><br />
<a href="http://www.ashorten.com/2008/08/11/flex-designerdeveloper-workflow-video-tutorials/" target="_blank">http://www.ashorten.com/2008/08/11/flex-designerdeveloper-workflow-video-tutorials/</a></p>
<p><strong><br />
6个使用 ActionScript 3.0 的理由 - 作者Lee Brimelow</strong><br />
<a href="http://www.adobe.com/devnet/actionscript/articles/six_reasons_as3.html" target="_blank">http://www.adobe.com/devnet/actionscript/articles/six_reasons_as3.html</a></p>
<p><strong><br />
定制 flex 皮肤</strong><br />
<a href="http://the.fontvir.us/b10g/?id=111" target="_blank">http://the.fontvir.us/b10g/?id=111</a></p>
<p><strong><br />
编写Flex组件, part 1</strong><a href="http://labs.flexperiments.nl/writing-components-in-flex-part-1/" target="_blank"><br />
http://labs.flexperiments.nl/writing-components-in-flex-part-1/</a></p>
<p><strong><br />
</strong><strong>编写Flex组件</strong><strong>, part 2</strong><br />
<a href="http://labs.flexperiments.nl/writing-components-in-flex-part-2/" target="_blank">http://labs.flexperiments.nl/writing-components-in-flex-part-2/</a></p>
<p><strong><br />
Actionscript 3 API 收集</strong><br />
<a href="http://flashenabledblog.com/2008/08/26/as3-actionscript-3-classes/" target="_blank">http://flashenabledblog.com/2008/08/26/as3-actionscript-3-classes/</a></p>
<p><strong><br />
为展示对象创建 bitmap 数据对象</strong><br />
<a href="http://www.flexer.info/2008/08/20/how-to-make-a-bitmapdata-from-a-displayobjectuicomponent/" target="_blank">http://www.flexer.info/2008/08/20/how-to-make-a-bitmapdata-from-a-displayobjectuicomponent/</a></p>
<p><strong><br />
FCG 1.0 (Flex 代码生成器)</strong><br />
开源工具<br />
<a href="http://www.dehats.com/drupal/?q=node/45" target="_blank">http://www.dehats.com/drupal/?q=node/45</a></p>
<p><strong><br />
新的ActionScript 3 Singleton 函数</strong><br />
<a href="http://www.daniellove.net/blog/?p=81" target="_blank">http://www.daniellove.net/blog/?p=81</a></p>
<p><strong><br />
CSKDebugger</strong><br />
Mac AIR 调试器 <br />
<a href="http://ultra-web.co.uk/?p=178" target="_blank">http://ultra-web.co.uk/?p=178</a><br />
<strong></strong></p>
<p><strong><br />
Fill Colors</strong><br />
Fill Colors 是一个分离Flex风格和布局工具，预览Flex应用外观皮肤。<br />
<a href="http://www.gskinner.com/blog/archives/2008/08/gtween_a_new_tw.html" target="_blank">http://www.fillcolors.com/</a></p>
<p><strong><br />
gTween</strong><br />
动画库 by Grant Skinner<br />
<a href="http://www.gskinner.com/blog/archives/2008/08/gtween_a_new_tw.html" target="_blank">http://www.gskinner.com/blog/archives/2008/08/gtween_a_new_tw.html</a></p>
<p><strong><br />
使用</strong><strong>Selenium来对</strong><strong>AIR AJAX 应用做功能测试的框架</strong><a href="http://corlan.org/2008/08/15/functional-testing-framework-for-air-ajax-apps-based-on-selenium"><br />
http://corlan.org/2008/08/15/functional-testing-framework-for-air-ajax-apps-based-on-selenium</a></p>
<p><strong><br />
Yahoo! Music API</strong><br />
The Yahoo! 音乐API给开发者权限来使用Yahoo! Music 目录。提供了多种方式浏览。<br />
<a href="http://developer.yahoo.com/music/">http://developer.yahoo.com/music/</a></p>
<p><strong><br />
ActionScript 3 灵活的布局类</strong></p>
<p>The NpFlexLayout 类是设计用来简化DisplayObjects的布局。<br />
<a href="http://www.blog.noponies.com/archives/109" target="_blank">http://www.blog.noponies.com/archives/109</a></p>
<p><strong><br />
mediacorelib - </strong><strong>ActionScript 3.0</strong><strong> 核心媒体库</strong><br />
<a href="http://code.google.com/p/mediacorelib/" target="_blank">http://code.google.com/p/mediacorelib/</a></p>
<p><strong><br />
Servebox ActionScript Foundry</strong><br />
&nbsp;ActionScript 3 / Java 框架为 Flex 2 应用设计，基于多个设计模式。<a href="http://www.servebox.com/foundry/doku.php?id="><br />
http://www.servebox.com/foundry/doku.php?id=</a></p>
<p><strong><br />
Flest Framework</strong><br />
Flest 是一个 ActionScript3 / Flex 应用框架，用来创建企业级别RIA应用。<a href="http://code.google.com/p/flest/" target="_blank"><br />
http://code.google.com/p/flest/</a></p>
<p><strong><br />
Guasax Flex/AIR MVC - The MVC Flex/AIR Framework</strong><br />
Guasax是一个简单的框架提供可扩展的Flex应用。<a href="http://www.guasax.com/guasax/web/en/index.php" target="_blank"><br />
http://www.guasax.com/guasax/web/en/index.php</a></p>
<p><strong><br />
Flex Mojos - HelloWorldTutorial</strong><br />
最简单的教程，创建一个HellowWorldFlex程序<a href="http://code.google.com/p/flex-mojos/wiki/HelloWorldTutorial" target="_blank"><br />
http://code.google.com/p/flex-mojos/wiki/HelloWorldTutorial</a></p>
<p><strong><br />
Scott Evans - 对于新的 FlexBuilder 4 IDE 功能的公开讨论</strong><br />
Scott Evans, FlexBulder 团队的主导开发工程师，开始了一系列的新博客，讨论FlexBuilder 4 IDE 新功能，值得一看.<br />
<a href="http://gettingandsetting.com/" target="_blank">http://gettingandsetting.com/</a></p>
<p><strong><br />
dpHibernate - Hibernate lazy loading with Adobe BlazeDS</strong><br />
dpHibernate是一个定制的Flex库，和 custom BlazeDS Hibernate 一起使用提供对Flex应用内部的Hibernate对象 lazy loading(延迟加载)的支持。 <a href="http://blog.mikenimer.com/index.cfm/2008/5/21/dpHibernate--Hibernate-lazy-loading-with-Adobe-BlazeDS" target="_blank"><br />
http://blog.mikenimer.com/index.cfm/2008/5/21/dpHibernate&#8211;Hibernate-lazy-loading-with-Adobe-BlazeDS</a><a href="http://code.google.com/p/dphibernate" target="_blank"><br />
http://code.google.com/p/dphibernate</a></p>
<p><strong><br />
Alternativa3D — browser 3D-engine based on Adobe Flash</strong><br />
Create 3D- 基于Flash场景 3D引擎。<a href="http://alternativaplatform.com/en/alternativa3d/" target="_blank"><br />
http://alternativaplatform.com/en/alternativa3d/</a></p>
<p><strong><br />
KwikUML - build UML models of ActionScript and PHP classes</strong><br />
快速创建 ActionScript和PHP类，接口的 UML模型 的工具，以及提供SQL Entity关系设计 (ERDs). <a href="http://labs.otuome.com/kwikuml" target="_blank"><br />
http://labs.otuome.com/kwikuml</a></p>
<p><strong><br />
KitchenSync</strong><br />
KitchenSync 是一个 ActionScript 3.0 库，用来对动画排序以及其他基于时间的动作。<br />
<a href="http://code.google.com/p/kitchensynclib/" target="_blank">http://code.google.com/p/kitchensynclib/</a></p>
<p><strong><br />
as3xls - read and write Excel files in Flex</strong><br />
Flex读写excel文件工具</p>
<p><a href="http://code.google.com/p/as3xls/" target="_blank">http://code.google.com/p/as3xls/</a></p>
<p><strong><br />
ASDebugger - A run-time debugger for AS3 Projects</strong><br />
<a href="http://labs.flexperiments.nl/asdebugger/" target="_blank"></a></p>
<p>AS 3项目的运行调试工具</p>
<p><a href="http://labs.flexperiments.nl/asdebugger/" target="_blank">http://labs.flexperiments.nl/asdebugger/</a></p>
<p><strong><br />
as3corelib update</strong><br />
这是一个ActionScript 3 库，包含很多有用的能使用在AS3中的 APIs 。<br />
<a href="http://code.google.com/p/as3corelib/" target="_blank">http://code.google.com/p/as3corelib/</a></p>
<p><strong><br />
swix framework - Flex development framework</strong><br />
Swiz 是一个简化RIA开发的Flex框架。<br />
<a href="http://code.google.com/p/swizframework/" target="_blank">http://code.google.com/p/swizframework/</a></p>
<p><strong><br />
Gaia - open-source front-end Flash Framework for AS3 and AS2</strong><br />
Gaia 是一个开源的前台Flash框架，支持AS3和AS2，能够大量节省开发时间。<br />
<a href="http://www.gaiaflashframework.com/" target="_blank">http://www.gaiaflashframework.com/</a></p>
<p><strong><br />
Penne Framework - lightweight framework for developing in Flex and Air</strong><br />
version 1.0 of The Penne Framework, 一个简单的 Flex and Air 框架, 是 Cairngorm 框架的备选方案.<br />
<a href="http://www.flexpasta.com/index.php/2008/04/19/introducing-the-penne-framework-for-flex-3/" target="_blank">http://www.flexpasta.com/index.php/2008/04/19/introducing-the-penne-framework-for-flex-3/</a></p>
<p><strong><br />
An ActionScript Compiler Written In ActionScript</strong><br />
一个用ActionScript写的ActionScript编译器<br />
<a href="http://www.brooksandrus.com/blog/2008/08/27/an-actionscript-compiler-written-in-actionscript/" target="_blank">http://www.brooksandrus.com/blog/2008/08/27/an-actionscript-compiler-written-in-actionscript/</a></p>
</div>
<img src ="http://www.blogjava.net/qianbiguabi/aggbug/251707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2009-01-17 17:28 <a href="http://www.blogjava.net/qianbiguabi/archive/2009/01/17/251707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AS3实例： LRC 歌词同步 </title><link>http://www.blogjava.net/qianbiguabi/archive/2009/01/10/250789.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Sat, 10 Jan 2009 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2009/01/10/250789.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/250789.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2009/01/10/250789.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/250789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/250789.html</trackback:ping><description><![CDATA[<p>&lt;转&gt;http://www.flexcoders.cn/ActionScript/thread-2769-1-1.aspx<strong><br />
AS3实例： LRC 歌词同步 </strong></p>
<font face="宋体"><strong>一、准备工作</strong><br />
&nbsp; 既然要制作歌词同步程序，首先要准备一首歌，我们就以&#8220;周杰伦-青花瓷&#8221;为例。首先要下载这首&#8220;青花瓷.mp3&#8221;，保存为&#8220;C:\My Player\Music\青花瓷.mp3&#8221;。还要下载青花瓷的 LRC 文件，大家可以到网上下载（地址见附录），将文本内容保存为&#8220;C:\My Player\LRC\青花瓷.lrc&#8221;。我们的程序（类和FLA）则保存在&#8220;C:\My Player\&#8221;文件夹下。<br />
青花瓷.lrc 文件：<br />
</font>[ti:青花瓷]<br />
[ar:周杰伦]<br />
[al:我很忙]<br />
[by:张琪]<br />
[00:00.00]发送短信18到291199下载该歌曲到手机<br />
[00:01.11]青花瓷<br />
[03:36.49]<br />
[00:21.39]素眉勾勒秋千话北风龙转丹　<br />
[00:26.08]屏层鸟绘的牡丹一如你梳妆<br />
[00:30.46]黯然腾香透过窗心事我了然　<br />
[00:34.93]宣纸上皱边直尺各一半<br />
[00:39.49]油色渲染侍女图因为被失藏　<br />
[00:43.83]而你嫣然的一笑如含苞待放<br />
[00:48.30]你的美一缕飘散　<br />
[00:50.77]去到我去不了的地方<br />
[02:23.97][00:55.77]<br />
[03:01.92][02:25.63][00:56.90]天正在等烟雨　<br />
[03:03.57][02:27.91][00:58.99]而我在等你　<br />
[03:05.92][02:30.44][01:00.93]炊烟袅袅升起　<br />
[03:07.76][02:32.25][01:03.49]隔江千万里<br />
[03:10.36][02:34.85][01:05.84]在平地书刻你房间上的飘影　<br />
[03:14.67][02:38.73][01:09.87]就当我为遇见你伏笔<br />
[03:18.83][02:43.35][01:14.34]天正在等烟雨　<br />
[03:21.20][02:45.60][01:16.68]而我在等你　<br />
[03:23.71][02:48.01][01:18.99]月色被打捞起　<br />
[03:25.74][02:50.10][01:21.18]掩盖了结局<br />
[03:28.33][02:52.54][01:23.72]如传世的青花瓷在独自美丽　<br />
[03:32.30][02:56.67][01:27.65]你眼的笑意<br />
[01:50.25]色白花青的景已跃然于碗底　<br />
[01:54.69]临摹宋体落款时却惦记着你<br />
[01:59.22]你隐藏在药效里一千年的秘密　<br />
[02:03.75]急溪里犹如羞花沾落地<br />
[02:08.32]林外芭蕉　惹咒语　<br />
[02:10.57]梦幻的铜绿<br />
[02:12.84]而我路过那江南小镇的等你<br />
[02:17.19]在泼墨山水画里　<br />
[02:19.75]你从墨色深处被隐去<br />
&nbsp; 大家也可以把这个文本内容复制下来，然后在&#8220;C:\My Player\LRC\&#8221;下创建一个文本文档，将内容粘贴上去，再将文档保存为&#8220;青花瓷.lrc&#8221;，注意扩展名是&#8220;.lrc&#8221;。<br />
<br />
<br />
<br />
<font face="宋体"><strong>二、LRC 内容分析</strong><br />
&nbsp; 准备工作完成了，下面分析一下这个 LRC 文件。之所以叫 LRC ，是因为它是 Lyric (歌词) 的缩写。这种格式真是一目了然，前面&#8220;[ ]&#8221;中的数字表示其后歌词的开始时间。例如，&#8220;[01:50.25]色白花青的景已跃然于碗底&#8221;表示在1分50.25秒时，歌词内容是&#8220;色白花青的景已跃然于碗底&#8221;。<br />
&nbsp; 还有一种形式是&#8220;[03:01.92][02:25.63][00:56.90]天正在等烟雨&#8221;这种形式常用于赋格部分（俗称：歌曲的高潮部分），它表示在 03:01.92, 02:25.63, 00:56.90 时的歌词都是&#8220;天正在等烟雨&#8221;。由于这种形式的存在，使后面的编程稍显复杂，不过没关系，凭借各位的聪明智慧一定没问题。</font><br />
<br />
<br />
<br />
<font face="宋体"><strong>三、预备知识</strong><br />
1. ActionScript 3 中默认使用 Unicode 来解码外部文件，如果读取的文本不是 Unicode 编码，而是按照操作系统代码页编写的，比如 GB2312，那么需要先导入 flash.system.System 类，并在加载外部文本的语句前将 System.useCodePage 设为 true，默认情况下为 false，即默认不使用操作系统页解码。<br />
&nbsp; 如果 System.useCodePage = false 且外部 LRC 文件编码格式是 ANSI 的话，那么显示的中文歌词会是乱码。解决办法有两个：一是，将外部 LRC 文件编码格式改为 Unicode；二是，不改变外部文件编码格式，只在文档类中加入一句 System.useCodePage=true 即可。由于后一种方法使用简便，我们就采用第二种方法。</font><br />
<br />
<br />
<br />
<font face="宋体">2.读取声音：<br />
var sound:Sound=new Sound();<br />
<strong>sound.load(new URLRequest("Music/青花瓷.mp3"));</strong></font><br />
<br />
<br />
<br />
<font face="宋体">3.播放声音及获取当前播放时间（毫秒）：<br />
var sc:SoundChannel;<br />
var sound:Sound=new Sound();<br />
sound.load(new URLRequest("Music/青花瓷.mp3"));<br />
<strong>sc=sound.play();<br />
stage.addEventListener(Event.ENTER_FRAME,EnterFrame);</strong><br />
function EnterFrame(evt:Event):void {<br />
<strong>trace(sc.position);</strong><br />
}<br />
这里将 sc 声明为全局变量（或类变量），因为在多个方法中都要使用它。</font><br />
<br />
<br />
<br />
<font face="宋体">4.读取外部文件：<br />
var loader:URLLoader=new URLLoader();<br />
<strong>loader.load(new URLRequest("LRC/青花瓷.lrc"));</strong><br />
loader.addEventListener(Event.COMPLETE,LoadFinish);<br />
function LoadFinish(evt:Event):void {<br />
&nbsp;trace(evt.target.data);<br />
}</font><br />
<br />
<br />
<br />
<font face="宋体">5.将字符串按分隔符分隔为数组（String.split）：<br />
var str:String="FL Basic Theory Master";<br />
<strong>var array:Array=str.split(" ");</strong><br />
trace(array);<br />
//输出数组：[[FL],[Basic],[Theory],[Master]]<br />
str=" http://blog.sina.com.cn/yyy98";<br />
<strong>array=str.split(".");</strong><br />
trace(array);<br />
//输出数组：[[http://blog],[sina,com],[cn/yyy98]]</font><br />
<br />
<br />
<br />
<font face="宋体">6.简单的正则表达式应用：<br />
1&gt;获取匹配次数：<br />
var Pattern:RegExp=/Window/g;<br />
//意思是所有名为&#8220;Window&#8221;的字符串<br />
var str:String="Windows seems like a Window, so called Windows OS! ";<br />
trace(str.match(Pattern).length)<br />
//结果：3<br />
2&gt;获取正确匹配：<br />
var foo:RegExp=/[0-3][0-9]\/[0-1][0-9]\/[0-2][0-9][0-9][0-9]/g;<br />
//意思是所有格式为&#8220;日/月/年&#8221;的字符串<br />
var str:String="Date Format: 2006/12/25 2006-12-25 12/25/2007 25/12/2007"<br />
trace(str.match(foo))<br />
//结果：25/12/2007</font><br />
<br />
<br />
<br />
<font face="宋体">7.字符串取子串操作（String.substr）：<br />
var str:String="[03:01.92][02:25.63][00:56.90]天正在等烟雨";<br />
trace(str.substr(0,30));<br />
//从0号索引开始，取30个字符<br />
//结果：[03:01.92][02:25.63][00:56.90]<br />
trace(str.substr(30));<br />
//只写一个参数，表示从该索引处到字符串结束位置<br />
//结果：天正在等烟雨</font><br />
<br />
<br />
<br />
<font face="宋体">8.数组排序中比较函数的应用：<br />
var a:Object={price:20,number:3};<br />
var b:Object={price:10,number:7};<br />
var c:Object={price:50,number:1};<br />
var amountAry:Array=[a,b,c];<br />
<strong>function compare(paraA:Object,paraB:Object):int {</strong><br />
&nbsp;var resultA =paraA.price*paraA.number;<br />
&nbsp;var resultB =paraB.price*paraB.number;<br />
&nbsp;if (resultA &gt; resultB) return 1; &nbsp;<br />
&nbsp;if (resultA &lt; resultB) return -1;<br />
&nbsp;return 0;<br />
}<br />
<strong>amountAry.sort(compare);</strong><br />
trace(amountAry[0].price); &nbsp;//输出：50<br />
trace(amountAry[1].price); &nbsp;//输出：20<br />
trace(amountAry[2].price); &nbsp;//输出：10<br />
</font><br />
<br />
<br />
<br />
<br />
<br />
<font face="宋体"><strong>四、LRC 的读取与存储转换（使用文档类设计）</strong><br />
1.读取 LRC 文件，这一步非常简单与读取普通的文本文件是一样的；<br />
public function LRCPlayer() {<br />
&nbsp;var loader:URLLoader=new URLLoader();<br />
<strong>&nbsp;loader.load(new URLRequest("LRC/青花瓷.lrc"));<br />
&nbsp;loader.addEventListener(Event.COMPLETE,LoadFinish);</strong><br />
}<br />
function LoadFinish(evt:Event):void {<br />
&nbsp;trace(evt.target.data);<br />
}</font><font face="宋体">2.将读取的 LRC 数据按行分割（ "\n" 为换行符），数组的每一个元素代表 LRC 的一行内容；<br />
function LoadFinish(evt:Event):void {<br />
&nbsp;var list:String=evt.target.data;<br />
<strong>var listarray:Array=list.split("\n");</strong><br />
&nbsp;trace(listarray);<br />
}</font><font face="宋体">3.在数组中提取每一行的时间及歌词，解决单时间序列的问题；</font><br />
<br />
<font face="宋体"><strong>（注意！此段代码只作讲解，不以应用）</strong><br />
LRC 内容如下：<br />
[00:43.83]而你嫣然的一笑如含苞待放<br />
[00:48.30]你的美一缕飘散　<br />
[00:50.77]去到我去不了的地方<br />
[03:01.92]天正在等烟雨　<br />
[03:03.57]而我在等你　<br />
[03:05.92]炊烟袅袅升起　<br />
[03:07.76]隔江千万里<br />
代码如下：<br />
function LoadFinish(evt:Event):void {<br />
&nbsp;var list:String=evt.target.data;<br />
&nbsp;var listarray:Array=list.split("\n");<br />
&nbsp;for (var i=0; i &lt; listarray.length; i++) {<br />
&nbsp; <strong>var info:String=listarray[i];<br />
</strong>&nbsp; //提取每行内容，用变量 info 保存<br />
&nbsp; <strong>var lyric:String=info.substr(10);</strong><br />
&nbsp; //将歌词内容提取到 lyric 变量中<br />
&nbsp; <strong>var ctime:String =info.substr(0,10);</strong><br />
&nbsp; //提取时间序列字串<br />
&nbsp; <strong>var ntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));<br />
</strong>&nbsp; //将时间字串转换为计算机可读取的时间<br />
&nbsp; var obj:Object=new Object();<br />
&nbsp; <strong>obj.timer=ntime*1000;<br />
</strong>&nbsp; <strong>obj.lyric=lyric;<br />
</strong>&nbsp; <strong>LRCarray.push(obj);<br />
</strong>&nbsp; //将时间与歌词保存到一个 Object 中，并压入LRCarray 数组<br />
&nbsp; trace(obj.timer,obj.lyric);<br />
&nbsp;}<br />
}<br />
输出结果：<br />
43830 而你嫣然的一笑如含苞待放<br />
48300 你的美一缕飘散<br />
50770 去到我去不了的地方<br />
181920 天正在等烟雨<br />
183570 而我在等你<br />
185920 炊烟袅袅升起<br />
187760 隔江千万里</font><font face="宋体">4.在LRC文件，还有多时间序列的存在，所以单时间序列算法不能满足实际需要，下面就来解决多时间序列问题；<br />
LRC 内容如下：<br />
[00:43.83]而你嫣然的一笑如含苞待放<br />
[00:48.30]你的美一缕飘散　<br />
[00:50.77]去到我去不了的地方<br />
[03:01.92][02:25.63][00:56.90]天正在等烟雨　<br />
[03:03.57][02:27.91][00:58.99]而我在等你　<br />
[03:05.92][02:30.44][01:00.93]炊烟袅袅升起　<br />
[03:07.76][02:32.25][01:03.49]隔江千万里<br />
代码如下：<br />
function LoadFinish(evt:Event):void {<br />
&nbsp;var list:String=evt.target.data;<br />
&nbsp;var listarray:Array=list.split("\n");<br />
&nbsp;var reg:RegExp=/\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g;<br />
&nbsp;//建立正则表达式，范围：[00:00.00]～[59:59.99]<br />
&nbsp;for (var i=0; i &lt; listarray.length; i++) {<br />
&nbsp; <strong>var info:String=listarray[i];<br />
</strong>&nbsp; //提取每行内容，用变量 info 保存<br />
&nbsp; <strong>var len:int=info.match(reg).length;</strong><br />
&nbsp; //该行拥有时间序列的个数<br />
&nbsp; <strong>var timeAry:Array=info.match(reg);<br />
</strong>&nbsp; //将匹配的时间序列保存到 timeAry 数组中<br />
&nbsp; <strong>var lyric:String=info.substr(len*10);<br />
</strong>&nbsp; //根据每个时间序列占10个字符，找出歌词内容的起点</font><br />
<br />
<font face="宋体">&nbsp; //将歌词提取到 lyric 变量中<br />
&nbsp; for (var k:int=0; k &lt; timeAry.length; k++) {<br />
&nbsp; <strong>var obj:Object=new Object();<br />
&nbsp; &nbsp;var ctime:String=timeAry[k];<br />
&nbsp; &nbsp;var ntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));<br />
&nbsp; &nbsp;obj.timer=ntime*1000;<br />
&nbsp; &nbsp;obj.lyric=lyric;<br />
&nbsp; &nbsp;LRCarray.push(obj);<br />
&nbsp; &nbsp;trace(obj.timer,obj.lyric);</strong><br />
&nbsp; }<br />
&nbsp; //将时间序列转换为毫秒并与歌词一起保存为一个数组元素<br />
&nbsp;}<br />
}<br />
输出结果：<br />
43830 而你嫣然的一笑如含苞待放<br />
48300 你的美一缕飘散　<br />
50770 去到我去不了的地方<br />
181920 天正在等烟雨　<br />
145630 天正在等烟雨　<br />
56900 天正在等烟雨　<br />
183570 而我在等你　<br />
147910 而我在等你　<br />
58990 而我在等你　<br />
185920 炊烟袅袅升起　<br />
150440 炊烟袅袅升起　<br />
60930 炊烟袅袅升起　<br />
187760 隔江千万里<br />
152250 隔江千万里<br />
63490 隔江千万里</font><font face="宋体">5.将获得的 LRCarray 数组按起始时间排序，这对于按序读取歌词有重要意义；<br />
LRCarray.sort(<strong>compare</strong>);<br />
<strong>private function compare(paraA:Object,paraB:Object):int</strong>{<br />
&nbsp;if (paraA.timer &gt; paraB.timer) {<br />
&nbsp; return 1;<br />
&nbsp;}<br />
&nbsp;if (paraA.timer &lt; paraB.timer) {<br />
&nbsp; return -1;<br />
&nbsp;}<br />
&nbsp;return 0;<br />
}<br />
结果如下：<br />
43830 而你嫣然的一笑如含苞待放<br />
48300 你的美一缕飘散<br />
50770 去到我去不了的地方<br />
56900 天正在等烟雨<br />
58990 而我在等你<br />
60930 炊烟袅袅升起<br />
63490 隔江千万里<br />
145630 天正在等烟雨<br />
147910 而我在等你<br />
150440 炊烟袅袅升起<br />
152250 隔江千万里<br />
181920 天正在等烟雨<br />
183570 而我在等你<br />
185920 炊烟袅袅升起<br />
187760 隔江千万里</font><font face="宋体">6.最后，随着音乐的播放，读取播放时间段内的歌词。用当前播放时间与 LRCarray 中的时间相比较，如果当前时间小于 LRCarray[i].timer 的时间，那么就显示 LRCarray[i-1].lyric 的歌词。为什么要显示 [i-1] 的歌词呢？比如说当前播放到第 500 秒，读取的 LRCarray[20].timer 时间是 400 秒，那么 i++ 。下一次读取的 LRCarray[21].timer 时间是 700 秒，这时当前播放时间小于读取的这个时间，就说明当前的第 500 秒仍处于 LRCarray[20].timer 的时间范围内。<br />
var lrc_txt:TextField=new TextField();<br />
var LRCarray:Array=new Array();<br />
var sc:SoundChannel;<br />
public function LRCPlayer() {<br />
&nbsp;lrc_txt.width=500;<br />
&nbsp;lrc_txt.selectable=false;<br />
&nbsp;addChild(lrc_txt);<br />
&nbsp;//歌词在文本 lrc_txt 中显示<br />
&nbsp;var loader:URLLoader=new URLLoader();<br />
&nbsp;loader.load(new URLRequest("LRC/青花瓷.lrc"));<br />
&nbsp;loader.addEventListener(Event.COMPLETE,LoadFinish);<br />
&nbsp;var sound:Sound=new Sound();<br />
&nbsp;sound.load(new URLRequest("Music/青花瓷.mp3"));<br />
&nbsp;sc=sound.play();<br />
&nbsp;//播放声音，并生成 sc 变量，SoundChannel 类的实例<br />
&nbsp;stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);<br />
&nbsp;//实时刷新歌词<br />
}<br />
<strong>function SoundPlaying(evt:Event):void {<br />
&nbsp;for (var i=1; i &lt; LRCarray.length; i++) {<br />
&nbsp; if (sc.position &lt; LRCarray[i].timer) {<br />
&nbsp; &nbsp;lrc_txt.text=LRCarray[i-1].lyric;<br />
&nbsp; &nbsp;break;<br />
&nbsp; </strong>//找到歌词，跳出循环体<br />
<strong>&nbsp; }<br />
&nbsp; lrc_txt.text=LRCarray[LRCarray.length-1].lyric;<br />
</strong>&nbsp; //找不到歌词，说明已超出了最后一句的时间，因此显示最后一句歌词<br />
<strong>&nbsp;}<br />
}</strong></font><br />
<br />
<br />
<br />
<font face="宋体"><strong>五、全部代码（文档类 LRCPlayer.as）：</strong><br />
package {<br />
import flash.display.Sprite;<br />
import flash.net.URLRequest;<br />
import flash.net.URLLoader;<br />
import flash.media.Sound;<br />
import flash.media.SoundChannel;<br />
import flash.events.Event;<br />
import flash.text.TextField;<br />
import flash.system.System;<br />
public class LRCPlayer extends Sprite {<br />
var lrc_txt:TextField=new TextField();<br />
var LRCarray:Array=new Array();<br />
var sc:SoundChannel;<br />
public function LRCPlayer() {<br />
&nbsp;System.useCodePage=true;<br />
&nbsp;lrc_txt.width=500;<br />
&nbsp;lrc_txt.selectable=false;<br />
&nbsp;addChild(lrc_txt);<br />
&nbsp;var loader:URLLoader=new URLLoader();<br />
&nbsp;loader.load(new URLRequest("LRC/青花瓷.lrc"));<br />
&nbsp;loader.addEventListener(Event.COMPLETE,LoadFinish);<br />
&nbsp;var sound:Sound=new Sound();<br />
&nbsp;sound.load(new URLRequest("Music/青花瓷.mp3"));<br />
&nbsp;sc=sound.play();<br />
&nbsp;stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);<br />
}<br />
function SoundPlaying(evt:Event):void {<br />
&nbsp;for (var i=1; i &lt; LRCarray.length; i++) {<br />
&nbsp; if (sc.position &lt; LRCarray[i].timer) {<br />
&nbsp; &nbsp;lrc_txt.text=LRCarray[i-1].lyric;<br />
&nbsp; &nbsp;break;<br />
&nbsp; }<br />
&nbsp; lrc_txt.text=LRCarray[LRCarray.length-1].lyric;<br />
&nbsp;}<br />
}<br />
function LoadFinish(evt:Event):void {<br />
&nbsp;var list:String=evt.target.data;<br />
&nbsp;var listarray:Array=list.split("\n");<br />
&nbsp;var reg:RegExp=/\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g;<br />
&nbsp;for (var i=0; i &lt; listarray.length; i++) {<br />
&nbsp; var info:String=listarray[i];<br />
&nbsp; var len:int=info.match(reg).length;<br />
&nbsp; var timeAry:Array=info.match(reg);<br />
&nbsp; var lyric:String=info.substr(len*10);<br />
&nbsp; for (var k:int=0; k &lt; timeAry.length; k++) {<br />
&nbsp; &nbsp;var obj:Object=new Object();<br />
&nbsp; &nbsp;var ctime:String=timeAry[k];<br />
&nbsp; &nbsp;var ntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));<br />
&nbsp; &nbsp;obj.timer=ntime*1000;<br />
&nbsp; &nbsp;obj.lyric=lyric;<br />
&nbsp; &nbsp;LRCarray.push(obj);<br />
&nbsp; }<br />
&nbsp;}<br />
&nbsp;LRCarray.sort(compare);<br />
}<br />
private function compare(paraA:Object,paraB:Object):int {<br />
&nbsp;if (paraA.timer &gt; paraB.timer) {<br />
&nbsp; return 1;<br />
&nbsp;}<br />
&nbsp;if (paraA.timer &lt; paraB.timer) {<br />
&nbsp; return -1;<br />
&nbsp;}<br />
&nbsp;return 0;<br />
}<br />
}<br />
}</font><br />
<br />
<br />
<br />
<strong>六、*无处不在的优化</strong><br />
&nbsp; 至此，该程序已经可以顺利执行了，此处只讨论一下优化问题，看不懂可以跳过。<br />
以这段代码为例：<br />
function SoundPlaying(evt:Event):void {<br />
for (var i=1; i &lt; LRCarray.length; i++) {<br />
&nbsp;if (sc.position &lt; LRCarray[i].timer) {<br />
&nbsp; lrc_txt.text=LRCarray[i-1].lyric;<br />
&nbsp; break;<br />
&nbsp;}<br />
&nbsp;lrc_txt.text=LRCarray[LRCarray.length-1].lyric;<br />
}<br />
}<br />
如果要进行优化，那么这个 for 循环，应该写成：<br />
for (var i=1,j=LRCarray.length; i &lt; j; i++) {&#8230; &#8230;}<br />
这样在执行判断时，不必每次都进行 LRCarray.length 操作，该操用于读取数组长度，执行 Array 类的 length 方法，属于高级操作，花费的时间要比低级操作多。其实，只要读取一次长度，然后将结果保存在变量 j 中，每次判断时读取 j 的值即可。取值与赋值都属于低级别的操作，速度较快。同样的道理，在 if (sc.position &lt; LRCarray[i].timer) {&#8230; &#8230;} 中的 sc.position 在每次判断时都要读取一遍，这时就应将它在循环之前保存到一个变量里，这段代码优化后应是这样：<br />
function SoundPlaying(evt:Event):void {<br />
var now:Number=sc.position;<br />
for (var i=1,j=LRCarray.length; i &lt; j; i++) {<br />
&nbsp;if (now &lt; LRCarray[i].timer) {<br />
&nbsp; lrc_txt.text=LRCarray[i-1].lyric;<br />
&nbsp; break;<br />
&nbsp;}<br />
&nbsp;lrc_txt.text=LRCarray[j-1].lyric;<br />
}<br />
}<br />
&nbsp; 在我们的文档类中还有几个地方用到了 for 循环，请大家按照上述方法自行优化。<br />
&nbsp; 其实，代码优化无处不在，其中的学问不胜枚举，有兴趣的朋友可以到我的博客中看一下关于代码优化的总结贴，见附录。<br />
<br />
<br />
<br />
<font face="宋体"><strong>七、附录</strong><br />
LRC 文件下载地址：<br />
<a href="http://lrc.bzmtv.com/" target="_blank">http://lrc.bzmtv.com/</a></font><font face="宋体"><br />
<a href="http://www.5ilrc.com/" target="_blank">http://www.5ilrc.com/</a></font><br />
<br />
至于 MP3 的下载，我想大家比我在行，用百度或酷狗都可以。<br />
<br />
整个文件包括（歌曲、歌词、LRCPlayer.as 、FLA 文件）本帖附件中下载<br />
下载附件:<a href="http://www.flexcoders.cn/Attachment.aspx?ID=212" target="_blank">My Player.part1.rar</a><br />
<br />
下载附件:<a href="http://www.flexcoders.cn/Attachment.aspx?ID=213" target="_blank">My Player.part2.rar</a><br />
<br />
下载附件:<a href="http://www.flexcoders.cn/Attachment.aspx?ID=214" target="_blank">My Player.part3.rar</a><br />
<br />
下载附件:<a href="http://www.flexcoders.cn/Attachment.aspx?ID=215" target="_blank">My Player.part4.rar</a><br />
<br />
<br />
<strong>八、结束语</strong><br />
&nbsp; 恭喜您坚持到了现在，确实内容比较长，同时也涉及了一些知识点。其实做法肯定不只这一种，所以希望大家多多发挥主观能动性，结合上述内容继续将这个播放程序做大做强。好了，就到这里，再次感谢。 
<img src ="http://www.blogjava.net/qianbiguabi/aggbug/250789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2009-01-10 11:11 <a href="http://www.blogjava.net/qianbiguabi/archive/2009/01/10/250789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SqlMapClient对象</title><link>http://www.blogjava.net/qianbiguabi/archive/2008/12/22/247708.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Mon, 22 Dec 2008 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2008/12/22/247708.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/247708.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2008/12/22/247708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/247708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/247708.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SqlMapClient对象这个对象是iBatis操作数据库的接口（执行CRUD等操作），它也可以执行事务管理等操作。这个类是我们使用iBATIS的最主要的类。它是线程安全的。通常，将它定义为单例。（与hibernate中sessionFactory的定义类似）。如：                                    import java.io.Rea...&nbsp;&nbsp;<a href='http://www.blogjava.net/qianbiguabi/archive/2008/12/22/247708.html'>阅读全文</a><img src ="http://www.blogjava.net/qianbiguabi/aggbug/247708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2008-12-22 10:42 <a href="http://www.blogjava.net/qianbiguabi/archive/2008/12/22/247708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE内置函数大全</title><link>http://www.blogjava.net/qianbiguabi/archive/2008/12/17/246842.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Wed, 17 Dec 2008 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2008/12/17/246842.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/246842.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2008/12/17/246842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/246842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/246842.html</trackback:ping><description><![CDATA[给出整数,返回对应的字符;<br />
SQL&gt; select chr(54740) zhao,chr(65) chr65 from dual; ZH C<br />
-- -<br />
赵 A 3.CONCAT<br />
连接两个字符串;<br />
SQL&gt; select concat('010-','88888888')'转23'&nbsp; 高乾竞电话 from dual; 高乾竞电话<br />
----------------<br />
010-88888888转23 4.INITCAP<br />
返回字符串并将字符串的第一个字母变为大写;<br />
SQL&gt; select initcap('smith') upp from dual; UPP<br />
-----<br />
Smith <br />
5.INSTR(C1,C2,I,J)<br />
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;<br />
C1&nbsp;&nbsp;&nbsp; 被搜索的字符串<br />
C2&nbsp;&nbsp;&nbsp; 希望搜索的字符串<br />
I&nbsp;&nbsp;&nbsp;&nbsp; 搜索的开始位置,默认为1<br />
J&nbsp;&nbsp;&nbsp;&nbsp; 出现的位置,默认为1<br />
SQL&gt; select instr('<a class="ReplaceKeyword" href="http://www.knowsky.com/article.asp?typeid=171" target="_blank">Oracle</a> traning','ra',1,2) instring from dual; &nbsp;INSTRING<br />
---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 <br />
6.LENGTH<br />
返回字符串的长度;<br />
SQL&gt; select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst; NAME&nbsp;&nbsp; LENGTH(NAME) ADDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LENGTH(ADDR)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL LENGTH(TO_CHAR(SAL))<br />
------ ------------ ---------------- ------------ --------- --------------------<br />
高乾竞&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 北京市海锭区&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp; 9999.99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 7.LOWER<br />
返回字符串,并将所有的字符小写<br />
SQL&gt; select lower('AaBbCcDd')AaBbCcDd from dual; AABBCCDD<br />
--------<br />
aabbccdd <br />
8.UPPER<br />
返回字符串,并将所有的字符大写<br />
SQL&gt; select upper('AaBbCcDd') upper from dual; UPPER<br />
--------<br />
AABBCCDD 9.RPAD和LPAD(粘贴字符)<br />
RPAD&nbsp; 在列的右边粘贴字符<br />
LPAD&nbsp; 在列的左边粘贴字符<br />
SQL&gt; select lpad(rpad('gao',10,'*'),17,'*')from dual; LPAD(RPAD('GAO',1<br />
-----------------<br />
*******gao*******<br />
不够字符则用*来填满 <br />
10.LTRIM和RTRIM<br />
LTRIM&nbsp; 删除左边出现的字符串<br />
RTRIM&nbsp; 删除右边出现的字符串<br />
SQL&gt; select ltrim(rtrim('&nbsp;&nbsp; gao qian jing&nbsp;&nbsp; ',' '),' ') from dual; <br />
LTRIM(RTRIM('<br />
-------------<br />
gao qian jing <br />
11.SUBSTR(string,start,count)<br />
取子字符串,从start开始,取count个<br />
SQL&gt; select substr('13088888888',3,8) from dual; SUBSTR('<br />
--------<br />
08888888 <br />
12.REPLACE('string','s1','s2')<br />
string&nbsp;&nbsp; 希望被替换的字符或变量<br />
s1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被替换的字符串<br />
s2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要替换的字符串<br />
SQL&gt; select replace('he love you','he','i') from dual; REPLACE('H<br />
----------<br />
i love you <br />
13.SOUNDEX<br />
返回一个与给定的字符串读音相同的字符串<br />
SQL&gt; create table table1(xm varchar(8));<br />
SQL&gt; insert into table1 values('weather');<br />
SQL&gt; insert into table1 values('wether');<br />
SQL&gt; insert into table1 values('gao'); SQL&gt; select xm from table1 where soundex(xm)=soundex('weather'); XM<br />
--------<br />
weather<br />
wether <br />
14.TRIM('s' from 'string')<br />
LEADING&nbsp;&nbsp; 剪掉前面的字符<br />
TRAILING&nbsp; 剪掉后面的字符<br />
假如不指定,默认为空格符 15.ABS<br />
返回指定值的绝对值<br />
SQL&gt; select abs(100),abs(-100) from dual; &nbsp;ABS(100) ABS(-100)<br />
--------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100 <br />
16.ACOS<br />
给出反余弦的值<br />
SQL&gt; select acos(-1) from dual; &nbsp;ACOS(-1)<br />
---------<br />
3.1415927 <br />
17.ASIN<br />
给出反正弦的值<br />
SQL&gt; select asin(0.5) from dual; ASIN(0.5)<br />
---------<br />
.52359878 <br />
18.ATAN<br />
返回一个数字的反正切值<br />
SQL&gt; select atan(1) from dual; &nbsp; ATAN(1)<br />
---------<br />
.78539816 <br />
19.CEIL<br />
返回大于或等于给出数字的最小整数<br />
SQL&gt; select ceil(3.1415927) from dual; CEIL(3.1415927)<br />
---------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 <br />
20.COS<br />
返回一个给定数字的余弦<br />
SQL&gt; select cos(-3.1415927) from dual; COS(-3.1415927)<br />
---------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1 <br />
21.COSH<br />
返回一个数字反余弦值<br />
SQL&gt; select cosh(20) from dual; &nbsp;COSH(20)<br />
---------<br />
242582598 <br />
22.EXP<br />
返回一个数字e的n次方根<br />
SQL&gt; select exp(2),exp(1) from dual; &nbsp;&nbsp; EXP(2)&nbsp;&nbsp;&nbsp; EXP(1)<br />
--------- ---------<br />
7.3890561 2.7182818 <br />
23.FLOOR<br />
对给定的数字取整数<br />
SQL&gt; select floor(2345.67) from dual; FLOOR(2345.67)<br />
--------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2345 <br />
24.LN<br />
返回一个数字的对数值<br />
SQL&gt; select ln(1),ln(2),ln(2.7182818) from dual; <br />
&nbsp;&nbsp;&nbsp; LN(1)&nbsp;&nbsp;&nbsp;&nbsp; LN(2) LN(2.7182818)<br />
--------- --------- -------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 .69314718&nbsp;&nbsp;&nbsp;&nbsp; .99999999 <br />
25.LOG(n1,n2)<br />
返回一个以n1为底n2的对数<br />
SQL&gt; select log(2,1),log(2,4) from dual; &nbsp;LOG(2,1)&nbsp; LOG(2,4)<br />
--------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 <br />
26.MOD(n1,n2)<br />
返回一个n1除以n2的余数<br />
SQL&gt; select mod(10,3),mod(3,3),mod(2,3) from dual; MOD(10,3)&nbsp; MOD(3,3)&nbsp; MOD(2,3)<br />
--------- --------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 <br />
27.POWER<br />
返回n1的n2次方根<br />
SQL&gt; select power(2,10),power(3,3) from dual; POWER(2,10) POWER(3,3)<br />
----------- ----------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1024&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27 <br />
28.ROUND和TRUNC<br />
按照指定的精度进行舍入<br />
SQL&gt; select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual; ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)<br />
----------- ------------ ----------- ------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -55 <br />
29.SIGN<br />
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0<br />
SQL&gt; select sign(123),sign(-100),sign(0) from dual; SIGN(123) SIGN(-100)&nbsp;&nbsp; SIGN(0)<br />
--------- ---------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 <br />
30.SIN<br />
返回一个数字的正弦值<br />
SQL&gt; select sin(1.57079) from dual; SIN(1.57079)<br />
------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 <br />
31.SIGH<br />
返回双曲正弦的值<br />
SQL&gt; select sin(20),sinh(20) from dual; &nbsp; SIN(20)&nbsp; SINH(20)<br />
--------- ---------<br />
.91294525 242582598 <br />
32.SQRT<br />
返回数字n的根<br />
SQL&gt; select sqrt(64),sqrt(10) from dual; &nbsp;SQRT(64)&nbsp; SQRT(10)<br />
--------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 3.1622777 <br />
33.TAN<br />
返回数字的正切值<br />
SQL&gt; select tan(20),tan(10) from dual; &nbsp; TAN(20)&nbsp;&nbsp; TAN(10)<br />
--------- ---------<br />
2.2371609 .64836083 <br />
34.TANH<br />
返回数字n的双曲正切值<br />
SQL&gt; select tanh(20),tan(20) from dual; &nbsp;TANH(20)&nbsp;&nbsp; TAN(20)<br />
--------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 2.2371609 35.TRUNC<br />
按照指定的精度截取一个数<br />
SQL&gt; select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual; <br />
&nbsp;&nbsp; TRUNC1 TRUNC(124.16666,2)<br />
--------- ------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 124.16 36.ADD_MONTHS<br />
增加或减去月份<br />
SQL&gt; select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual; TO_CHA<br />
------<br />
200002<br />
SQL&gt; select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual; TO_CHA<br />
------<br />
199910 <br />
37.LAST_DAY<br />
返回日期的最后一天<br />
SQL&gt; select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual; TO_CHAR(SY TO_CHAR((S<br />
---------- ----------<br />
2004.05.09 2004.05.10<br />
SQL&gt; select last_day(sysdate) from dual; LAST_DAY(S<br />
----------<br />
31-5月 -04 <br />
38.MONTHS_BETWEEN(date2,date1)<br />
给出date2-date1的月份<br />
SQL&gt; select months_between('19-12月-1999','19-3月-1999') mon_between from dual; MON_BETWEEN<br />
-----------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9<br />
SQL&gt;selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual; &nbsp;MON_BETW<br />
---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -60 <br />
39.NEW_TIME(date,'this','that')<br />
给出在this时区=other时区的日期和时间<br />
SQL&gt; select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time<br />
&nbsp; 2&nbsp; (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual; BJ_TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOS_ANGLES<br />
------------------- -------------------<br />
2004.05.09 11:05:32 2004.05.09 18:05:32 <br />
40.NEXT_DAY(date,'day')<br />
给出日期date和星期x之后计算下一个星期的日期<br />
SQL&gt; select next_day('18-5月-2001','星期五') next_day from dual; NEXT_DAY<br />
----------<br />
25-5月 -01 41.SYSDATE<br />
用来得到系统的当前日期<br />
SQL&gt; select to_char(sysdate,'dd-mm-yyyy day') from dual; TO_CHAR(SYSDATE,'<br />
-----------------<br />
09-05-2004 星期日<br />
trunc(date,fmt)按照给出的要求将日期截断,假如fmt='mi'表示保留分,截断秒<br />
SQL&gt; select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,<br />
&nbsp; 2&nbsp; to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual; HH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HHMM<br />
------------------- -------------------<br />
2004.05.09 11:00:00 2004.05.09 11:17:00 42.CHARTOROWID<br />
将字符数据类型转换为ROWID类型<br />
SQL&gt; select rowid,rowidtochar(rowid),ename from scott.emp; ROWID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWIDTOCHAR(ROWID) ENAME<br />
------------------ ------------------ ----------<br />
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH<br />
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN<br />
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD<br />
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES <br />
43.CONVERT(c,dset,sset)<br />
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集<br />
SQL&gt; select convert('strutz','we8hp','f7dec') "conversion" from dual; <br />
conver<br />
------<br />
strutz <br />
44.HEXTORAW<br />
将一个十六进制构成的字符串转换为二进制 <br />
45.RAWTOHEXT<br />
将一个二进制构成的字符串转换为十六进制 46.ROWIDTOCHAR<br />
将ROWID数据类型转换为字符类型 47.TO_CHAR(date,'format')<br />
SQL&gt; select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY<br />
-------------------<br />
2004/05/09 21:14:41 48.TO_DATE(string,'format')<br />
将字符串转化为ORACLE中的一个日期 <br />
49.TO_MULTI_BYTE<br />
将字符串中的单字节字符转化为多字节字符<br />
SQL&gt;&nbsp; select to_multi_byte('高') from dual; TO<br />
--<br />
高 <br />
50.TO_NUMBER<br />
将给出的字符转换为数字<br />
SQL&gt; select to_number('1999') year from dual; &nbsp;&nbsp;&nbsp;&nbsp; YEAR<br />
---------<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1999 <br />
51.BFILENAME(dir,file)<br />
指定一个外部二进制文件<br />
SQL&gt;insert into file_tb1 values(bfilename('lob_dir1','image1.gif')); <br />
52.CONVERT('x','desc','source')<br />
将x字段或变量的源source转换为desc<br />
SQL&gt; select sid,serial#,username,decode(command,<br />
&nbsp; 2&nbsp; 0,'none',<br />
&nbsp; 3&nbsp; 2,'insert',<br />
&nbsp; 4&nbsp; 3,<br />
&nbsp; 5&nbsp; 'select',<br />
&nbsp; 6&nbsp; 6,'update',<br />
&nbsp; 7&nbsp; 7,'delete',<br />
&nbsp; 8&nbsp; 8,'drop',<br />
&nbsp; 9&nbsp; 'other') cmd&nbsp; from v$<a class="ReplaceKeyword" href="http://www.knowsky.com/tag-10.html" target="_blank">session</a> where type!='background'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID&nbsp;&nbsp; SERIAL# USERNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMD<br />
--------- --------- ------------------------------ ------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1275&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1275&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 GAO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40 GAO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; none <br />
<br />
53.DUMP(s,fmt,start,length)<br />
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值<br />
SQL&gt; col global_name for a30<br />
SQL&gt; col dump_string for a50<br />
SQL&gt; set lin 200<br />
SQL&gt; select global_name,dump(global_name,1017,8,5) dump_string from global_name; GLOBAL_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DUMP_STRING<br />
------------------------------ --------------------------------------------------<br />
ORACLE.WORLD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D <br />
54.EMPTY_BLOB()和EMPTY_CLOB()<br />
这两个函数都是用来对大数据类型字段进行初始化操作的函数 <br />
55.GREATEST<br />
返回一组表达式中的最大值,即比较字符的编码大小.<br />
SQL&gt; select greatest('AA','AB','AC') from dual; GR<br />
--<br />
AC<br />
SQL&gt; select greatest('啊','安','天') from dual; GR<br />
--<br />
天 <br />
56.LEAST<br />
返回一组表达式中的最小值<br />
SQL&gt; select least('啊','安','天') from dual; LE<br />
--<br />
啊 <br />
57.UID<br />
返回标识当前用户的唯一整数<br />
SQL&gt; show user<br />
USER 为"GAO"<br />
SQL&gt; select username,user_id from dba_users where user_id=uid; USERNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; USER_ID<br />
------------------------------ ---------<br />
GAO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25 58.USER<br />
返回当前用户的名字<br />
SQL&gt; select user from&nbsp; dual; USER<br />
------------------------------<br />
GAO <br />
59.USEREVN<br />
返回当前用户环境的信息,opt可以是:<br />
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE<br />
ISDBA&nbsp; 查看当前用户是否是DBA假如是则返回true<br />
SQL&gt; select userenv('isdba') from dual; USEREN<br />
------<br />
FALSE<br />
SQL&gt; select userenv('isdba') from dual; USEREN<br />
------<br />
TRUE<br />
SESSION<br />
返回会话标志<br />
SQL&gt; select userenv('sessionid') from dual; USERENV('SESSIONID')<br />
--------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 152<br />
ENTRYID<br />
返回会话人口标志<br />
SQL&gt; select userenv('entryid') from dual; USERENV('ENTRYID')<br />
------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
INSTANCE<br />
返回当前INSTANCE的标志<br />
SQL&gt; select userenv('instance') from dual; USERENV('INSTANCE')<br />
-------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br />
LANGUAGE<br />
返回当前环境变量<br />
SQL&gt; select userenv('language') from dual; <br />
USERENV('LANGUAGE')<br />
----------------------------------------------------<br />
SIMPLIFIED CHINESE_CHINA.ZHS16GBK<br />
LANG<br />
返回当前环境的语言的缩写<br />
SQL&gt; select userenv('lang') from dual; USERENV('LANG')<br />
----------------------------------------------------<br />
ZHS<br />
TERMINAL<br />
返回用户的终端或机器的标志<br />
SQL&gt; select userenv('terminal') from dual; USERENV('TERMINA<br />
----------------<br />
GAO<br />
VSIZE(X)<br />
返回X的大小(字节)数<br />
SQL&gt; select vsize(user),user from dual; VSIZE(USER) USER<br />
----------- ------------------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 SYSTEM 60.AVG(DISTINCTALL)<br />
all表示对所有的值求平均值,distinct只对不同的值求平均值<br />
SQLWKS&gt; create table table3(xm varchar(8),sal number(7,2));<br />
语句已处理。<br />
SQLWKS&gt;&nbsp; insert into table3 values('gao',1111.11);<br />
SQLWKS&gt;&nbsp; insert into table3 values('gao',1111.11);<br />
SQLWKS&gt;&nbsp; insert into table3 values('zhu',5555.55);<br />
SQLWKS&gt; commit; SQL&gt; select avg(distinct sal) from gao.table3; AVG(DISTINCTSAL)<br />
----------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3333.33 SQL&gt; select avg(all sal) from gao.table3; AVG(ALLSAL)<br />
-----------<br />
&nbsp;&nbsp;&nbsp; 2592.59 <br />
61.MAX(DISTINCTALL)<br />
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次<br />
　　返回选择列表项目的最大值，假如x是字符串数据类型，他返回一个VARCHAR2数据类型，假如X是一个DATA数据类型，返回一个日期，假如X是numeric数据类型，返回一个数字。注重distinct和all不起作用，应为最大值与这两种设置是相同的。<br />
SQL&gt; select max(distinct sal) from scott.emp; MAX(DISTINCTSAL)<br />
----------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000 <br />
62.MIN(DISTINCTALL)<br />
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次<br />
SQL&gt; select min(all sal) from gao.table3; MIN(ALLSAL)<br />
-----------<br />
&nbsp;&nbsp;&nbsp; 1111.11 <br />
63.STDDEV(distinctall)<br />
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差<br />
SQL&gt; select stddev(sal) from scott.emp; STDDEV(SAL)<br />
-----------<br />
&nbsp; 1182.5032 SQL&gt; select stddev(distinct sal) from scott.emp; STDDEV(DISTINCTSAL)<br />
-------------------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1229.951 64.VARIANCE(DISTINCTALL)<br />
求协方差 SQL&gt; select variance(sal) from scott.emp; VARIANCE(SAL)<br />
-------------<br />
&nbsp;&nbsp;&nbsp; 1398313.9 <br />
65.GROUP BY<br />
主要用来对一组数进行统计<br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno; &nbsp;&nbsp; DEPTNO&nbsp; COUNT(*)&nbsp; SUM(SAL)<br />
--------- --------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8750<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; 10875<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400 <br />
66.HAVING<br />
对分组统计再加限制条件<br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)&gt;=5; &nbsp;&nbsp; DEPTNO&nbsp; COUNT(*)&nbsp; SUM(SAL)<br />
--------- --------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; 10875<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400<br />
SQL&gt; select deptno,count(*),sum(sal) from scott.emp having count(*)&gt;=5 group by deptno ; &nbsp;&nbsp; DEPTNO&nbsp; COUNT(*)&nbsp; SUM(SAL)<br />
--------- --------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp; 10875<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9400 <br />
67.ORDER BY<br />
用于对查询到的结果进行排序输出<br />
SQL&gt; select deptno,ename,sal from scott.emp order by deptno,sal desc; &nbsp;&nbsp; DEPTNO ENAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SAL<br />
--------- ---------- ---------<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 KING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 CLARK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2450<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 MILLER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1300<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 SCOTT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 FORD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 JONES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2975<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 ADAMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1100<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 SMITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 800<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 BLAKE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2850<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 ALLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1600<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 TURNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1500<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 WARD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 MARTIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1250<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30 JAMES&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 950&nbsp;<br />
&nbsp; <br />
<!--正文内容结束-->
<img src ="http://www.blogjava.net/qianbiguabi/aggbug/246842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2008-12-17 13:20 <a href="http://www.blogjava.net/qianbiguabi/archive/2008/12/17/246842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Message Service</title><link>http://www.blogjava.net/qianbiguabi/archive/2008/12/16/246682.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Tue, 16 Dec 2008 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2008/12/16/246682.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/246682.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2008/12/16/246682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/246682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/246682.html</trackback:ping><description><![CDATA[<p>文章来源（IBM中国）</p>
<p>1、介绍</p>
<p><font face="Verdana, Arial, Helvetica" size="2">在这一节中，我们将分析两个进行点对点消息接发的程序—— QSender.java 和 QReceiver.java。 </font></p>
<p>我们将在一些小节中分析代码并描述每一小节的功能。</p>
<p>2、QSender:<font face="Arial">提示输入 JNDI 名称~</font></p>
<p><font face="Arial">这两个示例程序都是命令行程序， 用 System.in 输入、用 System.out 输出。 </font><font face="Arial">QSender 类有两个方法：main(String[]) 和 send()。main(String[]) 方法只举例说明了 QSender ，并调用了它的 send() 方法。</font><font face="Arial">send() 方法的第一部分提示输入用来发送消息受管理对象的 JNDI 的名称。 </font><font face="Arial"></font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.*; &nbsp;&nbsp;</span></span>
    <li class=""><span class="keyword">import</span><span>&nbsp;javax.jms.*; &nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.naming.*; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;QSender&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;QSender().send(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;send()&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(System.in)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Prompt&nbsp;for&nbsp;JNDI&nbsp;names </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;QueueConnectionFactory&nbsp;name:"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;factoryName&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;Queue&nbsp;name:"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queueName&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;.&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>3、<font face="Arial">QSender查找管理对象&nbsp; </font></p>
<p><font face="Arial">send() 方法的第二部分用前面输入的名字在 JNDI 中查找受管理的对象。</font><font face="Arial">通过举例说明 InitialContext 对象访问 JNDI，通过调用lookup(String) 方法并传递要获取的对象的名字来检索受管理的对象。注意， lookup(String) 方法返回的是 Object，所以必须对返回的对象进行类型强制转换。</font><font face="Arial"></font> </p>
<p><br />
</p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>.&nbsp;.&nbsp;. &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Look&nbsp;up&nbsp;administered&nbsp;objects </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitialContext&nbsp;initContext&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;InitialContext(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnectionFactory&nbsp;factory&nbsp;= &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(QueueConnectionFactory)&nbsp;initContext.lookup(factoryName); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;queue&nbsp;=&nbsp;(Queue)&nbsp;initContext.lookup(queueName); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initContext.close(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;. &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>4、<font face="Arial">QSender：创建 JMS 对象 </font></p>
<p><font face="Arial">现在，我们已创建了发送消息所需要的 JMS 对象。注意，我们没有用 new 直接举例说明这些对象。所有对象都是通过调用另一个对象的方法创建的。 <br />
</font><font face="Arial">首先，用 QueueConnectionFactory 创建 QueueConnection。然后用 QueueConnection 创建一个 QueueSession。 <br />
</font><font face="Arial">QueueSession 不是经过处理的（false），并且它将使用自动确认 （Session.AUTO_ACKNOWLEDGE）。 <br />
</font><font face="Arial">最后，创建 QueueSender 将信息发送到从 JNDI 中检索的 Queue 发送消息。 </font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>.&nbsp;.&nbsp;. &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Create&nbsp;JMS&nbsp;objects </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnection&nbsp;connection&nbsp;=&nbsp;factory.createQueueConnection(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueSession&nbsp;session&nbsp;= &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.createQueueSession(</span><span class="keyword">false</span><span>,&nbsp;Session.AUTO_ACKNOWLEDGE); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueSender&nbsp;sender&nbsp;=&nbsp;session.createSender(queue); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;.&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>5、<font face="Arial">QSender：发送消息 </font></p>
<p><font face="Arial">现在就可以发送消息了。在这一部分中，我们进入一个循环，该循环提示我们要发送的消息的文本。如果用户输入 quit，则退出循环。 </font></p>
<p><font face="Arial">否则要在输入的文本中建立一个 TextMessage ，并用 QueueSender 发送消息，然后返回循环的开始部分。 </font></p>
<p><font face="Arial"></font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>.&nbsp;.&nbsp;. &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Send&nbsp;messages </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;messageText&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(</span><span class="keyword">true</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;message&nbsp;to&nbsp;send&nbsp;or&nbsp;'quit':"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageText&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="string">"quit"</span><span>.equals(messageText)) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextMessage&nbsp;message&nbsp;=&nbsp;session.createTextMessage(messageText); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sender.send(message); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;. &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;6、<font face="Arial">QSender：退出 </font></p>
<p><font face="Arial">退出循环后，关闭 QueueConnection。关闭 QueueConnection 会自动关闭 QueueSession 和 QueueSender。</font></p>
<font face="Arial">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>.&nbsp;.&nbsp;. &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Exit </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Exiting..."</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.close(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Goodbye!"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>7、<font face="Arial">QReceiver提示输入 JNDI 名称并查找受管理的对象 </font></p>
<p><font face="Arial">QReceiver 类与 QSender 类非常类似，都有一个 main(String[]) 方法，它只举例说明 QReceiver 并调用了它的主要方法 receive()。 </font></p>
<p><font face="Arial">提示输入 JNDI 名字并查找受管理对象的代码与 QSender 中的代码完全一样。 <br />
</font><font face="Arial">不过，在这个类中有两处不一样的地方： <br />
</font><font face="Arial">boolean stop 实例变量被用来指出程序应该退出。<br />
</font><font face="Arial">QReceiver 可以实现 MessageListener 接口来异步接收消息。</font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.*; &nbsp;&nbsp;</span></span>
    <li class=""><span class="keyword">import</span><span>&nbsp;javax.jms.*; &nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.naming.*; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;QReceiver&nbsp;</span><span class="keyword">implements</span><span>&nbsp;MessageListener&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;stop&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;QReceiver().receive(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;receive()&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(System.in)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Prompt&nbsp;for&nbsp;JNDI&nbsp;names </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;QueueConnectionFactory&nbsp;name:"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;factoryName&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;Queue&nbsp;name:"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queueName&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Look&nbsp;up&nbsp;administered&nbsp;objects </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitialContext&nbsp;initContext&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;InitialContext(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnectionFactory&nbsp;factory&nbsp;= &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(QueueConnectionFactory)&nbsp;initContext.lookup(factoryName); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;queue&nbsp;=&nbsp;(Queue)&nbsp;initContext.lookup(queueName); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initContext.close(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;.&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p><font face="Arial">8、QReceiver：创建 JMS 对象 </font></p>
<p><font face="Arial">像在 QSender 中那样创建 QueueConnection 和 QueueSession，然后创建一个 QueueReceiver。 </font></p>
<p><font face="Arial">接着，调用 setMessageListener()，传递 QReceiver 的本地实例 this，我们将重调它来实现 MessageListener 接口。 </font></p>
<p><font face="Arial">最后，启动 QueueConnection 来接收消息。</font><font face="Arial"></font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>.&nbsp;.&nbsp;. &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Create&nbsp;JMS&nbsp;objects </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnection&nbsp;connection&nbsp;=&nbsp;factory.createQueueConnection(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueSession&nbsp;session&nbsp;= &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.createQueueSession(</span><span class="keyword">false</span><span>,&nbsp;Session.AUTO_ACKNOWLEDGE); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueReceiver&nbsp;receiver&nbsp;=&nbsp;session.createReceiver(queue); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiver.setMessageListener(</span><span class="keyword">this</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.start(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;. &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>9、<font face="Arial">QReceiver：等待 stop 并退出 </font></p>
<p><font face="Arial">接着，程序进入一个循环，它会在 stop 变量变为 true 时退出循环。在循环中，线程睡眠一秒钟。一旦退出循环， QueueConnection 就会退出，并且程序也会终止</font><font face="Arial"></font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>.&nbsp;.&nbsp;. &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Wait&nbsp;for&nbsp;stop </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(!stop)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span class="number">1000</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Exit </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Exiting..."</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.close(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Goodbye!"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span>
    <li class="alt"><span>.&nbsp;.&nbsp;.&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>10、<font face="Arial">QReceiver：onMessage(Message) 方法 </font></p>
<p><font face="Arial">需要包含 QReceiver 类的 onMessage(Message) 方法，因为 QReceiver 可以实现 MessageListener 接口。 </font></p>
<p><font face="Arial">接收消息时，就调用这个方法，并将 Message 作为参数传递。 </font></p>
<p><font face="Arial">在这个实现中，我们获得了消息的文本内容，并将它打印到 System.out。然后，检查消息是否等于 stop，如果是，则将 stop 变量设置为 true，这会使 receive() 方法中的循环终止。 </font></p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;. &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;onMessage(Message&nbsp;message)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msgText&nbsp;=&nbsp;((TextMessage)&nbsp;message).getText(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msgText); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="string">"stop"</span><span>.equals(msgText)) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(JMSException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
</p>
</font>
<p>11、源码QSender.java 的代码清单</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.*; &nbsp;&nbsp;</span></span>
    <li class=""><span class="keyword">import</span><span>&nbsp;javax.jms.*; &nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.naming.*; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;QSender&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;QSender().send(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;send()&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(System.in)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Prompt&nbsp;for&nbsp;JNDI&nbsp;names </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;QueueConnectionFactory&nbsp;name:"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;factoryName&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;Queue&nbsp;name:"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queueName&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Look&nbsp;up&nbsp;administered&nbsp;objects </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitialContext&nbsp;initContext&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;InitialContext(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnectionFactory&nbsp;factory&nbsp;= &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(QueueConnectionFactory)&nbsp;initContext.lookup(factoryName); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;queue&nbsp;=&nbsp;(Queue)&nbsp;initContext.lookup(queueName); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initContext.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Create&nbsp;JMS&nbsp;objects </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnection&nbsp;connection&nbsp;=&nbsp;factory.createQueueConnection(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueSession&nbsp;session&nbsp;= &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.createQueueSession(</span><span class="keyword">false</span><span>,&nbsp;Session.AUTO_ACKNOWLEDGE); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueSender&nbsp;sender&nbsp;=&nbsp;session.createSender(queue); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Send&nbsp;messages </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;messageText&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(</span><span class="keyword">true</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;message&nbsp;to&nbsp;send&nbsp;or&nbsp;'quit':"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageText&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="string">"quit"</span><span>.equals(messageText)) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextMessage&nbsp;message&nbsp;=&nbsp;session.createTextMessage(messageText); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sender.send(message); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Exit </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Exiting..."</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Goodbye!"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>12、源码QReceiver .java 的代码清单</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.*; &nbsp;&nbsp;</span></span>
    <li class=""><span class="keyword">import</span><span>&nbsp;javax.jms.*; &nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">import</span><span>&nbsp;javax.naming.*; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;QReceiver&nbsp;</span><span class="keyword">implements</span><span>&nbsp;MessageListener&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;stop&nbsp;=&nbsp;</span><span class="keyword">false</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;QReceiver().receive(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;receive()&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(System.in)); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Prompt&nbsp;for&nbsp;JNDI&nbsp;names </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;QueueConnectionFactory&nbsp;name:"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;factoryName&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Enter&nbsp;Queue&nbsp;name:"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queueName&nbsp;=&nbsp;reader.readLine(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Look&nbsp;up&nbsp;administered&nbsp;objects </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitialContext&nbsp;initContext&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;InitialContext(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnectionFactory&nbsp;factory&nbsp;= &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(QueueConnectionFactory)&nbsp;initContext.lookup(factoryName); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;queue&nbsp;=&nbsp;(Queue)&nbsp;initContext.lookup(queueName); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initContext.close(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Create&nbsp;JMS&nbsp;objects </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueConnection&nbsp;connection&nbsp;=&nbsp;factory.createQueueConnection(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueSession&nbsp;session&nbsp;= &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.createQueueSession(</span><span class="keyword">false</span><span>,&nbsp;Session.AUTO_ACKNOWLEDGE); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueueReceiver&nbsp;receiver&nbsp;=&nbsp;session.createReceiver(queue); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiver.setMessageListener(</span><span class="keyword">this</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.start(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Wait&nbsp;for&nbsp;stop </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(!stop)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span class="number">1000</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Exit </span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Exiting..."</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.close(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"Goodbye!"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span class="number">1</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;onMessage(Message&nbsp;message)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;msgText&nbsp;=&nbsp;((TextMessage)&nbsp;message).getText(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(msgText); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="string">"stop"</span><span>.equals(msgText)) &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(JMSException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop&nbsp;=&nbsp;</span><span class="keyword">true</span><span>; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>} &nbsp;</span></li>
</ol>
</div>
<img src ="http://www.blogjava.net/qianbiguabi/aggbug/246682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2008-12-16 17:37 <a href="http://www.blogjava.net/qianbiguabi/archive/2008/12/16/246682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详解 HermesJMS 连接 ActiveMQ（附视频）</title><link>http://www.blogjava.net/qianbiguabi/archive/2008/11/24/242214.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Mon, 24 Nov 2008 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2008/11/24/242214.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/242214.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2008/11/24/242214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/242214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/242214.html</trackback:ping><description><![CDATA[<table id="content" style="table-layout: fixed; width: 650px" cellspacing="10" cellpadding="0" width="650" border="0">
    <tbody>
        <tr>
            <td>
            <div style="font-size: 10pt"><span class="content">ActiveMQ 是一个实现了 JMS 1.1 规范的开源的 JMS Server，HermesJMS 则是一个开源的 GUI 工具，可以连接许多种 JMS Server。<br />
            <br />
            然而，HermesJMS 的官方网站上提供的配置方法语焉不详，常常使初次使用者陷入困境。本文给出详细的操作步骤，并给出了一段视频。<br />
            <br />
            <strong><font size="4">一、安装 ActiveMQ</font></strong><br />
            <br />
            1、下载 ActiveMQ，网址是：<a href="http://www.activemq.com/" target="_blank"><font color="#000000"><a href="http://www.activemq.com/" target="_blank">http://www.activemq.com</a></font></a>，目前的最新版本是 ActiveMQ 4.0 M4；<br />
            <br />
            2、把下载到的 activemq-4.0-M4.zip 解压，假设解压后的目录为 E:\activemq；<br />
            <br />
            3、运行 E:\activemq\bin 目录下的 activemq.bat （在 UNIX／LINUX 下运行 activemq 脚本）<br />
            <br />
            默认情况下，ActiveMQ 运行在 61616 端口，连接串是 tcp://hostname:61616。<br />
            <br />
            另：ActiveMQ 也可以通过 JMX Remote 来连接并进行管理，例如：用 MC4J Console 1.2b9。<br />
            <br />
            用 JMX Remote 工具时，连接串是：<strong>service:jmx:rmi://hostname/jndi/rmi://hostname:1099/jmxrmi</strong><br />
            <br />
            <strong><font size="4">二、安装 HermesJMS</font></strong><br />
            <br />
            1、下载 HermesJMS，网址是：<a href="http://www.hermesjms.com/" target="_blank"><font color="#000000"><a href="http://www.hermesjms.com/" target="_blank">http://www.hermesjms.com</a></font></a>，当前最新版本是 hermes-v1.10_221005；<br />
            <br />
            2、把下载到的 hermes-v1.10_221005.zip 解压，假设目录为 E:\hermes；<br />
            <br />
            3、运行 E:\hermes\bin\hermes.bat，启动 HermesJMS 的主界面；<br />
            <br />
            <strong><font size="4">三、配置 HermesJMS</font></strong><br />
            <br />
            1、单击主界面上的&#8220;Options -&gt; Configuration...&#8221;；<br />
            <br />
            2、在窗口底部，选择&#8220;Provider&#8221;；<br />
            <br />
            3、在窗口的空白处单击鼠标右键，选择&#8220;Add Group&#8221;；<br />
            <br />
            4、在 Classpath group name 中随便输入一个名字，例如 ActiveMQ 4.0 Group；<br />
            <br />
            5、展开刚添加的&#8220;ActiveMQ 4.0&#8221;节点，在&#8220;Library&#8221;上单击右键，选择&#8220;Add JAR(s)&#8221;；<br />
            <br />
            6、把连接 ActiveMQ 所需要的 JAR 文件添加进来，共需要下列文件：<br />
            <br />
            <font color="blue">&nbsp; activeio-2.1.jar<br />
            &nbsp; activemq-core-4.0-M4.jar<br />
            &nbsp; backport-util-concurrent-2.0_01_pd.jar<br />
            &nbsp; geronimo-spec-jms-1.1-rc4.jar</font><br />
            <br />
            7、当弹出窗口问是否自动&#8220;Scan&#8221;时，选择&#8220;Yes&#8221;；<br />
            <br />
            8、单击&#8220;OK&#8221;按钮，关闭当前窗口；<br />
            <br />
            9、在主界面左边树上的&#8220;sessions&#8221;节点上单击右键，&#8220;New -&gt; New session...&#8221;；<br />
            <br />
            10、在&#8220;Session:&#8221;后边，随意输入一个 Session 的名称，例如 &#8220;ActiveMQ4.0&#8221;；<br />
            <br />
            11、在&#8220;Connection Factory&#8221;下面，&#8220;Loader&#8221;右边的下拉框中选择刚才添加的 ActiveMQ 4.0 Group；<br />
            <br />
            12、在&#8220;Class&#8221;右边的下拉框中，选择&#8220;<strong>org.apache.activemq.ActiveMQConnectionFactory</strong>&#8221;；<br />
            <br />
            13、在&#8220;Class&#8221;和&#8220;Loader&#8221;下方的表格内，单击右键，&#8220;Add property&#8221;；<br />
            <br />
            14、在表格的第一列的下拉框中选择&#8220;<strong>brokerURL</strong>&#8221;，在右边输入&#8220;<strong>tcp://localhost:61616</strong>&#8221;；<br />
            <br />
            15、单击&#8220;OK&#8221;按钮，关闭当前窗口；<br />
            <br />
            <strong><font size="4">四、往队列中发消息</font></strong><br />
            <br />
            用 ActiveMQ 自带的例子，往队列中发消息。为了运行例子，需要有 Ant。<br />
            <br />
            1、下载 Ant，地址是：<a href="http://ant.apache.org/" target="_blank"><font color="#000000"><a href="http://ant.apache.org/" target="_blank">http://ant.apache.org</a></font></a>；<br />
            <br />
            2、把下载后的文件解压到某个目录下，例如：E:\Ant1.6.5；<br />
            <br />
            3、在系统的环境变量中设置&#8220;JAVA_HOME&#8221;和&#8220;ANT_HOME&#8221;（设置方法是：在&#8220;我的电脑&#8221;上单击右键，&#8220;属性&#8221;-&gt;&#8220;高级&#8221;-&gt;&#8220;环境变量&#8221;），例如 JAVA_HOME 设置为 E:\JDK1.4.2，ANT_HOME 设置为 E:\Ant1.6.5；<br />
            <br />
            4、把&#8220;%JAVA_HOME%\bin&#8221;和&#8220;%ANT_HOME%\bin&#8221;目录添加到系统的环境变量&#8220;PATH&#8221;中；<br />
            <br />
            5、打开一个&#8220;命令提示符&#8221;窗口，进入 ActiveMQ 的 examples 目录：E:\activemq\examples；<br />
            <br />
            6、输入&#8220;ant producer&#8221;，回车，待程序运行完毕，将往 ActiveMQ 的 QUEUE 中发送了一条消息，QUEUE 的名称是 TEST.FOO；<br />
            <br />
            <strong><font size="4">五、在 HermesJMS 中查看刚才发送的消息</font></strong><br />
            <br />
            1、在 HermesJMS 主界面左边的树中，在&#8220;sessions&#8221;下面刚才添加的&#8220;ActiveMQ4.0&#8221;节点上单击右键，&#8220;New -&gt; Add queue...&#8221;；<br />
            <br />
            2、在 Name 和 ShortName 里面都输入&#8220;TEST.FOO&#8221;；<br />
            <br />
            3、在主界面左边的树上，可以看出，在&#8220;ActiveMQ4.0&#8221;节点下面，添加了一个&#8220;TEST.FOO&#8221;节点；<br />
            <br />
            4、在&#8220;TEST.FOO&#8221;上单击右键，&#8220;Browse...&#8221;；<br />
            <br />
            5、在主界面右边的表格中，就可以看到刚才由 example 程序发到 TEST.FOO 队列的 10 条消息；<br />
            <br />
            <strong><font size="4">六、取走队列中的消息</font></strong><br />
            <br />
            1、另开一个&#8220;命令提示符&#8221;窗口，进入 E:\activemq\examples 目录；<br />
            <br />
            2、输入&#8220;ant consumer&#8221;，回车，待程序运行完毕，将从 ActiveMQ 的 QUEUE TEST.FOO 中取走所有消息；<br />
            <br />
            3、回到 HermesJMS 的主界面上去，在工具栏上单击&#8220;Refresh now.&#8221;按钮，刷新；<br />
            <br />
            4、可以看到主界面右边的表格中是空的，刚才显示的 10 条消息已经被取走。<br />
            <br />
            本文提供了视频剪辑，可从此处下载。因为有最大文件尺寸限制，所以分成两个卷压缩。下载后把两个文件放在一个目录下，然后解压第一个文件即可（第二个文件会自动被解压）。<br />
            <br />
            解压后的文件名为：<font color="red"><strong>HermesJmsDemo.exe</strong></font>，MD5 摘要是：<font color="red"><strong>A74CF06E27FD19D91F678E85E7B4C0C5</strong></font>。<br />
            <br />
            绝非病毒，请放心地双击播放。 </span><br />
            <a class="hidden" href="http://wakan.blog.51cto.com/59583/7217">本文出自 51CTO.COM技术博客</a></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
转自http://wakan.blog.51cto.com/59583/7217<br />
<div class="plusfile"><strong>附件下载：</strong><br />
　　<a href="http://wakan.blog.51cto.com/attachment/200611/59583_1162370109.rar" target="_blank"><img src="http://wakan.blog.51cto.com/images/plusfile.gif" border="0"  alt="" />第二部分 HermesJmsDemo.part2.rar (325 K)</a><br />
　　<a href="http://wakan.blog.51cto.com/attachment/200611/59583_1162370111.rar" target="_blank"><img src="http://wakan.blog.51cto.com/images/plusfile.gif" border="0"  alt="" />第一部分 HermesJmsDemo.part1.rar (712 K)</a></div>
<img src ="http://www.blogjava.net/qianbiguabi/aggbug/242214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2008-11-24 10:46 <a href="http://www.blogjava.net/qianbiguabi/archive/2008/11/24/242214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex官方快速入门教程翻译之20.Working with Tree Controls使用Tree控件_1</title><link>http://www.blogjava.net/qianbiguabi/archive/2008/11/21/241796.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Fri, 21 Nov 2008 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2008/11/21/241796.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/241796.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2008/11/21/241796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/241796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/241796.html</trackback:ping><description><![CDATA[<p>20.Working with Tree Controls使用Tree控件 <br />
初次翻译，错误之处必然不少，敬请见谅。 <br />
翻译日期：2008-03-01 <br />
译者：ShiLiangShuai(<a href="http://hi.baidu.com/shiliangshuai">http://hi.baidu.com/shiliangshuai</a>) <br />
Flex版本：3 <br />
原文地址：<a href="http://www.adobe.com/devnet/flex/quickstart/working_with_tree/">http://www.adobe.com/devnet/flex/quickstart/working_with_tree/</a> <br />
所处章节：Flex Developer Center -&gt; Flex Quick Starts -&gt; Working with Tree controls <br />
要看程序运行效果请查看原文，或自己手工编译程序。</p>
<p>Tree控件是一个枝和叶节点分层次的机构。树中没每一个条目叫做节点，节点既可以作为枝也可以作为叶。枝节点可以包含叶或枝节点，或者为空。一个叶节点就是一个树的末梢。本快速指南包含一些开发者在使用Treecontrols经常会遇到的一些挑战。 <br />
使用XMLLISTCOLLECTION 和ARRAYCOLLECTION对象的对比。 <br />
你也许想知道，在运行时从远程或本地得来的数据被动态修改的时候，应该使用XMLListCollection对象还是ArrayCollection对象作为Tree空间的数据提供者。 <br />
如果你使用的数据源提供成形的XML，并且，你想在Tree控件中操作 XML数据。你应该使用XMLListCollection对象作为数据提供者。当使用MXML标记时，如果数据源是XMLList对象，你应该把它绑定到XMLLsitCollection对象的source属性上，然后把 XMLListCollection对象绑定到Tree控件的dataProvider属性上。当你想要动态改变对象值时，不要使用XMLList或XML对象直接绑定到Tree控件的dataProvider属性上。 <br />
当数据源是RPC(远程过程调用)服务的lastResult属性，并且你想使用XML数据，确保RPC组件的resultFormat属性被设置成e4x，当你使用e4x结果格式，最总结果就是XMLList，可以绑定在XMLListCollection对象上。这里 有一个例子。 <br />
为例数据被动态改变，使用ArrayCollection对象作为Tree控件的数据提供器。当使用MXML标记时，如果你期望动态的改变Arrayl，你不应该把Array对象直接绑定到Tree控件的dataProvider属性上。作为代替，你应该绑定Array到一个ArrayCollection对象的source属性上，然后再把ArrayCollection对象绑定到Tree控件的dataProvider属性上。 <br />
当数据源是RPC(远程过程调用)服务的lastResult对象，并且RPC组件的resultFormat属性被成object，你应该使用ArrayUtil.toArray()方法来确保对象是一个Array。然后绑定到ArrayCollection对象上，就像下边的例子所示： <br />
&lt;mx:ArrayCollection<br />
&nbsp;&nbsp;&nbsp; id="employeeAC"<br />
&nbsp;&nbsp;&nbsp; source= "{ArrayUtil.toArray(employeeSrv.lastResult.employees.employee)}"/&gt;<br />
在运行时增加和删除叶子节点 <br />
你可以在运行时为Tree控件增加或删除叶子节点。下边的例子包含的代码来实现这种改变。这个程序使用预定义的枝和叶来初始化，表现公司部门和员工。你可以向任意枝节点增加叶节点在运行时。你也可以删除预定义的叶节点和你在运行时增加的节点。 <br />
在这个例子中的XML包含两种不同的元素名字，department和employee。Tree控件的label函数，决定根据元素的类型应该显示那些文本。它使用了E4X语法来返回department的title，或者employee的name。然后，这些语法在addEmployee()和removeEmployee()中会用到。 <br />
为了增加员工到业务部门，addEmployee()方法使用E4X语法，通过title属性的值获得业务部门的节点，并把它保存到XMLList类型的变量dept中。然后，通过调用dept.appendChild()方法向操作节点添加子结点。 <br />
remove方法保存当前被选择的元素到变量node中，node的类型是XML。调用node.localName()方法确定被选择的元素是否是employee节点。如果是employee节点，删除它。 <br />
Example<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" viewSourceURL="src/index.html"&gt;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:Script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import mx.collections.XMLListCollection;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var company:XML = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;department title="Finance" code="200"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;employee name="John H"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;employee name="Sam K"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/department&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;department title="Operations" code="400"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;employee name="Bill C"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;employee name="Jill W"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/department&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;department title="Engineering" code="300"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;employee name="Erin M"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;employee name="Ann B"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/department&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var companyData:XMLListCollection = new XMLListCollection(company.department);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function treeLabel(item:Object):String<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var node:XML = XML(item);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( node.localName() == "department" ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#111;&#100;&#101;&#46;&#64;&#116;&#105;&#116;&#108;&#101;">node.@title</a>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#111;&#100;&#101;&#46;&#64;&#110;&#97;&#109;&#101;">node.@name</a>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function addEmployee():void <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newNode:XML = &lt;employee/&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#101;&#119;&#78;&#111;&#100;&#101;&#46;&#64;&#110;&#97;&#109;&#101;">newNode.@name</a> = empName.text;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var dept:XMLList =company.department.(@title == "Operations");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( dept.length() &gt; 0 ) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dept[0].appendChild(newNode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; empName.text = "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function removeEmployee():void<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var node:XML = XML(tree.selectedItem);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( node == null ) return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( node.localName() != "employee" ) return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var children:XMLList = XMLList(node.parent()).children();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(var i:Number=0; i &lt; children.length(); i++) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( children[i].@name == <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#111;&#100;&#101;&#46;&#64;&#110;&#97;&#109;&#101;">node.@name</a> ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete children[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]]&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mx:Script&gt;<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:Tree id="tree" top="72" left="50" dataProvider="{companyData}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; labelFunction="treeLabel"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; height="224" width="179"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:HBox&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mx:Button label="Add Operations Employee" click="addEmployee()"/&gt;&lt;mx:TextInput id="empName"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/mx:HBox&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mx:Button label="Remove Selected Employee" click="removeEmployee()"/&gt;&nbsp;&nbsp; <br />
&lt;/mx:Application&gt; <br />
在运行时添加一个空的枝节点 <br />
可以在运行时向Tree控件添加空的枝节点。下边的例子展示了通过数据提供器(data provider)API和数据描述器(data descriptor )API添加枝节点。通常，添加枝节点的首选途径是通过数据提供器(data provider)API。 <br />
addEmptyBranthDP()方法通过数据提供器API向使用XML数据提供器的Tree组件增加一个空节点，这个方法为新节点创建一个XML类型的变量，并且设置这个节点的isBranch属性为true来创建一个枝节点。然后这个方法调用Tree控件的dataProvider.addItemAt()方法来向Tree控件的数据提供器增加新的元素。 <br />
addEmptyBranchDP2()方法通过数据提供器API向使用对象数据提供器的Tree组件增加一个空节点，这个方法使用children属性创建一个新的对象，使用children属性能够确保isBranch()方法返回true。然后，这个方法调用Tree控件的dataProvider.addItemAt()方法来向Tree控件的数据提供器增加新的对象。 <br />
addEmptyBranchDD()方法通过数据描述器(data descripter)API。这个方法创建一个XML类型的变量，并且设置isBranch属性为true来创建一个枝节点。然后，这个方法调用Tree控件的dataDescriptor.addChildAt()方法来向Tree控件的数据描述器添加一个新的子节点。 <br />
Example<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" viewSourceURL="src/index.html"&gt;&nbsp;&nbsp;&nbsp; &lt;mx:Script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;![CDATA[ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var dataX:XML =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;item label="Top"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;item label="Child One"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;item label="Child Two" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/item&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private var dataObj:Object =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [{label:"Top", children:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {label:"Child One"}, {label: "Child Two"}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ] <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Adding a branch by going through the Tree control's dataProvider. This is<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the preferred method.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Toggling the isBranch attribute to true causes DefaultDataDescriptor.isBranch()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // to return true and the Tree treats the node as a branch.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function addEmptyBranchDP():void <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newNode:XML = &lt;item label='Middle' isBranch="true"&gt;&lt;/item&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlBound2Tree.dataProvider.addItemAt(newNode, 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // For an object graph, the key point is that the children property needs to be defined,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // even if it is empty.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // This causes isBranch() to return true and the Tree treats the new node as a branch.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function addEmptyBranchDP2():void<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newObj:Object = {label:"Middle", children:[]};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; objGraphBound2Tree.dataProvider.addItemAt(newObj, 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Adding a branch by going through the Tree control's dataDescriptor.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function addEmptyBranchDD():void<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var newNode:XML = &lt;item label='Child 4' isBranch="true"&gt;&lt;/item&gt;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlBound2Tree.dataDescriptor.addChildAt(dataX, newNode, 2, dataX);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]]&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mx:Script&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:Label text="Tree with XML data"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mx:Tree id="xmlBound2Tree" dataProvider="{dataX}" labelField="@label" showRoot="true" width="200"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:Button label="Add Empty Branch through the dataProvider" click="addEmptyBranchDP();"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mx:Button label="Add Empty Branch through the dataDescriptor" click="addEmptyBranchDD();"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:Spacer height="10"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mx:Label text="Tree with object data"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mx:Tree id="objGraphBound2Tree" dataProvider="{dataObj}" width="200"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:Button label="Add Empty Branch through the dataProvider" click="addEmptyBranchDP2();"/&gt;&nbsp;&nbsp; <br />
&lt;/mx:Application&gt; <br />
打开树到指定的节点 <br />
默认的，Tree控件在初始化后是收缩的，你也许不确定如何初始化控件时展开数，并且选定指定的节点。下边的例子，展示了如何实现它。在这个程序中，initTree()方法，在Tree控件被创建后调用。这个方法展开Tree控件的根节点，并且设置selectedIndex属性为指定节点的索引号。 <br />
&lt;?xml version="1.0"?&gt;<br />
&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" viewSourceURL="src/index.html"&gt;&nbsp;&nbsp;&nbsp; &lt;mx:Script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;![CDATA[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import flash.events.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import mx.events.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import mx.controls.*;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function initTree():void { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLTree1.expandItem(MailBox.getItemAt(0), true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XMLTree1.selectedIndex = 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]]&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/mx:Script&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;mx:Tree id="XMLTree1" width="150" height="170"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; labelField="@label" creationComplete="initTree();"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mx:XMLListCollection id="MailBox"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mx:XMLList&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;node label="Mail" data="100"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;node label="Inbox" data="70"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;node label="Personal Folder" data="10"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;node label="Business" data="2"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;node label="Demo" data="3"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;node label="Saved Mail" data="5" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/node&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;node label="Sent" data="15"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;node label="Trash" data="5"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/node&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/mx:XMLList&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/mx:XMLListCollection&gt; <br />
&lt;/mx:Tree&gt;<br />
&lt;/mx:Application&gt;<br />
读取多节点名XML文档<br />
你可以从具有多个节点名字的XML文档中组装Tree 控件。下边的例子实现了这个功能。Tree控件的数据提供者是一个XMLListCollection，它组装自一个包含folder和Pfolder元素的XMLList。Tree控件的labelField属性被设置为label属性，不管元素叫什么名字，这个属性对XMLList中的所有属性都是公共的。<br />
Example<br />
&lt;?xml version="1.0"?&gt;<br />
&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" viewSourceURL="src/index.html"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mx:Tree id="tree1" dataProvider="{MailBox}" labelField="@label" showRoot="true" width="160"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mx:XMLListCollection id="MailBox" source="{Folders}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;mx:XMLList id="Folders"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;folder label="Mail"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;folder label="INBOX"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;folder label="Personal Folder"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Pfolder label="Business" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Pfolder label="Demo" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Pfolder label="Saved Mail" /&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/folder&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;folder label="Sent" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;folder label="Trash" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/folder&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mx:XMLList&gt;&nbsp;&nbsp;&nbsp; <br />
&lt;/mx:Application&gt;<br />
当数据提供器更新时保持Tree控件打开<br />
默认地，当数据提供器更新数据时Tree控件收缩。下边的例子展示了当数据提供器更新时保持Tree控件打开的方法。<br />
在这个应用程序中，当一个用户单击Button控件时changeProvider()方法更新数据提供器。通常，这会导致Tree控件收缩。然而，Tree控件的渲染事件处理器，renderTree()方法，放置收缩的发生。当changerProvider()方法被调用，当前状态是打开的元素被保存到对象open变量中。当数据被刷新时，被命名为refreshData的Boolean类型的变量被置为true。renderTree()方法调用Tree控件的invalidateList()方法来刷新树的行。然后置refreshDate属性为false，并且重置Tree控件的打开元素属性为open对象变量，这个变量在刷新前就包含了状态是打开的元素。<br />
Example<br />
&lt;?xml version="1.0" encoding="utf-8"?&gt;<br />
&lt;mx:Application xmlns:mx="<a href="http://www.adobe.com/2006/mxml">http://www.adobe.com/2006/mxml</a>" layout="vertical" initialize="initTree()" viewSourceURL="srcview/index.html"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;mx:Script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;![CDATA[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var open:Object = new Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var refreshData:Boolean = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var switchObj:Object = new Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var firstObj:Object = new Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var firstObj1:Object = new Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var firstObj2:Object = new Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Bindable]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public var provider:String = "firstObj";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private function initTree():void</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstObj = new Object();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstObj.label = "Foods";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstObj.children = new Array();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstObj1.label = "Fruits";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstObj1.children = new Array();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstObj2.label = "Oranges";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstObj1.children[0] = firstObj2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstObj.children[0] = firstObj1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switchObj = firstObj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public function changeProvider():void<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open = SampleTree.openItems;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; refreshData = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (provider == "firstObj")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; provider = "switchObj";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleTree.dataProvider = switchObj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; provider = "firstObj";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleTree.dataProvider = firstObj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public function renderTree():void{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(refreshData){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Refresh all rows on next update.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleTree.invalidateList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; refreshData = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleTree.openItems = open;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Validate and update the properties and layout<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // of this object and redraw it, if necessary.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SampleTree.validateNow();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]]&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mx:Script&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mx:Tree id="SampleTree" render="renderTree()" width="250" dataProvider="{firstObj}" labelField="label" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;mx:Button label="Change Data Provider" click="changeProvider()"/&gt;<br />
&lt;/mx:Application&gt;</p>
<img src ="http://www.blogjava.net/qianbiguabi/aggbug/241796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2008-11-21 09:57 <a href="http://www.blogjava.net/qianbiguabi/archive/2008/11/21/241796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>as3中如何for in</title><link>http://www.blogjava.net/qianbiguabi/archive/2008/11/19/241292.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Wed, 19 Nov 2008 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2008/11/19/241292.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/241292.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2008/11/19/241292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/241292.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/241292.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 什么是反射反射 (Reflection) 是指在程序在运行时 (run-time) 获取类信息的方式. 诸如实现动态创建类实例, 方法等. 在很语言中都有相关的的实现, 如 Java 和 c# 等反射有什么用在 as3 与 as2 不同, 类实例中任何元素, 如变量 (variable), 访问器 (accessor, 即 getter / setter), 方法 (method) 都...&nbsp;&nbsp;<a href='http://www.blogjava.net/qianbiguabi/archive/2008/11/19/241292.html'>阅读全文</a><img src ="http://www.blogjava.net/qianbiguabi/aggbug/241292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2008-11-19 10:30 <a href="http://www.blogjava.net/qianbiguabi/archive/2008/11/19/241292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ibatis分页</title><link>http://www.blogjava.net/qianbiguabi/archive/2008/10/13/233998.html</link><dc:creator>LaoH</dc:creator><author>LaoH</author><pubDate>Mon, 13 Oct 2008 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/qianbiguabi/archive/2008/10/13/233998.html</guid><wfw:comment>http://www.blogjava.net/qianbiguabi/comments/233998.html</wfw:comment><comments>http://www.blogjava.net/qianbiguabi/archive/2008/10/13/233998.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/qianbiguabi/comments/commentRss/233998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qianbiguabi/services/trackbacks/233998.html</trackback:ping><description><![CDATA[在看JPetStore的代码时，发现它的分页处理主要是通过返回PaginatedList对象来完成的。如：在CatalogService类中 <br />
<br />
<br />
public PaginatedList getProductListByCategory(String categoryId) { <br />
&nbsp;&nbsp;&nbsp; return productDao.getProductListByCategory(categoryId); <br />
&nbsp; } <br />
分页是操作数据库型系统常遇到的问题。分页实现方法很多，但效率的差异就很大了。iBatis是通过什么方式来实现这个分页的了。查看它的实现部分： <br />
&nbsp; <br />
返回的PaginatedList实际上是个接口，实现这个接口的是PaginatedDataList类的对象，查看PaginatedDataList类发现，每次翻页的时候最后都会调用下面这段函数 <br />
private List getList(int idx, int localPageSize) throws SQLException { <br />
&nbsp;&nbsp;&nbsp; return sqlMapExecutor.queryForList(statementName, parameterObject, (idx) * pageSize, localPageSize); <br />
&nbsp; } <br />
由于 <br />
public interface SqlMapClient extends SqlMapExecutor, SqlMapTransactionManager {&#8230;&#8230;} <br />
所以实际的调用次序如下： <br />
SqlMapClientImpl.queryForPaginatedList-&gt;SqlMapSessionImpl.queryForPaginatedList <br />
-&gt;SqlMapExecutorDelegate.queryForPaginatedList-&gt;GeneralStatement.executeQueryForList <br />
-&gt;GeneralStatment.executeQueryWithCallback-&gt;GeneralStatment.executeQueryWithCallback <br />
-&gt;SqlExecutor.executeQuery-&gt;SqlExecutor.handleMultipleResults()-&gt;SqlExecutor.executeQuery-&gt; handleResults <br />
分页处理的函数如下 <br />
private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException { <br />
&nbsp;&nbsp;&nbsp; try { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setResultSet(rs); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultMap resultMap = request.getResultMap(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (resultMap != null) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Skip Results <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (skipResults &gt; 0) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.absolute(skipResults); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; skipResults; i++) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!rs.next()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get Results <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int resultsFetched = 0; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched &lt; maxResults) &amp;&amp; rs.next()) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] columnValues = resultMap.resolveSubMap(request, rs).getResults(request, rs); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; callback.handleResultObject(request, columnValues, rs); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resultsFetched++; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } finally { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setResultSet(null); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp; } <br />
由此可见，iBatis的分页主要依赖于jdbcdriver的如何实现以及是否支持rs.absolute(skipResults)。它并不是一个好的分页方式。它先要取出所有的符合条件的记录存入ResultSet对象，然后用absolute方法进行定位，来实现分页。当记录数较大（比如十万条）时，整体的查询速度将会变得很慢。 <br />
所以分页还是要考虑采用直接操作sql语句来完成。当然小批量的可以采用iBatis的分页模式。一般分页的sql语句与数据库的具体实现有关 <br />
mysql: <br />
select * from A limit startRow,endRow <br />
oracle: <br />
select b.* from (select a.*,rownum as linenum from (select * from A) a where rownum &lt;= endRow) b where linenum &gt;= startRow <br />
Hibernate的Oracle分页采用的就是是拼凑RowNum的Sql语句来完成的。参考代码如下： <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String createOraclePagingSql(String sql, int pageIndex, int pageSize){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int m = pageIndex * pageSize; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n = m + pageSize; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "select * from ( select row_.*, rownum rownum_ from ( " + sql <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + " ) row_ where rownum &lt;= " + n&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + ") where rownum_ &gt; " + m; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } 综上，小批量（&lt;2w）可以采用ibatis自带的分页类，大批量的还是直接操纵sql，当然也可以将这些sql自己进行封装，或在包中封装都可以。包封装的示例代码如下： <br />
一个封装了分页功能的Oracle Package <br />
create or replace package body FMW_FY_HELPER is <br />
PROCEDURE GET_DATA(pi_sql in varchar,pi_whichpage in integer,pi_rownum in integer, <br />
po_cur_data out cur_DATA,po_allrownum out integer,pio_succeed in out integer) <br />
as <br />
v_cur_data cur_DATA; <br />
v_cur_temp cur_TEMP; <br />
v_temp integer; <br />
v_sql varchar(5000); <br />
v_temp1 integer; <br />
v_temp2 integer; <br />
begin <br />
pio_succeed := 1; <br />
v_sql := 'select count(''a'') from ( ' || pi_sql || ')'; <br />
execute immediate v_sql into v_temp; <br />
<br />
po_allrownum:=ceil(v_temp/pi_rownum); <br />
<br />
v_sql := ''; <br />
v_temp :=pi_whichpage*pi_rownum + 1; <br />
v_temp1:=(pi_whichpage-1)*pi_rownum + 1; <br />
v_temp2:=pi_whichpage*pi_rownum; <br />
v_sql:= 'select * from (select rownum as rn,t.* from (' || pi_sql ||') t where rownum&lt;' || to_char(v_temp) || ')&nbsp; where rn between ' || to_char(v_temp1) || ' and ' || to_char(v_temp2); <br />
open v_cur_data for v_sql; <br />
if v_cur_data %notfound <br />
then <br />
pio_succeed:=-1; <br />
return; <br />
end if; <br />
po_cur_DATA := v_cur_data; <br />
end; 
<img src ="http://www.blogjava.net/qianbiguabi/aggbug/233998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qianbiguabi/" target="_blank">LaoH</a> 2008-10-13 14:02 <a href="http://www.blogjava.net/qianbiguabi/archive/2008/10/13/233998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>