2008年10月16日星期四

2007年2月集合

僅改2位元組,WinXP Home即刻變身WinXP Pro


一份名為《C'T》的德國電腦雜誌在一年前的一次報導,它已經成功實現把Windows XP Home的安裝檔變成WinXP Pro。真的不錯。

具體說明看這裏:

http://hk.knowledge.yahoo.com/question/?qid=7007011202727

不過,也有文章說“要小心”了:

http://download.enet.com.cn/blog/index.php?itemid=1519

2月25日

一虎一席谈:“伪科学”PK

我已經很長時間沒有看過鳳凰衛視了,想不到還有這樣的節目,強烈推薦,目前看到有兩次辯論.

第一次PK,分5段視頻:
http://v.blog.sina.com.cn/b/585710-1192346960.html

第一次PK,分4段視頻:
http://v.blog.sina.com.cn/b/585036-1192346960.html

強,約2個小時,我剛看完,方舟子\司馬南\何祚庥等皆登場,節目現場就差打起來了,有些年紀大的當場都吃高血壓的藥了,這比什麼大專辯論賽強多了.

我正在搜索,如果以後還有的話一定會再推薦給大家.真得非常強,不看可惜了.
2月22日

机顶盒的flash界面程序GUI

机顶盒的flash界面程序,这是即将爆发的一个应用方面,很有借鉴例,推荐观看。

http://www.6rooms.com/watch/18179.html

现在看起来,flash之对于视频应用还是刚刚起步,不要看youtube、56、tudou等现在还没有什么前途可言,但未来可能改变视频媒体的格局,目前互联网新闻和广告已经改变了平面媒体,虽也无法预料到“会发生什么”,但我们可以预料到“可能发生什么”。

加油,Flash!!!!!
2月12日

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(8)

第Ⅲ篇 Flash网络应用程序和FMS
在前面的两篇,我们介绍了如何使用JSP网页结合Flash开发网络应用程序,也介绍了如何使用Flash Remoting(各种RPC)与Flash有效的结合,可以说已经可以创建数据驱动的富媒体应用程序了。
但是,Flash技术还远不止这些,围绕着Flash Player,Macromedia为用户带来了更为丰富的体验,这就是Flash Media Server(简称FMS)。
Macromedia于2002年年末发布了令人惊异的Flash Communication Server MX服务器(简称FCS),这是FMS的前一个版本。使用FMS,你只需要配备Web摄像头和麦克风,并加上十几行ActionScript脚本便可以完成一个电视会议系统。
FMS给全世界的人带来一种全新的通讯方式。有了FMS服务器,您可以参加实时网络会议;使用FMS的功能在工作中进行协作以及通过Internet或企业Intranet共享信息。
还不只是这一点,Flash Player的强大功能使得实时通讯和应用程序的集成由梦想变为现实,这正是未来网络软件发展的趋势,这都是Flash Player惹的“火”。
本篇将介绍如何将Java和FMS结合起来以创建更为强大的Flash网络应用程序。
2月6日

Flash和PHP結合的方式總結(Flash和PHP通訊的方式)★☆★☆★☆★☆★☆★☆

《PHP for Flash網站開發手札》內包含了明確地介紹了Flash和PHP結合開發時要用到的各種技術,但是它比較太寬了,包含了web伺服器和PHP應用程式伺服器,下面我們在這裏做一個分隔出來的技術總結,怎樣在Flash和PHP應用程式伺服器之間通訊:

[1]使用MovieClip物件的getURL、loadVariables、loadVariablesNum方法可以使用HTTP或HTTPS協定以URL編碼格式向PHP應用程式伺服器傳遞和接收資料。

[2]使用LoadVars類的load、send和sendAndLoad方法可以使用 HTTP 或 HTTPS 協定以URL編碼格式向PHP應用程式伺服器傳遞和接收資料。

[3]使用XML類的XML.send、XML.load和XML.sendAndLoad方法可以以XML格式向PHP應用程式伺服器傳遞和接收資料,這還包括一些基於XML的變種形式,例如WDDX、SOAP等。
[4]使用XMLSocket類的XMLSocket.connect 和 XMLSocket.send方法可以創建和使用TCP/IP套接字連接從而以XML 格式向PHP應用程式伺服器傳遞和接收資料。

[5]使用Connection類或者NetConnection的call方法可以使用AMF協定向PHP應用程式伺服器傳遞和接收資料,這被稱為AMF-RPC的方式,還包括其他的變種形式,但都統稱為AMF-RPC方式。

現在馬上出發
作者邀您訪問他的BLOG: http://zhang-yafei.spaces.live.com(繁體)
作者邀您訪問他的BLOG: http://blog.csdn.net/zhang_yafei/(簡體)
2月3日

惊曝!从没有公布的液晶电视天生缺陷!(液晶电视很容易烧毁?)

今天看到一个文章,标题《惊曝!从没有公布的液晶电视天生缺陷!》,其介绍了液晶电视很容易烧毁的现象,真得触目惊心呀。
我很早以前只是觉得太费电,没有想到它会这么容易烧毁,幸亏还没买。
介绍给大家看一下:
2月2日

《Flash ActionScript X》勘误(1)

勘误1(chapter_11简体中文版)、

对于submit.htm文件,应该做如下修改(注意图中标红突出显示的部分):

textField" name="textPut" id="textPut">

感谢lzp710的来信。
勘误2(第188-190页,增加代码的注释)、
/**-------------------------------------------------------

*《Flash ActionScript X开发入门》勘误
* @勘误目的 代码补充注释
* @page 188--190
* @version Created on Dec 7, 2006
* @author zhang yafei
* @BLOG http://zhang-yafei.spaces.live.com/
-------------------------------------------------------**/
/**-------------------------------------------------------
*总体的思路是将Sound对象的属性与GUI模块关联起来
*我想无论是何种考虑,都无法躲过使用此方法来实现
*-------------------------------------------------------
*我利用了一系列变量和onEnterFrame事件配合来达到这个目的
*另外一些变量用来控制状态:前进、后退、拖动音轨滑块等
*-------------------------------------------------------
* newPosition Sound对象的播放位置,每次播放都检查这个变量
* advance 前进
* goBack 后退
* dragging 拖动音轨滑块
* playing 是否正处于播放状态
-------------------------------------------------------**/
//stop()是基于时间轴应用程序最常见的命令
//你随处都可以用它,并且不要吝啬
stop();
//首先声明和初始化变量
var newPosition:Number;
var advance:Boolean;
var goBack:Boolean;
var dragging:Boolean;
var playing:Boolean = true;
butt_play.enabled = false;
//创建Sound的一个实例,然后从库中加载并开始播放
var mySound:Sound = new Sound();
mySound.attachSound(varSound);
mySound.start(0, 1);
//声音播放完毕时,一切复原
mySound.onSoundComplete = function() {
mysound.stop();
newPosition = mySound.duration/1000;
playing = false;
butt_play.enabled = true;
};
//初始化变量和属性
//音轨属性,主要是用来控制滑块的拖放范围
//startDrag要用这些变量
var fade_track_top:Number = panel_open.fade_track._y;
var fade_track_bottom:Number = panel_open.fade_track._y;
var fade_track_left:Number = panel_open.fade_track._x;
var fade_track_range:Number = panel_open.fade_track._width-1;
var fade_track_right:Number = panel_open.fade_track._x+fade_track_range;
/**
*GUI按钮的控制事件,主要就是运算几个变量
*其中主要的就是注意newPosition变量
*因为这个变量代表的是当前播放的位置
*/
butt_play.onRelease = function() {
if (!playing && newPosition<mySound.duration) {
mySound.start(newPosition, 1);
playing = true;
}
butt_stop.enabled = true;
butt_pause.enabled = true;
butt_play.enabled = false;
};
butt_pause.onRelease = function() {
if (playing) {
newPosition = mySound.position/1000;
}
mySound.stop();
butt_pause.enabled = false;
butt_stop.enabled = true;
butt_play.enabled = true;
playing = false;
};
butt_rewind.onRelease = function() {
newPosition = 0;
mySound.stop();
playing = false;
panel_open.butt_fade._x = fade_track_left;
butt_play.onRelease();
butt_pause.enabled = true;
butt_stop.enabled = true;
butt_play.enabled = false;
};
butt_fastforward.onRelease = function() {
newPosition = 0;
mySound.stop();
playing = false;
butt_play.enabled = true;
panel_open.butt_fade._x = fade_track_right;
};
butt_stop.onRelease = function() {
newPosition = 0;
mySound.stop();
playing = false;
panel_open.butt_fade._x = fade_track_left;
butt_pause.enabled = false;
butt_stop.enabled = false;
butt_play.enabled = true;
};
butt_stepforward.onPress = function() {
advance = true;
};
butt_stepforward.onRelease = function() {
advance = false;
};
butt_stepforward.onReleaseOutside = function() {
advance = false;
};
butt_stepBack.onPress = function() {
goBack = true;
};
butt_stepBack.onRelease = function() {
goBack = false;
};
butt_stepBack.onReleaseOutside = function() {
goBack = false;
};
//__________________________________________________________
//利用onEnterFrame事件配合快进和快退按钮命令
//在其中,我们定义了一个变量playing用来显示是否正在播放
//从而根据mySound对象属性来和音轨对应
this.onEnterFrame = function() {
//注意这里是根据播放的方向来控制的
//根据不同播放方向来不断改变音轨滑块的位置
if (advance) {
if (mySound.position/1000+1<mySound.duration/1000) {
if (playing) {
newPosition = mySound.position/1000+1;
mySound.stop();
mySound.start(newPosition, 1);
} else if (butt_fade._x<fade_track_right) {
butt_fade._x++;
newPosition = ((panel_open.butt_fade._x/fade_track_range)*mySound.duration)/1000;
}
}
}
if (goBack) {
if (playing) {
newPosition = mySound.position/1000-1;
mySound.stop();
mySound.start(newPosition, 1);
} else if (panel_open.butt_fade._x>fade_track_left) {
panel_open.butt_fade._x--;
newPosition = ((panel_open.butt_fade._x/fade_track_range)*mySound.duration)/1000;
}
}
//拖放移动音轨滑块,两个事件
//开始拖动和停止拖动
panel_open.butt_fade.onPress = function() {
startDrag(panel_open.butt_fade, false, fade_track_left, fade_track_top-5, fade_track_right, fade_track_bottom-5);
dragging = true;
playing = false;
};
panel_open.butt_fade.onRelease = function() {
stopDrag();
mySound.stop();
dragging = false;
if (panel_open.butt_fade._x/fade_track_range == 1) {
playing = false;
panel_open.butt_fade._x = fade_track_right;
newPosition = mySound.duration/1000;
} else {
playing = true;
newPosition = (((panel_open.butt_fade._x-fade_track_left)/fade_track_range)*mySound.duration)/1000;
if (playing) {
mySound.start(newPosition, 1);
}
}
};
//音轨滑块自动移动情况
if (playing) {
panel_open.butt_fade._x = (mySound.position/mySound.duration)*fade_track_range+fade_track_left;
}
};
感谢instanceof的来信。
勘误3(第195-199页,增加代码的注释)、
/**-------------------------------------------------------
*《Flash ActionScript X开发入门》勘误
* @勘误目的 代码补充注释
* @page 195--199
* @version Created on Dec 7, 2006
* @author zhang yafei
* @BLOG http://zhang-yafei.spaces.live.com/
-------------------------------------------------------**/
/**-------------------------------------------------------
*@总体的思路
*我们使用外部的XML文件来作为MP3文件的数据库
*主要就是MP3文件的的名称和路径
*因此下面来构造一个XML对象来加载和解析XML文件
*目的就是获得MP3文件的的名称和路径
-------------------------------------------------------**/
//soundList是一个列表框组件,用来显示MP3文件
//首先清空组件,也就是一个初始化
//变量myOutSound用来定义是播放库中的声音
//还是播放外部的MP3文件
soundList.removeAll();
_parent._parent.myOutSound = true;
//下面构造一个XML对象来加载和解析XML文件
var xmlSound:XML = new XML();
xmlSound.load("soundlist.xml");
xmlSound.ignoreWhite = true;
function myOnLoad():Void {
var myVar:String = xmlSound.firstChild.nodeName;
var myVar2:String = xmlSound.firstChild.firstChild.attributes.path;
var myVar3:String = xmlSound.firstChild.firstChild.nodeName;
var myVar4:String = xmlSound.firstChild.firstChild.nextSibling.nodeName;
var myVar5:String = xmlSound.firstChild.firstChild.firstChild.nodeValue;
var soundNum:Array = new Array();
soundNum = xmlSound.firstChild.childNodes;
for (i=0; i<=soundNum.length; i++) {
if (soundNum[i].nodeName.substr(0, 5).toLowerCase() == "sound") {
//填充列表框组件
soundList.addItem(soundNum[i].firstChild.nodeValue+" in "+soundNum[i].attributes.path, soundNum[i].attributes.path);
}
}
soundInput = soundList.getItemAt(0).data;
trace(soundList.getItemAt(0).data);
}
xmlSound.onLoad = myOnLoad;
/**-------------------------------------------------------
*处理用户的选择事件**
*1、用户选择复选框,表明他将播放库中的声音元件
*2、用户取消选择复选框,并点击列表框,那么表明将播放外部的MP3文件
**
*我们创建两个监听对象以处理用户对复选框和列表框的选择事件
-------------------------------------------------------**/
var myListBox:Object = new Object();
var myCheckBox:Object = new Object();
//为监听对象定义事件函数
//事件函数中有一些向播放器传递消息和命令的代码
//主要就是播放器按钮的状态、播放状态
//变量myOutSound用来定义是播放库中的声音
//还是播放外部的MP3文件
myListBox.change = function(event_obj:Object) {
soundInput = event_obj.target.selectedItem.data;
trace(event_obj.target.selectedItem.data);
_parent._parent.playing = false;
_parent._parent.mySound.stop();
_parent._parent.butt_rewind.onRelease();
_parent._parent.myOutSound = true;
};
myCheckBox.click = function(event_obj:Object) {
if (event_obj.target.selected) {
soundList.enabled = false;
soundInput = "";
_parent._parent.mySound.stop();
_parent._parent.playing = false;
_parent._parent.myOutSound = false;
_parent._parent.myInSound = true;
_parent._parent.butt_rewind.onRelease();
}
if (!event_obj.target.selected) {
soundList.enabled = true;
_parent._parent.mySound.stop();
_parent._parent.playing = false;
_parent._parent.myOutSound = true;
_parent._parent.myInSound = false;
_parent._parent.butt_rewind.onRelease();
}
};
//将监听事件函数赋给监听对象
soundList.addEventListener("change", myListBox);
soundCheck.addEventListener("click", myCheckBox);
//stop()是基于时间轴应用程序最常见的命令
//你随处都可以用它,并且不要吝啬
stop();

感谢instanceof的来信。

Flash v.s. Flex

想看看老外怎么讲,但是却访问不了,谁能转贴一下:
2月1日

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(7)

21 AMF-RPC的开源实现OpenAMF

OpenAMF是一个开源的AMF-RPC实现,几乎可以替代Flash Remoting MX for Java。并且也有自己的一些特点,本章我们就来介绍一下怎样使用OpenAMF开发Flash网络应用程序。

21.2嗨!Flash Remoting MX for Java

现在,我们将创建一个最简单的使用OpenAMFFlash影片应用程序——一个类似传统的 Hello World程序。

webapps\3JK\WEB-INF\classes目录下将flashRemoting目录复制到webapps\3JK_with_OpenAMF\WEB-INF\classes目录下,实际上这些类都可以被用于OpenAMF

打开前面我们调用JavaBeansFlash影片应用程序,只需修改一下网关的地址就可以了。

找到下面的一行代码:

var myService:Service = new Service("http://localhost:8080/3JK/gateway", null, "flashRemoting.javaBeansTest.FlashJavaBeans", null, null);

修改为:

var myService:Service = new Service("http://localhost:8080/3JK_with_OpenAMF/gateway", null, "flashRemoting.javaBeansTest.FlashJavaBeans", null, null);

Ctrl+Enter键测试Flash影片应用程序,可以看到在“输出”面板中出现我们在JavaBeans中定义的信息。如图21.1所示:

21.1 “输出”面板中显示返回值

同样也可以调用其它的例子,但是要注意将支持的类(例如rowset.jar)复制到3JK_with_OpenAMF\WEB-INF\lib目录下。

技巧与提示

OpenAMF不支持将ServletJSP作为远程服务方法

2007年1月集合

lash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(6)

15 Flash网络应用程序中应用XML(一)——基础应用

XML(可扩展标记语言)正日益成为Internet应用程序中结构化数据存储和交换的标准。Flash也把其数据集成功能完全架构于XML之上,使用Flash创作环境,你可以非常轻松的创建Flash影片应用程序和服务器端的XML技术结合起来,而应用Flash Remoting MX for Java,你也可以把Flash Actionscript数据与使用复杂应用程序(如地址薄、聊天系统或者表单验证系统)的服务器集成起来,这些复杂的应用程序也一般都是使用XML技术建立起来的。

XML语法类似于HTML,都是使用标签来描述一段文本。HTML的标签是预定义的、固定的,我们只能使用,不能修改;XML则不同,它没有预先定义好的标签可以使用,而是依据设计上的需要,自行定义标签(例如你可以定义标签来标示一段数据的类型,就象下面的一行语句:VerySecret)。XML把信息的结构和显示的方式分开,这就允许相同的XML文档在不同的环境中使用和重用。

每个XML标签被称为节点(或称为元素),每个节点属于一种类型(1-XML节点,或者3-文本节点),而且节点都有属性。嵌入在一个节点中的节点称为该节点的子(或者子节点),由此构成一个树型层级结构,称为 XML DOM(文件对象模型),与JavaScript DOM非常相似(JavaScript DOM是网络浏览器中JavaScript元素的结构)

这一章我们首先介绍怎样在Java架构下创建、使用和处理XML文档的基本知识,然后介绍怎样使用Flash影片应用程序和Flash Remoting MX for Java应用XML文档。

要注意,本章并不对XML文档的概念作详细描述,如果你想了解XML文档的信息可以参考其它的文档和图书。另外,因为XML对象是标准的Actionscript对象,属于基本的Flash知识,并非Flash Remoting MX的组成部分,所以本书也不再对Flash Actionscript XML对象作过多地介绍。

15.1 JavaXML

XMLJava一个重要的组成部分,在Java应用程序的开发过程中,我们初步总结了一下,它主要扮演下面的几种角色:

1Web应用程序部署描述符(web.xml

2标签库描述文件(TLD

3企业Bean部署描述符(ejb-jar.xml

4使用转换为不同类型的客户端创建多种数据视图

5用于SOAP和开发Web服务

6基于XMLB2B交换所用的DTD(文档类型定义)

15.4Flash影片应用程序中使用XML

要在Flash影片应用程序中使用XML时,你可以使用下面的模式之一来处理XML数据:

1使用Flash影片应用程序可以直接调用XML文档并处理数据,这是Flash最早的功能之一;

2Flash影片应用程序中不使用XML格式数据。Flash影片应用程序使用简单数据类型向服务器发送数据,如果需要的时候也可以使用XML对象。服务端方法可以产生并处理XML数据,这些函数可以将XML数据转化为简单数据类型,并传回Flash影片应用程序。

3Flash影片应用程序中直接使用XML格式数据。服务端方法从Flash影片应用程序中获取XML,并将XML作为一个对象返回到Flash影片应用程序中。在Flash影片应用程序中使用ActionScript内建的XML对象和方法可以产生并处理XML

针对这几种模式,也有不同的使用方法,下面,我们就来分别加以介绍它们的使用方法。

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(5)

09 Flash影片应用程序中处理结果和结果集对象

要连接到Java应用程序服务器上的Flash Remoting MX服务并且调用远程服务方法,就必须使用mx.remotingmx.rpc这两个ActionScript类库:这两个类库包含了所有的Flash Remoting MX for ActionScript 2.0类和方法实现。

其中,mx.remoting是一个十分核心的ActionScript类库,它包含了用来与应用程序服务器建立连接的所有对象及方法,而mx.rpc可以用来调用远程方法并处理结果。

在前面的章节中,我们介绍了如何通过Flash Remoting MX网关服务JSP网页和Servlet中向Flash影片应用程序传递数据,也介绍了如何使用Flash影片应用程序向JSP网页和Servlet传递参数,并且介绍了如何使用Flash Remoting MX for JavaJDBC结合调用数据库,而且创建了几个简单的例子。

但是,当从JSP网页和ServletFlash影片应用程序传递的数据被接收到时,如何处理接收到的结果呢?我们在前面的例子中已经使用了一些方法,这只是在Flash影片应用程序中处理结果丰富方法中最简单的,Flash Remoting MX for ActionScript 2.0组件内置了丰富的ActionScript脚本语法用来处理结果。

本章就来详细地介绍一下这些ActionScript脚本语法。



9.4使用DataGlue类处理记录集数据

要在一个Flash UI组件中显示RecordSet记录集,一般可以使用该组件内建的setDataProvider()方法或者dataProvider属性,但是如果想在一个Flash UI组件中显示记录集中某一字段下的所有记录,就比较困难了。

例如,在前面的例子中,我们要在一个下拉列表框组件中显示记录集中酒店名,就必须首先创建一个新的单字段记录集,将原记录集中该字段的数据填充新的单字段记录集,然后再使用组件的setDataProvider()方法或者dataProvider属性,显然,这比较麻烦,而且占用的资源也比较多。

为了解决这个问题,Flash Remoting MX还内建了名为DataGlueActionScript类。使用DataGlue ActionScript类文件也可以在一个Flash UI组件中显示RecordSet记录集。DataGlue ActionScript类文件随同Flash Remoting MX组件一起被安装,要使用它,必须导入相应的类库,可以使用下面的一行脚本:

import mx.remoting.DataGlue;

DataGlue类有两个内建的方法:DataGlue.bindFormatStrings()DataGlue.bindFormatFunction(),使用这两个方法都可以在Flash UI组件(例如组合框和列表框)中显示记录集。

9.4.1使用DataGlue.bindFormatStrings方法绑定记录集

可以使用DataGlue.bindFormatStrings()方法在一个Flash UI组件(例如组合框和列表框)中显示RecordSet。下面的一段ActionScript脚本代码将结果RecordSet绑定到名为displayNames的列表框UI组件:

DataGlue.bindFormatStrings(displayNames, result, "#ContactName#", "#customerID#");

在这一段代码中,后两个参数被传递给函数(#ContactName##customerID#是记录集的字段名)。当用户选择组件中一个特殊的纪录时,ContactName列被显示在UI组件中,而customerID列被返回。下面,我们来改造一下前面的例子,看一下如何使用DataGlue类。

1打开前面一章我们创建的Restaurant_component.fla文档,将文档另存为Restaurant_component_DataGlue.fla

2保持当前位于主时间轴编辑状态,修改主时间轴上的脚本代码。在”动作”面板上追加下面的一行脚本代码:

import mx.remoting.DataGlue;

3在舞台上双击影片剪辑元件实例main_mc,使影片剪辑元件main处于编辑状态,选中层Script。保持该层被选中,在“动作”面板上修改其中的脚本代码:

将下面的一段脚本代码:

var newRecordSet:RecordSet = new RecordSet(["hotelName"]);

for (var i = 0; i

newRecordSet.addItemAt(i, {hotelName:resultRecordSet.getItemAt(i).hotel_name});

}

if (newRecordSet.isLocal()) {

newRecordSet.addItemAt(0, {hotelName:"请选择一个酒家或酒店"});

hotelName_cb.dataProvider = newRecordSet;

}

替换为

DataGlue.bindFormatStrings(hotelName_cb, resultRecordSet, "#hotel_name#", "#hotel_name#");

可以看到,前面多行代码实现的功能,现在只需一行就可以实现了。

4因为现在是使用DataGlue类,所以对于UI组件的读取方式也应该改变一下。在本例中,这段脚本代码位于函数applyFilter()体内:

将下面的一段脚本代码

list_lb.dataProvider = resultRecordSet.filter(thisFilter, hotelName_cb.selectedItem["hotelName"]);

替换为

list_lb.dataProvider = resultRecordSet.filter(thisFilter, hotelName_cb.selectedItem.label);

5最后可以测试一下效果,可以看到与前面的例子功能相同。

9.5使用RemotingConnector组件和数据绑定

RemotingConnectorFlash的一个数据组件,使用该组件你可以非常轻松的建立与远程服务的连接——该远程服务必须是通过Flash Remoting MX网关提供——并且可以调用远程服务所定义的方法函数,使用它只需要将该组件拖放到舞台上并定义组件参数,而且可以使用Flash的数据绑定功能。

我们在这里要介绍的是首先是通过编写脚本代码的方式使用RemotingConnector组件。

9.5.1编写脚本代码使用RemotingConnector组件

要通过编写脚本代码的方式使用该组件,也必须首先在开始将RemotingConnector组件拖放到当前舞台上(或者只要在库中就可以了),然后才能开始编写代码使用该组件,这是使用该组件的第一步。

另外,在编写脚本代码时要导入RemotingConnector类,这是使用该组件编写脚本代码的第一步,可以使用下面的脚本语句:

import mx.data.components.RemotingConnector;

下面我们就使用一个例子来看一下怎样使用该组件。

1打开前面一节我们创建的Restaurant_component.fla文档,将文档另存为Restaurant_component_RC.fla

2保持文档处于主时间轴的编辑状态,改变主时间轴上的脚本代码如下:

stop();

//-------------------------------------------------------------

//导入RemotingConnector

import mx.data.components.RemotingConnector;

//构造RemotingConnector组件实例并定义实例属性

var my_rc:RemotingConnector = new RemotingConnector();

my_rc.addEventListener("result", returnRowSet_Result);

my_rc.addEventListener("status", returnRowSet_Status);

my_rc.gatewayUrl = "http://localhost:8080/3JK/gateway";

my_rc.methodName = "returnRowSet";

my_rc.serviceName = "3JK";

my_rc.suppressInvalidCalls = true;

function GetRestaurantInfo():Void {

if (selectedhotel_name == undefined && selectedhotel_flavor == undefined && selectedhotel_location == undefined) {

//定义参数为空

my_rc.params = null;

//触发连接,调用远程服务方法

my_rc.trigger();

} else {

//定义传递给远程服务方法的参数

my_rc.params = {hotel_name:selectedhotel_name, hotel_flavor:selectedhotel_flavor, hotel_location:selectedhotel_location};

//触发连接,调用远程服务方法

my_rc.trigger();

selectedhotel_name = "正在加载数据";

}

}

function returnRowSet_Result(ev:Object) {

//接收结果

main_mc.list_lb.removeAll();

main_mc.list_lb.dataProvider = ev.target.results;

selectedhotel_name = "";

fetchOK = 1;

main_mc.resultRecordSet = ev.target.results;

}

function returnRowSet_Status(stat:Object) {

//接收错误

trace("接收到错误");

}

//初始化

function ini():Void {

if (this.inited != undefined) {

return;

} else {

var inited:Boolean = true;

GetRestaurantInfo();

}

}

ini();

3打开组件面板,将RemotingConnector组件拖放到舞台上创建一个实例(实际,只需放到库中就可以了)。

最后可以测试一下效果,可以看到与前面的例子功能相同。

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(4)

06 AMF-RPC for Java基础入门

在前面的章节,我们介绍了Flash如何通过中间件JSP与服务器之间实现数据交换,了解了Flash影片应用程序如何融入到网络应用环境的最一般原理,有了基本的创建具有网络交互功能Flash影片应用程序的基本知识。

这一章,我们将开始使用Flash的一个最重要的服务器组件AMF-RPC来实现与Flash影片应用程序的交互,用户可以感受到更加强烈的Flash网络应用程序“感觉”,从而可以更轻松的创建功能更强大的Flash网络应用程序——这就是“富媒体应用程序”。

使用Flash作为开发工具,我们现在可以开始学习怎样使用AMF-RPC创建更为强大而且易用的富媒体应用程序了。

6.1 AMF-RPC技术简介

AMF-RPC是使用AMF 数据格式实现的远程方法调用,Macromedia公司为此出品了三个个实现:Flash Remoting MX for J2EE(以前也被称为Flash Remoting MX for Java)、Flash Remoting MX for .NETFlash Remoting MX for ColdFusion,并且开源社区也为AMF-RPC编写了一个在PHP架构下的实现,名为AMFPHP(也可以称为Flash Remoting MX for PHP)。

就如其它的RPC工具一样,AMF-RPC是一个应用程序服务器网关,它在Flash影片应用程序和远程服务之间提供一个相互通信的网络通道:在这个通道间传输的是AMF格式的数据(AMF是专用于Flash远程数据传输的一种数据格式);远程服务则包含各种应用服务技术(例如JavaBeansColdFusion组件和网页、ASP.NET网页或者Web服务等等)。

和其它的连接到外部数据提供者的技术相比,AMF-RPC的优点是不言而喻的。在前面一章我们介绍的像getURLloadVariablesXMLXMLSocket等语句,它们都是使用的简单的HTTP功能,一般都离不开内建的类如RequestResponse这样的语法,而AMF-RPC则有其独特的一面,总的说来有下列优点:

[1]易用。AMF-RPC可以对本地远程服务程序代码(JavaCFMLPHPC#)的数据类型进行自动转换:可以转换成ActionScript代码数据类型,也可以转回本地远程服务程序代码数据类型。

[2]高性能。AMF-RPC使用Action Message FormatAMF)将Flash影片应用程序和远程服务之间的通信信息序列化。AMF是一个二进制格式,符合Simple Object Access ProtocolSOAP)协议格式,通信更加快速。

[3]可扩展性。AMF-RPC设计的时候集成了现有应用程序设计模式和最佳的开发实践,从而可以满足高度扩展性Flash网络应用程序设计要求。

要了解这些优点,最好是先来看一个简单的使用AMF-RPC创建的Flash网络应用程序。



现在马上出发

作者邀您访问他的BLOG: http://zhang-yafei.spaces.live.com(繁体)
作者邀您访问他的BLOG: http://blog.csdn.net/zhang_yafei/(简体)

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(3)

第Ⅱ篇 Flash网络应用程序和Flash Remoting

在第一篇,我们介绍了Java for Flash的基本原理,了解了怎样使用Flash内建的功能方法与Java实现交互,这种交互方式其实是一种极其简单的HTTP操作,来回传递的都是字符串格式的数据(XML也是字符串,需要解析为DOM)。

人们需要一种更为简洁的方式能够实现类似Native的操作,于是Flash Remoting便应运而生,这符合IT工业的一贯标准。

在这一篇,我们将介绍怎样使用包括XML-RPCWDDXSOAPAMF-RPC(包括Flash Remoting MXOpenAMF)等在内的Flash Remoting技术,开发人员可以更轻松的完成过去需要编写很多代码才能完成的任务。

本篇包含很多的章节,是本书的主体部分,主要就是介绍怎样使用各种Remoting工具实现Java for Flash的强大体验。



现在马上出发

作者邀您访问他的BLOG: http://zhang-yafei.spaces.live.com(繁体)
作者邀您访问他的BLOG: http://blog.csdn.net/zhang_yafei/(简体)

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(2)

01 开发和运行环境的安装与配置

Java for Flash动态网站开发手札》又被称之为网络三剑客,它提供了使用Flash PlayerXMLJava建立下一代网络应用程序最迅速、最大限度节省投资和最具有挑战性的方法组合,这一组合事实上包含四个方面:Flash Player的应用环境、XML的应用环境、Java应用环境以及这三个应用环境的相互关联。

Flash PlayerXMLJava这三剑客组成的软件运行环境中:Java是基础架构,它为Java应用程序提供运行环境,并且JSPServletJavaBeansEJBJMX MBean等程序组件都是在后端运行;Flash PlayerFlash影片应用程序在前端运行的解释器(也是一个虚拟机),必须安装在客户端。Flash RemotingFlash影片应用程序连接到Java程序的服务器和网关,它们之间的连接也是在后端运行。

本章我们就来介绍怎样安装和配置网络三剑客的开发和运行环境。

1.1新架构的优点

使用网络三剑客架构,事实上包含四个方面:Flash Player的应用环境、XML的应用环境、Java应用环境以及这三个应用环境的相互关联。

XML:标准的数据交换格式

尽管简单得令人难以置信,XML确实正在彻底改变我们创建和使用软件的方式。WEB彻底改变了用户与应用程序的交互方式:通过提供一种能使数据更易适配或更易转换的通用数据格式,XML正在彻底改变应用程序间的交互方式——或者更广义地说,计算机间的交互方式。包括SOAPUDDI 在内的基于XML的标准,构成了应用程序间通信的开放式方法,此方法叫做XML WEB服务,而我更愿意称之为SOAP-RPC

Java:开放的、成熟的和规范的基础架构

Java是目前市场上主流的企业及分布式应用程序开发平台,它是在Sun公司的领导下,多家公司参与共同制定的应用程序开发规范,正是因为它是一种规范、它的开放性,所以能够得到了业界的广泛支持。并且经历了几年的发展,Java已经经受住了市场的考验,成为一种成熟的开发平台。使用Java架构能够快速、高效的开发出可移植的、跨平台的、具有强大功能的企业级Web应用程序。

Java包含多种技术,它们之间互为补充,实现不同功能。包括:Java Servlet技术、Java Server PageJSP)技术、JavaBeans技术、EJB技术等。

通过JSP(最终被编译成Servlet)和Servlet这一中间件,我们可以在Flash Player与服务端之间进行数据交换;而通过JavaFlash Remoting这两个中间件,使得创建服务端与Flash Player的关系变得更加容易,更加轻松自如。

Flash Player:跨平台跨设备的富媒体客户环境

Flash Player是功能强大的富媒体客户环境,只要平台或设备上正确的安装了Flash Player,用户就可以浏览使用Flash影片应用程序。

如同Java一样,Flash影片应用程序同样具备了一次开发,可以跨平台跨设备随意浏览的特性(而且不需要重新编译),这就是Flash的一个最大的优点。无论是在WindowsMacLinuxUnix还是在Symbian操作系统(Nokia应用于移动电话的一种操作系统)上,也不论你是在桌面PC上还是在掌上电脑或是移动电话上,Flash影片应用程序都能发挥它最大的特点。这一点我们想着重的作一下对比,如表1.1所示:

1.1 FlashJava对比


Flash影片应用程序

Java应用程序

运行环境

Flash Player(不同平台有不同版本)

JVMJava虚拟机,不同平台有不同版本)

编译

P代码

字节码

不同平台

不需重新编译

不需要重新编译

开发难易程度

简单的图形化开发

图形化开发稍逊

Flash Player内建的ActionScript脚本语言是Flash Player的交互语言,它有几个版本,每种版本的ActionScript的语法和风格各不相同,但可以在同一个运行时下协调工作。Flash Player不但可以凭借内建的XML类加载和解析标准的XML数据。而且通过Flash Remoting MX很轻松的连接到一个应用程序开发人员要使用的远程服务端和WEB服务并实现数据交换,使得Flash影片应用程序的开发简单有效。

并且,随着Flash Media Server(简称FMS)的发布,用户更可以将视频和音频(包括实时视频和音频)集成到应用程序中,实现声音、图像、文字、数据同步传播。并且,你也可以将声音、图像、文字、数据等录制下来,通过eMail发送出去(需要编程实现)。

并且,FMS服务器和Flash Remoting MX可以无缝的集成到一块儿。有了FMS服务器和Flash Remoting MX的集成,你从而可以连接数据库以及驱动Java应用程序服务器以创建功能更强的Flash影片应用程序,并将其融入到Flash Player当中,从而为终端用户带来全新的富媒体应用程序体验。

和传统的基于HTML的浏览器应用程序相比,Flash影片应用程序在创建动态和复杂的、友好的用户界面方面有其独到的优势,包括:

1Flash Player运行时执行代码、传递数据和调用远程服务

2客户端展示逻辑与服务端应用程序逻辑相互独立

3有效的利用带宽,不需要刷新整个网页,使用矢量图形

4可以部署在多个平台和设备上,并且非常简单

这就是深具魅力的《Java for Flash动态网站开发手札》。

技巧与提示

用户必须区分Flash Remoting MXFlash RemotingFlash Remoting MXMacromedia的一款产品,在本书中我时常称之为AMF-RPC(本书中同时介绍的OpenAMFAMF-RPC的另一种实现)。

Flash Remoting是一个宽泛的定义,包括XML-RPCWDDX-RPCRTMP-RPC(也就是FMS)等都可以称为Flash Remoting。而Flash Remoting MXAMF-RPC)仅是Flash Remoting中的一种。

现在马上出发

作者邀您访问他的BLOG: http://zhang-yafei.spaces.live.com(繁体)
作者邀您访问他的BLOG: http://blog.csdn.net/zhang_yafei/(简体)

Flash和Java结合开发的利器_《Java for Flash动态网站开发手札》_部分章节连载(1)

第Ⅰ篇 Java for Flash基础入门

学习任何技术都有一个基础知识,Java for Flash也不例外。本篇包含几个章节,介绍了Java for Flash的基本知识。

在第一章,我们介绍了如何安装和配置Java for Flash的开发和运行环境,这样,用户就可以开发Flash网络应用程序以实现和Java应用程序的交互。

在随后的几章,我们介绍了如何使用Java语言、如何使用JDBC结合数据库以及面向对象的Java开发。

而在第五章,我们开始使用传统的JSP网页作为中间件方法开发Flash网络应用程序,与服务器之间实现数据交换,了解了如何建立网络环境的最一般原理,有了基本的创建具有网络交互功能Flash影片应用程序的基本知识,这是实现使用Flash影片应用程序作为网络应用程序主体的一次“飞跃”。


现在马上出发

作者邀您访问他的BLOG: http://zhang-yafei.spaces.live.com(繁体)
作者邀您访问他的BLOG: http://blog.csdn.net/zhang_yafei/(简体)

1月23日

Google 會對使用 Macromedia Flash 的網站建立索引嗎?

以下內容來Google的說明:

會的,Google 會對使用 Macromedia Flash 的網頁建立索引。不過,我們的檢索器可能會在產生 Flash 網頁索引時發生問題。如果您擔心網頁上的 Flash 內容會抑制 Google 檢索您網站的能力,您可以考慮使用如 Lynx 的文字瀏覽器來檢查您的網站。如果 Flash 此類的功能無法讓您以文字瀏覽器瀏覽您網站的所有內容,則當搜尋引擎的自動尋檢程式在檢索您的網站時就可能會有問題。

您可以考慮為我們的檢索器建立這些 Flash 網頁的 HTML 副本。如果您建立 HTML 副本,請務必加入一個可防止 Flash 網頁被檢索的 robots.txt 檔案,以確保我們的檢索器不會將這些網頁視為重複的內容。

最後,請考慮使用 Google Sitemaps,建立與提交您網頁的詳細 Sitemap。有了 Google Sitemaps,您就可以輕鬆地將所有您的 URL 提交至 Google 索引,並且取得關於您的網頁在 Google 上的曝光率的詳細報告。您可以使用 Google Sitemaps,將您目前的所有網頁及對這些網頁所做的任何變更自動通知我們。請注意,提交 Sitemap 不保證會我們會檢索您網站的所有網頁,或將其包含在我們的搜尋結果中。若要瞭解更多關於 Google Sitemaps 的資訊,請造訪 http://www.google.com/webmasters/sitemaps/about?hl=en

引自:http://www.google.com.tw/support/webmasters/bin/answer.py?answer=35267

1月10日

apple iphone精美大图

这下,nokia、moto等真的该着急了:

1月3日

《.NET for Flash动态网站开发手札》相关勘误、更新、下载(1)

我亦欢迎您直接在此留贴。谢谢!!!!

129页,第8步.应该是"调整第1帧和第20帧上矩形的高度至最小".

129页,第6步.应该是"第1帧和第2帧创建两个关键帧".

谢谢qinglu008的来信。

《Java for Flash动态网站开发手札》相关勘误、更新、下载(1)

[更正启示0001:]
在书的81页第四行发现了一个文字错误-------webapp.aspx,应该是webapp.jsp才对。

[更正启示0002:]
在书的第一章前几段文字,由于编辑的不小心造成。实际的文章可以参考下面的连载帖子:
http://blog.csdn.net/zhang_yafei/archive/2007/01/03/1473185.aspx

不断更新中,我亦欢迎您直接在此留贴。谢谢!!!!

Flash和Java結合的方式總結(Flash和Java通訊)

《Java for Flash動態網站開發手札》內包含了明確地介紹了Flash和Java結合開發時要用到的各種技術,但是它比較太寬了,包含了web伺服器和Java應 用程式伺服器,下面我們在這裏做一個分隔出來的技術總結,怎樣在Flash和Java應用程式伺服器之間通訊:

[1]使用MovieClip物件的getURL、loadVariables、loadVariablesNum方法可以使用HTTP或HTTPS協定以URL編碼格式向Java應用程式伺服器傳遞和接收資料。

[2]使用LoadVars類的load、send和sendAndLoad方法可以使用 HTTP 或 HTTPS 協定以URL編碼格式向Java應用程式伺服器傳遞和接收資料。

[3]使用XML類的XML.send、XML.load和XML.sendAndLoad方法可以以XML格式向Java應用程式伺服器傳遞和接收資料,這還包括一些基於XML的變種形式,例如WDDX、SOAP等。

[4]使用XMLSocket類的XMLSocket.connect 和 XMLSocket.send方法可以創建和使用TCP/IP套接字連接從而以XML 格式向Java應用程式伺服器傳遞和接收資料。

[5]使用Connection類或者NetConnection的call方法可以使用AMF協定向Java應用程式伺服器傳遞和接收資料,這被稱為AMF-RPC的方式,還包括其他的變種形式,但都統稱為AMF-RPC方式。