<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[专注于Flash RIA与网络游戏开发]]></title>
<link>http://www.sujun.org/</link>
<description><![CDATA[弃天笑的小窝]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[sujun10@21cn.com(弃天笑)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>专注于Flash RIA与网络游戏开发</title> 
	<url>http://www.sujun.org/images/logos.gif</url> 
	<link>http://www.sujun.org/</link> 
	<description>专注于Flash RIA与网络游戏开发</description> 
</image>

			<item>
			<link>http://www.sujun.org/default.asp?id=52</link>
			<title><![CDATA[[AS3]Class小技巧：程序自动让对象向下转换]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[ActionScript]]></category>
			<pubDate>Sat,07 Aug 2010 18:05:47 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=52</guid>	
		<description><![CDATA[这个是一个比较方便的技巧，在实现一些自动化框架的编码中，可能会比较常用到。就是通过框架传递过来的参数，一般都是传递对象的接口或者父类，然后再传到对应的方法中，再采用强制性转换之后，再使用。<br/>例如我个人写网络通讯框架中，所有接受的数据都实现了IRead接口，所以回调函数接受的参数是IRead接口，我为了减少强制转换的麻烦，就在网络底层写了个自动强制向IRead的不同实现类作类型转换。这样在不同的接收方法那里可以声明自己想要的实际参数对象啦~<br/>下面是简单的代码例子<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>/**<br/>&nbsp;*&nbsp;@UseAsClass.as<br/>&nbsp;*&nbsp;<br/>&nbsp;*&nbsp;@author&nbsp;sodaChen&nbsp;mail:sujun10@21cn.com<br/>&nbsp;*&nbsp;@version&nbsp;1.0<br/>&nbsp;*&nbsp;&lt;br&gt;Copyright&nbsp;(C),&nbsp;2010&nbsp;asFrame.com<br/>&nbsp;*&nbsp;&lt;br&gt;This&nbsp;program&nbsp;is&nbsp;protected&nbsp;by&nbsp;copyright&nbsp;laws.<br/>&nbsp;*&nbsp;&lt;br&gt;Program&nbsp;Name:AsFrame<br/>&nbsp;*&nbsp;&lt;br&gt;Date:2010-8-7<br/>&nbsp;*/<br/>package<br/>{<br/>&#160;&#160;&#160;&#160;import&nbsp;flash.display.MovieClip;<br/>&#160;&#160;&#160;&#160;import&nbsp;flash.display.Sprite;<br/>&#160;&#160;&#160;&#160;import&nbsp;flash.utils.getDefinitionByName;<br/>&#160;&#160;&#160;&#160;import&nbsp;flash.utils.getQualifiedClassName;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;/**<br/>&#160;&#160;&#160;&#160;&nbsp;*&nbsp;AS中的Class类的妙用<br/>&#160;&#160;&#160;&#160;&nbsp;*&nbsp;@author&nbsp;sodaChen<br/>&#160;&#160;&#160;&#160;&nbsp;*&nbsp;@Date:2010-8-7<br/>&#160;&#160;&#160;&#160;&nbsp;*/<br/>&#160;&#160;&#160;&#160;public&nbsp;class&nbsp;UseAsClass&nbsp;extends&nbsp;Sprite<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public&nbsp;function&nbsp;UseAsClass()<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;super();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//声明一个mc实例<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;sprite:Sprite&nbsp;=&nbsp;new&nbsp;MovieClip();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//调用setSprite方法,直接把sprite传递进去,因为MovieClip是Sprite的子类<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setSprite(sprite);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//接下来调用setMovie,这是直接传递sprite编译器是会出错的，因为声明类型的时候，是以mc的父类Sprite声明<br/>//&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setMovie(sprite);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//所以这里必须强制转换成mc<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setMovie(MovieClip(sprite));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//这里有个问题，如果编写一个通过框架，或者在特殊情况下，不能程序员手工编写类型转换的情况下，<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//需要程序自动进行类型转换该怎么实呢？这里就采用到了Class对象的小技巧了就可以实现了<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;classPath:String&nbsp;=&nbsp;getQualifiedClassName(sprite);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;mcClass:Class&nbsp;=&nbsp;getDefinitionByName(classPath)&nbsp;as&nbsp;Class;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;setAutoMovie(mcClass(sprite));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//接受Sprite参数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public&nbsp;function&nbsp;setSprite(sprite:Sprite):void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;直接传递父类对象&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//接受MovieClip的参数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public&nbsp;function&nbsp;setMovie(movie:MovieClip):void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;程序手工编码向下转换类型&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//接受MovieClip的参数<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public&nbsp;function&nbsp;setAutoMovie(movie:MovieClip):void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;程序自动向下转换类型!&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/>}<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=51</link>
			<title><![CDATA[Flash Socket的基本通讯协议流程例子]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[ActionScript]]></category>
			<pubDate>Sun,25 Jul 2010 16:20:52 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=51</guid>	
		<description><![CDATA[如蒙转载，请注明文章出处：www.sujun.org&nbsp;&nbsp;&nbsp;作者：弃天笑<br/><br/>这个例子是7月24日&nbsp;•&nbsp;广州&nbsp;•&nbsp;东方国际饭店的Flash技术交流会演讲那天的例子，现在传到blog上，让有需要的人去下载。不过后来发现大家比较感兴趣的，不是具体的通讯协议，而且一些关于通讯的各种技术解决问题。呵呵。希望有继续可以和大家继续交流。大家共同前进。而我自己以后也会陆续贴出自己工作上遇到的问题（例如我自己现在webgame服务器方面的）<br/><br/>不过这篇例子是比较简单的通讯协议了，客户端和服务端都是采用最基础的一个一个数据地发送，也是一个一个地接受(采用&nbsp;len&nbsp;+&nbsp;cmd&nbsp;+&nbsp;body)的方式。之后也会推出增加AMF3，以及自动解析的一些例子啦。<br/>例子运行图片<br/><img src="http://www.sujun.org/attachments/month_1007/j201072516183.jpg" border="0" alt=""/><br/>下面是贴一下简单的代码<br/>Flash端发送登陆数据<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接成功,进行发送数据<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;byteArray:ByteArray&nbsp;=&nbsp;new&nbsp;ByteArray();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//登陆消息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;byteArray.writeShort(LOGIN);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;byteArray.writeUTF(userName);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;socket.writeShort(byteArray.length);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;socket.writeBytes(byteArray);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;socket.flush();<br/></div></div><br/>接下来是java端对应的接受数据<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读出开头长度的short（2个字节）<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;len&nbsp;=&nbsp;input.readShort();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//读出len之后，接着是读取short类型的cmd（2个字节）<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;short&nbsp;cmd&nbsp;=&nbsp;input.readShort();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取用户名<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&nbsp;userName&nbsp;=&nbsp;input.readUTF();<br/></div></div><br/>其他具体的就不说了，看例子。当然还是会有很多其他的问题，例如怎么做整体的网络通讯框架，如何提高开发效率和性能，等等很多问题。不过这些都是可以一一解决的，希望大家可以深入了解，一起进步<br/><br/>最后，是下载整个例子的客户端和服务端的源码<br/><img src="http://www.sujun.org/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.sujun.org/attachments/month_1007/d2010725161553.rar" target="_blank">点击下载此文件</a><br/><br/>ppt文件(ppt很简陋，主要的东西，都是在demo了，研究代码就可以啦:)<br/><img src="http://www.sujun.org/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.sujun.org/attachments/month_1007/p2010725163844.rar" target="_blank">点击下载此文件</a><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=50</link>
			<title><![CDATA[GuiBuilder拖放组件问题]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[AsWing]]></category>
			<pubDate>Thu,03 Jun 2010 11:18:11 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=50</guid>	
		<description><![CDATA[由于受到以前用GuiBuilder的影响，那时用的时候是新建一个内容之后，添加组件之后可以直接拖动的。<br/>现在装了之后也受了这个影响，结果发现完全拖不动。<br/><br/>在电脑里胡乱搞了一阵，才想起。容器有个布局的设计。（这里是以JPanel为容器）<br/><br/>现在GuiBuilder默认是BorderLayout<br/><img src="http://www.sujun.org/attachments/month_1006/0201063111852.jpg" border="0" alt=""/><br/>所以，把布局修改为EmptyLayout就可以自由拖动组件啦<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=49</link>
			<title><![CDATA[我公司招Java和Flash程序员]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[Blog信息]]></category>
			<pubDate>Wed,05 May 2010 00:39:24 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=49</guid>	
		<description><![CDATA[名游网络，位于广州软件园区，天河工业园内。致力于互联网络娱乐形式的内容研发，包括网页游戏、网络游戏等。期望以严谨务实的精神、创新和体贴入微的设计，赢得玩家的认可，给玩家提供优秀的娱乐休闲服务内容。公司也着力于营造上进、学习、和谐的内部企业氛围，以及良好的办公环境，让每位人员随公司的发展一起前进。(公司原版的招聘信息开头)<br/><br/>其他我就长话短说啦，主要是开发flash的webgame，学的和用的东西非常多。有兴趣的童鞋可以联系我.<br/>发简历到我的邮箱是:soda.chen@mingyoo.com<br/>薪水范围：2000&nbsp;-&nbsp;5000<br/>Flash客户端初级程序员2名<br/>1.了解并且熟悉Flash或者Flex，有做过相关的编程即可<br/>2.接受新手，刚毕业生和java程序员，只要你有潜力和心，都可以以试<br/>3.了解面向对象，以及一些基本的设计模式，同时熟悉Flash和Java者更佳<br/><br/><br/>服务端的Java程序员1名<br/>1.熟悉Java编程，熟悉数据库相关编程<br/>2.最好是能够1年以上的J2EE或者游戏编程经验。开发过较多的项目<br/>3.也接受熟悉java的新手，要求会比较严格，有比较大挑战<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=48</link>
			<title><![CDATA[发一下招聘信息]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[Blog信息]]></category>
			<pubDate>Thu,29 Apr 2010 23:54:25 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=48</guid>	
		<description><![CDATA[帮朋友发发信息，有兴趣的可以去了解一下<br/><br/>1.招聘php程序员<br/>高薪聘请网站架构师，php技术底，对前端和后台有较全面的技术能力、尤其是大型网站架构和负载有经验的。<br/>同时还招聘ajax前端开发人员以及PHP开发工程师，都是要有经验，能即时承担规范开发流程工作的<br/>邮箱是lawrence_x@126.com<br/>地点是：广州海珠区<br/><br/>2.webGame&nbsp;的Flash主程。服务端主程<br/>很有背景，有实力的公司的项目哦，新开的，有兴趣的可以去了解一下<br/>QQ:110448938<br/>QQ邮箱：110448938@qq.com<br/>地点：龙口东<br/><br/>3.Flash，c++程序员<br/>AS3程序员.还有会C/C++的，急要，都是一年经验就够了<br/>联系邮箱：peifengcai@gmail.com<br/><br/>4.应聘<br/>呵呵，是个高手来的，朋友推荐的<br/>可以到下面的地址了解了解<br/><a href="http://www.linuxzh.org/jobs.html" target="_blank">http://www.linuxzh.org/jobs.html</a><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=47</link>
			<title><![CDATA[[感悟]不止技术了]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[Blog信息]]></category>
			<pubDate>Sun,07 Mar 2010 23:40:40 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=47</guid>	
		<description><![CDATA[很长一段时间没写过blog，可能是因为自己懒，又或者是因为很忙...<br/>不过去年下半年也确实很忙。不过现在更忙，因为mmorpg项目终于上线公测了.<br/>现在公司也熬过了最艰难的时期了，项目做出来了，也有了稳定架构可以持续地开发。而且最主要的事，又有一大笔投资注入到公司（记得去年年底的时候还好险，预算只到今年年初，那时候大家是拼了命，加班熬夜做项目，修改每一个需要注意的时候，甚至为了一个效果，只因为要吸引投资商的注意，当时也走了不少弯路以及一些无用功）。<br/>在公司强有力的美术表现之下，我相信这个项目会有更好的发展.<br/>随着公司的开发团队人员的增多了，我负责的大部分东西也慢慢地有其他人接手，解放我这个劳动力，可以去做一些更深层的东西以及做一些重构和优化等等。（前期人少，我是负责架构兼主力开发人员之一，这个时候的主程也算是主力开发人员：（&nbsp;&nbsp;）<br/><br/>我想我接着可以写下很多东西了，rpg，横版，格斗？游戏架构？资源管理？网络交互？性能优化？图形处理？等等<br/>我想会有很多很多，但是我想我改变最大的，应该不是主要关于技术方面的，更是其他方面，例如各部门合作，问题的产生和解决...只一年以来的积累和学习，让我成长了不少。<br/>我想的blog也会改变文风，会出现我个人的一些观点的罗嗦啦<br/><br/>嗷嗷~我要加油！记录自己的点滴<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=46</link>
			<title><![CDATA[Cinnamon基于AS3项目的例子]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[Flash/Flex框架]]></category>
			<pubDate>Sun,22 Mar 2009 07:47:55 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=46</guid>	
		<description><![CDATA[有些朋友会说Cinnamon的测试例子有点难搭起，过程遇到的问题比较多。所以在我就放上一个基于AS3项目工程的例子，过一阵再把后台基于Spring的例子放出来。<br/>大家做例子前，建议先仔细看看官方的说明，非常详细。我也是看它做的，这里我就简单说了<br/>现在先简单说说，基本上，客户端的remoting服务类，是采用ant根据服务端的接口生成的。下面是配置文件<br/><img src="http://www.sujun.org/attachments/month_0903/t200932273428.jpg" border="0" alt=""/><br/>现在我的服务器有一个接口CounterService和他的实现类CounterServiceImpl<br/>那么根据这个配置文件则会生成同样的as：CounterService.as和CounterServiceImpl.as<br/>（要注意一点的是，需要把generatorTemplates目录复制到项目里面，或者自己去配置路径，增加了模板才能够生成客户端文件的）<br/>CounterServiceImpl.java比较简单<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>package&nbsp;example;<br/><br/>public&nbsp;class&nbsp;CounterServiceImpl&nbsp;implements&nbsp;CounterService<br/>{<br/>&#160;&#160;&#160;&#160;private&nbsp;int&nbsp;counter&nbsp;=&nbsp;0;<br/>&#160;&#160;&#160;&#160;public&nbsp;int&nbsp;getNextValue&nbsp;()&nbsp;<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(&#34;调用了getNextValue方法&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&nbsp;++counter;<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;public&nbsp;void&nbsp;reset&nbsp;()&nbsp;<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(&#34;清楚原有数据eset&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;counter&nbsp;=&nbsp;0;<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;public&nbsp;TestVo&nbsp;sendVo(TestVo&nbsp;vo)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vo.setName(&#34;服务器返回:&#34;&nbsp;+&nbsp;vo.getName());<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;vo.setName(&#34;服务器返回:&#34;&nbsp;+&nbsp;vo.getPath());<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&nbsp;vo;<br/>&#160;&#160;&#160;&#160;}<br/>}<br/><br/></div></div><br/>客户端使用就比较简单了，建立一个ServiceInitializer来初始化services<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>public&nbsp;function&nbsp;cr&#101;ateService&nbsp;(url:String,&nbsp;errorHandler:Function)&nbsp;:&nbsp;CounterService&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;channel:ServiceChannel&nbsp;=&nbsp;new&nbsp;NetConnectionServiceChannel();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel.serviceUrl&nbsp;=&nbsp;url;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel.timeout&nbsp;=&nbsp;5000;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//实例化一个网络服务器，如果有多种服务，就需要实例多个<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;counter:CounterService&nbsp;=&nbsp;new&nbsp;CounterServiceImpl();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里是的服务名称是和要服务器对应的<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel.cr&#101;ateProxy(&#34;counter&#34;,&nbsp;counter);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;channel.addEventListener(ServiceEvent.ERROR,&nbsp;errorHandler);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;counter;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/></div></div><br/>再来就是主类调用了<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>package&nbsp;{<br/>&#160;&#160;&#160;&#160;import&nbsp;example.CounterService;<br/>&#160;&#160;&#160;&#160;import&nbsp;example.ServiceInitializer;<br/>&#160;&#160;&#160;&#160;import&nbsp;example.TestVo;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;import&nbsp;flash.display.Sprite;<br/>&#160;&#160;&#160;&#160;import&nbsp;flash.net.registerClassAlias;<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;import&nbsp;o&#114;g.spicefactory.cinnamon.client.ErrorMessage;<br/>&#160;&#160;&#160;&#160;import&nbsp;o&#114;g.spicefactory.cinnamon.client.ServiceEvent;<br/><br/>&#160;&#160;&#160;&#160;/**<br/>&#160;&#160;&#160;&#160;&nbsp;*&nbsp;基于as项目测试Cinnamon&nbsp;<br/>&#160;&#160;&#160;&#160;&nbsp;*&nbsp;@author&nbsp;Soda.Chen<br/>&#160;&#160;&#160;&#160;&nbsp;*&nbsp;@link&nbsp;www.sodaChen.com<br/>&#160;&#160;&#160;&#160;&nbsp;*&nbsp;<br/>&#160;&#160;&#160;&#160;&nbsp;*/&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;public&nbsp;class&nbsp;Cinnamon&nbsp;extends&nbsp;Sprite<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private&nbsp;var&nbsp;service:CounterService;<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public&nbsp;function&nbsp;Cinnamon()<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;registerClassAlias(&#34;model::TestVo&#34;,TestVo);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;si:ServiceInitializer&nbsp;=&nbsp;new&nbsp;ServiceInitializer();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;url:String&nbsp;=&nbsp;&#34;<a href="http://localhost:8080/Cinnamon/service/" target="_blank">http://localhost:8080/Cinnamon/service/</a>&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service&nbsp;=&nbsp;si.cr&#101;ateService(url,&nbsp;errorHandler);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//测试服务器的getNextValue方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.getNextValue().addResultHandler(onNextValue);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送一个VO到服务器<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;vo:TestVo&nbsp;=&nbsp;new&nbsp;TestVo();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vo.name&nbsp;=&nbsp;&#34;soda&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vo.path&nbsp;=&nbsp;&#34;www.sodaChen.com&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service.sendVo(vo).addResultHandler(onSendVo);<br/><br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private&nbsp;function&nbsp;onSendVo(vo:TestVo):void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;vo.name:&#34;&nbsp;+&nbsp;vo.name);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;vo.name:&#34;&nbsp;+&nbsp;vo.path);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private&nbsp;function&nbsp;onNextValue&nbsp;(nextValue:uint)&nbsp;:&nbsp;void&nbsp;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trace(&#34;-------nextValue------:&#34;&nbsp;+&nbsp;nextValue);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private&nbsp;function&nbsp;errorHandler&nbsp;(event:ServiceEvent)&nbsp;:&nbsp;void&nbsp;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;error:ErrorMessage&nbsp;=&nbsp;event.response.result&nbsp;as&nbsp;ErrorMessage;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trace(&#34;-----ERROR----:&#34;&nbsp;+&nbsp;error.message);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/></div></div><br/>最后输出结果是:<br/>-------nextValue------:1<br/>vo.name:服务器返回:www.sodaChen.com<br/>vo.name:www.sodaChen.com<br/><br/>最后奉上客户端和服务端的源代码。把服务端的web放到tomcat目录下，再启动客户端工程连接，就OK啦<br/>（包含了jar，所以文件比较打，有5.2MB）<br/><img src="http://www.sujun.org/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.sujun.org/attachments/month_0903/v200932274743.rar" target="_blank">点击下载此文件</a><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=45</link>
			<title><![CDATA[cinnamon请求服务错误]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[出错解决档案]]></category>
			<pubDate>Sun,22 Mar 2009 07:14:27 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=45</guid>	
		<description><![CDATA[测试了一下以前写的cinnamon例子，修改了一下配置文件。突然发现例子连接不上服务器了。<br/>突然如下的提示<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>-----ERROR----:Unknown&nbsp;service:&nbsp;counter&nbsp;-&nbsp;request&nbsp;info:&nbsp;Request<br/>&nbsp;service&nbsp;name&nbsp;=&nbsp;counter<br/>&nbsp;operation&nbsp;name&nbsp;=&nbsp;getNextValue<br/>&nbsp;parameter&nbsp;types&nbsp;=&nbsp;[]<br/></div></div><br/>很明显是找不到网络服务器<br/><br/>这里也指出了&nbsp;&nbsp;service&nbsp;name&nbsp;=&nbsp;counter<br/><br/>看了一下配置文件，原来是这样配置的<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&lt;service&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#34;CounterService&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory-ref=&#34;pojo&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service-interface=&#34;example.CounterService&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service-implementation=&#34;example.CounterServiceImpl&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope=&#34;session&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&gt;<br/></div></div><br/>发现服务名是CounterService<br/>修改回counter，正常连接<br/>回头把测试代码放上]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=44</link>
			<title><![CDATA[[Flex]类似Google搜索提示的两种做法]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[Flex]]></category>
			<pubDate>Sat,28 Feb 2009 23:11:08 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=44</guid>	
		<description><![CDATA[做了个简单的搜索提示程序，类似google之类的搜索提示，就是输入一个内容时，会把开头对得上的内容显示出来。下面可以测试看看：<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/flash.gif" alt="" style="margin:0px 2px -3px 0px" border="0"/>Flash动画</div><div class="UBBContent"><a id="temp50776_href" href="http://www.sujun.org/javascript:MediaShow('swf','temp50776','attachments/month_0902/r200922822575.swf','400','300')"><img name="temp50776_img" src="http://www.sujun.org/images/mm_snd.gif" style="margin:0px 3px -2px 0px" border="0" alt=""/><span id="temp50776_text">在线播放</span></a><div id="temp50776"></div></div></div><br/>呵呵，这里没有显示有多少条结果，当然也要做到统计也是可以的。这里只做简单的显示。<br/>下面就说说两种做法。<br/>第一种，是在用户输入提示信息的时候，把用户输入的信息跟应用中存的数据进行比较，找出匹配的数据，然后&nbsp;在list组件里显示出来<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输入文本内容变化事件<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private&nbsp;function&nbsp;inputChangeEvent():void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//每次输入文字变化，都检索一下，查看数据是否变化<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(currMsg&nbsp;!=&nbsp;searchText.text)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;currMsg&nbsp;=&nbsp;searchText.text;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;seachData:ArrayCollection&nbsp;=&nbsp;new&nbsp;ArrayCollection();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(currMsg&nbsp;!=&nbsp;&#34;&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//在这里分析所有的内容，找出符合的内容<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(var&nbsp;i:int&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;source.length;&nbsp;i++)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//逐个检索,是否具有输入的内容，有则存放进去<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(source[i].label.indexOf(currMsg)&nbsp;==&nbsp;0)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;seachData.addItem(source[i]);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//显示是否有相关的搜索相关信息,如果没有就显示默认信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(seachData.length&nbsp;==&nbsp;0)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;seachData&nbsp;=&nbsp;defaultData;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//显示出与搜索相关的信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;searchMsgList.visible&nbsp;=&nbsp;true;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;searchMsgList.dataProvider&nbsp;=&nbsp;seachData;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/></div></div><br/>恩，该函数是当输入文本框的内容有变化时触发的。代码的注释已经相当清晰了<br/><br/>接下来看另外一种处理发方法。其实大体的都差不多，这里只是对数据源刚传进来的时候，就马上对数据进行分析，归类，逐个分析，把具有相同内容的数据存放在一个数组里，最后把这些数据都和搜索内容捆绑，存放到一个集合里。所以当用户录入信息时，直接根据输入内容那分类好的数组就可以了<br/>下面是传输数据源时的代码<br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.sujun.org/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;*&nbsp;设置需要搜索的内容<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;*&nbsp;@param:内容数组<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;*/&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public&nbsp;function&nbsp;setSearchDatas(source:Array):void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//这里是数据一传递进来，就开始做分析<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//对这里里面的所有数据进行检索分类，以方便输入查询<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(var&nbsp;i:int&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;source.length;&nbsp;i++)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;key:String&nbsp;=&nbsp;source[i].label;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//对字符串长度进行检索,并且分析，对每一个字符组合都存放起来<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(var&nbsp;j:int&nbsp;=&nbsp;1;&nbsp;j&nbsp;&lt;=&nbsp;key.length;&nbsp;j++)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;str:String&nbsp;=&nbsp;key.substring(0,j);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//从存放有相同标题的集合中取出来<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;strAry:ArrayCollection&nbsp;=&nbsp;searchMap[str]&nbsp;as&nbsp;ArrayCollection;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(strAry&nbsp;==&nbsp;null)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;strAry&nbsp;=&nbsp;new&nbsp;ArrayCollection();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;searchMap[str]&nbsp;=&nbsp;strAry;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//存放完整的对象<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;strAry.addItem(source[i]);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>/code]<br/>然后下面是用户输入信息有变化时的相应函数<br/>[code]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输入文本内容变化事件<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;private&nbsp;function&nbsp;inputChangeEvent():void<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//每次输入文字变化，都检索一下，查看数据是否变化<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(currMsg&nbsp;!=&nbsp;searchText.text&nbsp;&amp;&amp;&nbsp;currMsg&nbsp;!=&nbsp;&#34;&#34;)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;currMsg&nbsp;=&nbsp;searchText.text;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//显示是否有相关的搜索相关信息,如果没有就显示默认信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;var&nbsp;strAry:ArrayCollection&nbsp;=&nbsp;searchMap[currMsg]&nbsp;as&nbsp;ArrayCollection;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(strAry&nbsp;==&nbsp;null)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;strAry&nbsp;=&nbsp;defaultData;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//显示出与搜索相关的信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;searchMsgList.visible&nbsp;=&nbsp;true;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;searchMsgList.dataProvider&nbsp;=&nbsp;strAry;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/></div></div><br/><br/>最后总结一下，如果少量数据的话，应该都没什么区别。但是，如果有大量数据时，区别就来了。<br/>第一方法比较简单，消耗的内存比较少，但是因为是即时分析数据源，所以搜索出来可能会稍微慢点。<br/>第二种的话，因为实现已经分析好了，可以根据用户输入的内容马上从哈希表里取出对应数据。所以取数据反应会非常快。但是占用内存可能会多点（因为要根据每个字符串组合进行存放，不过其实也是增加多一些字符串，对象只是引用而已）。<br/>同时还做一些细的优化，例如限制长度等等，至于怎么用，根据爱好了。如果数据量大的话，个人偏向第二种。这里的两种算法其实跟具体的CS3或者flex组件不相关的，只是用list来显示而已。<br/>呵呵，当然如果你有更好的想法，欢迎讨论。<br/><br/>源文件：<br/><img src="http://www.sujun.org/images/download.gif" alt="下载文件" style="margin:0px 2px -4px 0px"/> <a href="http://www.sujun.org/attachments/month_0902/12009228232018.rar" target="_blank">点击下载此文件</a><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=43</link>
			<title><![CDATA[[Java]Hibernate保存或者更新VO遇到same identifier value问题]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[出错解决档案]]></category>
			<pubDate>Tue,17 Feb 2009 22:28:22 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=43</guid>	
		<description><![CDATA[最近在使用到了hibernate更新一个VO遇到了这个问题<br/>a&nbsp;different&nbsp;object&nbsp;with&nbsp;the&nbsp;same&nbsp;identifier&nbsp;value&nbsp;was&nbsp;already&nbsp;associated&nbsp;with&nbsp;the&nbsp;session<br/>当<br/>session.up&#100;ate(vo);<br/>就提示上面的错误。是Nhibernate里头，在同一个Session里，数据库的一条记录，只能对应一个引用。如果程序中有其他的对象（这个对象不是由这个Session&nbsp;从数据库取得的，叫脱管实体，和Session中某一对象的数据库标识符相同）由这个Session保存。就会报这个错，目的在于保证不出现不一致读的问题。<br/><br/>仔细想了一下也是，因为数据是从Flex客户端传过去的，我是修改用户数据，之前用这个用户数据登陆了。<br/>知道了问题所在，只要清楚掉session的一些数据就没问题了<br/>session.clear();<br/>使用了这个方法后再更新数据，成功解决问题。<br/><br/>后来再网上搜索一下，发现很多人也提出了问题。下面是一个人的总结<br/><a target="_blank" href="http://blog.csdn.net/piggerman/archive/2008/08/21/2804556.aspx">http://blog.csdn.net/piggerman/archive/2008/08/21/2804556.aspx</a><br/><br/>最后他所的几种方法：<br/>Hibernate&nbsp;疑难异常及处理<br/><br/>1、a&nbsp;different&nbsp;object&nbsp;with&nbsp;the&nbsp;same&nbsp;identifier&nbsp;value&nbsp;was&nbsp;already&nbsp;associated&nbsp;with&nbsp;the&nbsp;session。<br/><br/>　　错误原因：在hibernate中同一个session里面有了两个相同标识但是是不同实体。<br/><br/>　　解决方法一：session.clean()<br/><br/>　　PS：如果在clean操作后面又进行了saveOrUp&#100;ate(object)等改变数据状态的操作，有可能会报出&#34;Found&nbsp;two&nbsp;representations&nbsp;of&nbsp;same&nbsp;collection&#34;异常。<br/><br/>　　解决方法二：session.refresh(object)<br/><br/>　　PS：当object不是数据库中已有数据的对象的时候，不能使用session.refresh(object)因为该方法是从hibernate的&nbsp;session中去重新取object，如果session中没有这个对象，则会报错所以当你使用saveOrUp&#100;ate(object)之前还需要判断一下。<br/><br/>　　解决方法三：session.merge(object)<br/><br/>　　PS：Hibernate里面自带的方法，推荐使用。<br/><br/>2、Found&nbsp;two&nbsp;representations&nbsp;of&nbsp;same&nbsp;collection<br/><br/>　　错误原因：见1。<br/><br/>　　解决方法：session.merge(object)<br/><br/>以上两中异常经常出现在一对多映射和多对多映射中<br/>]]></description>
		</item>
		
</channel>
</rss>