<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[专注于Flash RIA与网络游戏开发 - Flash/Flex框架]]></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=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=41</link>
			<title><![CDATA[在Cinnamon传输自定义的对象（VO/Bean）]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[Flash/Flex框架]]></category>
			<pubDate>Sun,28 Dec 2008 21:40:36 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=41</guid>	
		<description><![CDATA[在使用Cinnamon中传输自定义对象的话，是需要另外配置cinnamon-config.xml文件的。（注意，本文所说的配置不是基于spring的，cinnamon-config.xml的配置文件有两种配置方式，一种是基于spring，另外一种就是基本它本身的解析程序了）<br/>我当初用的时候，也是一时大意，以为它是像Adobe的Remoting一样，直接在VO的名字是上面用[RemoteClass(alias=&#34;soda.SodaVo)]一样绑定，或者采用registerClassAlias(&#34;soda.SodaVo&#34;,SodaVo);<br/>这样的注册方式，只要服务器有对应的soda.SodaVo就可以解析出来。<br/>事实上，Cinnamon传输自定义的VO，需要额外的配置，查看了他的文档，才知道class&nbsp;Mapping。下面是他的配置信息:<br/>&nbsp;&lt;bean-mapping&nbsp;alias=&#34;model::SodaVo&#34;&nbsp;java-class=&#34;soda.SodaVo&#34;&nbsp;/&gt;<br/>然后在客户端这样对应：<br/>[RemoteClass(alias=&#34;model::SodaVo)]<br/>或者<br/>registerClassAlias(&#34;model::SodaVo&#34;,SodaVo);<br/>就可以了<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.sujun.org/default.asp?id=40</link>
			<title><![CDATA[[AS3]开源的Remoting框架：Cinnamon]]></title>
			<author>sujun10@21cn.com(弃天笑)</author>
			<category><![CDATA[Flash/Flex框架]]></category>
			<pubDate>Sun,28 Dec 2008 19:43:53 +0800</pubDate>
			<guid>http://www.sujun.org/default.asp?id=40</guid>	
		<description><![CDATA[目前在做一个后台管理系统的项目中，因为不想使用Adobe自带的remoting组件，所以采用了Cinnamon这个开源的项目。<br/>Cinnamon是<a target="_blank" href="http://www.spicefactory.org/">http://www.spicefactory.org/</a>中的一个基于flash&nbsp;remoting技术的开源框架（具体想要了解的人可以到网站去了解<a target="_blank" href="http://www.spicefactory.org/cinnamon/">http://www.spicefactory.org/cinnamon/</a>，一进去就有它的详细介绍：Full&nbsp;support&nbsp;for&nbsp;AMF3）：下面是官方介绍，我就不翻译啦<br/>Cinnamon&nbsp;is&nbsp;a&nbsp;remoting&nbsp;framework&nbsp;based&nbsp;on&nbsp;the&nbsp;AMF3&nbsp;protocol&nbsp;connecting&nbsp;clients&nbsp;written&nbsp;in&nbsp;AS3&nbsp;with&nbsp;Java&nbsp;EE&nbsp;server&nbsp;applications.&nbsp;It&nbsp;can&nbsp;be&nbsp;deployed&nbsp;in&nbsp;every&nbsp;servlet&nbsp;container&nbsp;o&#114;&nbsp;Java&nbsp;EE&nbsp;application&nbsp;server.&nbsp;It&nbsp;contains&nbsp;the&nbsp;following&nbsp;features:<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;Full&nbsp;support&nbsp;for&nbsp;AMF3.<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Comes&nbsp;with&nbsp;its&nbsp;own&nbsp;Client&nbsp;API&nbsp;and&nbsp;does&nbsp;not&nbsp;build&nbsp;on&nbsp;top&nbsp;of&nbsp;the&nbsp;RemoteObject&nbsp;API&nbsp;of&nbsp;Flex,&nbsp;so&nbsp;it&nbsp;can&nbsp;be&nbsp;used&nbsp;with&nbsp;o&#114;&nbsp;without&nbsp;Flex.<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Client&nbsp;Proxies&nbsp;of&nbsp;remote&nbsp;services&nbsp;implement&nbsp;business&nbsp;interfaces&nbsp;so&nbsp;you&nbsp;don&#39;t&nbsp;lose&nbsp;type&nbsp;safetey&nbsp;for&nbsp;remote&nbsp;method&nbsp;invocations&nbsp;like&nbsp;with&nbsp;RemoteObject.<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Flexible&nbsp;server&nbsp;configuration:&nbsp;XML,&nbsp;annotations,&nbsp;custom&nbsp;Spring&nbsp;configuration&nbsp;namespace,&nbsp;programmatic&nbsp;configuration.<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Many&nbsp;options&nbsp;how&nbsp;to&nbsp;map&nbsp;ActionScript&nbsp;classes&nbsp;to&nbsp;Java&nbsp;classes.<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Extensible&nbsp;automatic&nbsp;type&nbsp;conversion&nbsp;for&nbsp;method&nbsp;parameters&nbsp;and&nbsp;bean&nbsp;properties.<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Currently&nbsp;supports&nbsp;Spring&nbsp;Beans&nbsp;and&nbsp;plain&nbsp;Java&nbsp;classes&nbsp;as&nbsp;services.<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Automatic&nbsp;source&nbsp;generation&nbsp;of&nbsp;AS3&nbsp;service&nbsp;interfaces&nbsp;and&nbsp;proxies&nbsp;with&nbsp;Cinnamons&nbsp;Ant&nbsp;task.<br/>&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Integration&nbsp;with&nbsp;JPA/Hibernate&nbsp;when&nbsp;used&nbsp;with&nbsp;Pimento&nbsp;Data&nbsp;Services.<br/><br/><br/>根据个人的使用感觉来说，还是非常不错的，使用也很方便。它在服务端声明了远程服务接口以及实现类，然后通过他自带的工具包配合Ant工具，就可以生成对应的客户端接口和实现类。然后在使用过程中，只需要使用这个接口就可以了，非常方便。这种把整个服务端的接口搬下来的思想还是非常不错的。<br/>希望有兴趣的人可以去了解一下，里面有详细API以及说明文档。建议要使用的人应该去了解，他本身带有简单的使用教程。<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/>loginService.userLogin(username,password).addResultHandler(loginResult);<br/></div></div><br/>其中userLogin为远程的一个服务端方法，loginResult为接受远程方法返回的结果]]></description>
		</item>
		
</channel>
</rss>