取得Select组件的值

mikel阅读(744)

网站或是web应用中常常用到下拉选择框select,更多的时候select标签的value和text显示的值分别是id和描述,后台处理的往往时id,比如查询时之查询国家的ID而不是按text查询,因此需要获得选择的Id,但是ASP中Request(“select”)获得的只是select组件当前的text而不是value,因此需要用JavaScript动态设置一个隐含的组件的值来存储当前选择的ID,具体代码如下:

<sel&#101;ct id="sel&#101;ctCountry" name="sel&#101;ctCountry" onchange="sel&#101;ctedCountryID.value=this.options&#91;this.sel&#101;ctedIndex&#93;.value;alert(&#39;当前选择的国家ID:&#39;+sel&#101;ctedCountryID.value);">
<option value="1">china</option>
<option value="2">us</option>
<option value="3">un</option>
</sel&#101;ct>
<input type="hidden" id="sel&#101;ctedCountryID" name="sel&#101;ctedCountryID" value=0>

一些Flex开源项目的整理

mikel阅读(685)

Adobe APIs
主要包含corelib, mappr, flickr, youtube及加密等类库.
http://labs.adobe.com/wiki/index.php/Actionscript_3:resources:apis:libraries
as3awss3lib
与 Amazon S3 交互的 Actionscript 3.0 类库
http://code.google.com/p/as3awss3lib/
as3soundeditorlib
声音编辑类库
http://code.google.com/p/as3soundeditorlib/
as3ds
为游戏开发者整理的 AS3 数据结构
http://code.google.com/p/as3ds/
mecheye-as3-libraries
一组Flash游戏开发的AS3类库。
http://code.google.com/p/mecheye-as3-libraries/
APE
Actionscript的模拟物理引擎API
http://www.cove.org/ape/
As3Crypto
用 AS3 实现的密码系统类库,支持的算法主要包括 RSA,AES,DES,3DES,MD2,MD5,SHA-1,SHA-224,SHA-256 等等
http://crypto.hurlant.com/
FZip
让 AS3 能够加载标准ZIP格式的数据,并能解压其中的文件。
http://codeazur.com.br/lab/fzip/
// 3D相关
ASCOLLADA
一个可以解析Collada文件格式的AS3类库,Collada 是一个开放原始码的专案,它可让3D资料以XML的型态储存,并让3D人员可以轻易携带和互换资料
http://code.google.com/p/ascollada/
Away3d
3D引擎
http://code.google.com/p/away3d/
Papervision3D
3D引擎
http://code.google.com/p/papervision3d/
// UI相关项目
uicomponents-as3
一个轻量级的 AS3 UI 组件库
http://code.google.com/p/uicomponents-as3/
Tweener
Full featured animation library
http://code.google.com/p/tweener/
asinmotion
AS3的一个动画类库,可以并行或线性的管理特效的运行.
http://code.google.com/p/asinmotion/
flest
RIA企业级的AS3应用程序开发框架, 应用了Controller, Factory, Command等多种设计模式, 并采用了高效、简洁、实用托管式设计特点。
http://code.google.com/p/flest/
// 第三方公司或工具的API
Yahoo AS3 APIs
http://developer.yahoo.com/flash/as3_api_libraries.html
facebook-as3
访问 Facebook 平台的 AS3 API
http://code.google.com/p/facebook-as3/
Salesforce Flex Toolkit
http://wiki.apexdevnet.com/index.php/Flex_Toolkit
Twitter AS3 API
http://twitter.com/blog/2006/10/twitter-api-for-flash-developers.html
XIFF
XMPP client library
http://svn.igniterealtime.org/svn/repos/xiff/branches/xiff_as3_flexlib_beta1/

[Flex]Cairongorm教程

mikel阅读(956)

cairongorm框架是对Flex开发最佳实践总结出的各种设计模式的实现。通过cairongorm框架我们可以学会如何更好地使用Flex进行大规模应用开发。我翻译了这个古老的教程,尽管它里面所描述的具体类同现在版本(cairongorm2.2.1)中的有很大差异,但是其指导思想没有变化。如果有时间我会自己总结出一个更加通俗易懂的教程。
— —-最近一段时间由于工作关系,认真地翻阅了cairongorm和PureMvc的源码,cairongorm没有考虑界面重用方面的设计,用其实现一个应用也过于死板。所以建议采用PureMvc作为Flex应用客户端开发框架。本人将上传PureMvc的中文API doc。对于cairongorm源码,可以学习一下它是如何实现国际化的,其他方面则没有更多的可圈点之处。
下载文件 点击下载此文件

Flex和Excel之间的通信

mikel阅读(669)

Flex和Excel之间的通信
http://samples.faratasystems.com/export2excel/FxSpreadSheet.html
http://www.saskovic.com/blog/?p=3

AsWing 与 Java 之间的交互

mikel阅读(721)

Web2.0 成就了AJAX,也促进了新技术在 RIA 行业的不断演进,这之后出现的Adobe Flex 、AIR 与Microsoft 的 SilverLight尤为突出,至于这两种技术之间的优劣在此不做比较。
作为实用主义者,在我看来能更快速、更好地帮助客户解决问题的技术,那就是好的技术。07年2月的一个时间萌生了重新架构IMX即时通讯客户端的想法,技术选型上我很看好Adobe Apollo 可人家还未发任何版,好在老朱帮我从Adobe 内部拿到了一份正在开发中的Apollo版本,试用后效果还是很不错的,那会,估计我该是国内最早看到Apollo 真身的几个外部开发人员之一吧。
呵呵,就这样有意无意的开始了AS3的开发了, Java 程序员来做 AS3 的开发,初学的人们问的最多的那句,便是二者之间该如何进行交互,如果您也关心于这个部分,OK,那这篇文章就是为您而生。
demo
围绕气象服务,支持 http 、hessian 、amf3 多种接口实现,UI部分采用 AsWing 来开发,至于什么是AsWing ,详情见《AsWing 简介》。

package {
import c2s.Amf3ServiceInvoker;
import c2s.HessianServiceInvoker;
import c2s.HttpServiceInvoker;
import flash.display.Sprite;
import hessian.events.HessianErrorEvent;
import hessian.events.HessianResultEvent;
import o&#114;g.aswing.AsWingManager;
import o&#114;g.aswing.FlowLayout;
import o&#114;g.aswing.JButton;
import o&#114;g.aswing.JFrame;
import o&#114;g.aswing.JOptionPane;
import o&#114;g.aswing.JTextField;
import o&#114;g.aswing.event.AWEvent;
public class aswing2java extends Sprite
{
private var myFrame:JFrame;
private var myAmf3Button:JButton;
private var myHessianButton:JButton;
private var myHttpButton:JButton;
private var myInput : JTextField;
public function aswing2java()
{
AsWingManager.initAsStandard(this);
myAmf3Button = new JButton(“amf3″);
myAmf3Button.addActionListener(__amf3buttonClicked);
myHessianButton = new JButton(“hessian”);
myHessianButton.addActionListener(__hessianbuttonClicked);
myHttpButton = new JButton(“http”);
myHttpButton.addActionListener(__httpbuttonClicked);
myInput = new JTextField(“合肥“,15);
myFrame = new JFrame(this, “气象服务“);
myFrame.getContentPane().setLayout(new FlowLayout());
myFrame.getContentPane().append(myInput);
myFrame.getContentPane().append(myAmf3Button);
myFrame.getContentPane().append(myHessianButton);
myFrame.getContentPane().append(myHttpButton);
myFrame.setSizeWH(300, 200);
myFrame.show();
}
public function amf3Result(event : Object) : void {
JOptionPane.showMessageDialog(“amf3 “, String(event));
}
public function amf3Error(event : Object) : void {
}
public function hessianResult(event :HessianResultEvent):void{
JOptionPane.showMessageDialog(“hessian “, String(event.result));
}
public function hessianError(event :HessianErrorEvent):void{
}
public function httpResult(event : Object) : void {
JOptionPane.showMessageDialog(“http “, String(event));
}
public function httpError(event : Object) : void {
}
private function __amf3buttonClicked(e:AWEvent):void {
var amf3ServiceInvoker: Amf3ServiceInvoker = new Amf3ServiceInvoker(amf3Result, amf3Error);
amf3ServiceInvoker.getWeather2(myInput.getText());
}
private function __hessianbuttonClicked(e:AWEvent):void {
var hessianServiceInvoker : HessianServiceInvoker = new HessianServiceInvoker(hessianResult, hessianError);
hessianServiceInvoker.getWeather2(myInput.getText());
}
private function __httpbuttonClicked(e:AWEvent):void {
var httpServiceInvoker : HttpServiceInvoker = new HttpServiceInvoker(httpResult, httpError);
httpServiceInvoker.getWeather2(myInput.getText());
}
}
}

注:为降低复杂度,demo 中的 Java 服务端所有 Service 实现在此都不做叙述,我们已将服务部署到外网中,大家可通过aswing2java.zip 中的 code 来完成测试。
flash.net简介
在 AS3 中,有关于网络操作的类全部内置在 flash.net 中,理解这个 lib 将有利于我们更好的完成交互。

URLLoader :用于从网络或者本地读取文件,可以通过设置他的 dataFormat 属性改变收到的文本类型。默认值为 URLLoaderDataFormat.TEXT 纯文本格式。
URLLoader 部分事件。
complete :使用 URLLoader.load() 方法后,数据完全加载完毕时触发,说明程序加载完成。
ioError : 使用 URLLoader.load() 方法时, 发生致命I/O错误时触发。
open : 使用 URLLoader.load() 方法后,开始从服务器下载数据时触发。
progress :使用 URLLoader.load() 方法后,在从服务器下载数据的过程中持续触发, 通过侦听此事件我们可以很方便的做信息加载状态的显示。
securityError :FlashPlayer 的安全异常, 比如跨域加载错误。
URLRequest : 用于传递变量到服务器,以及 URLLoader 要 load 的目标路径。 可以通过设置他的 contentType 属性改变发送到服务器的变量类型。
URLVariables :键/值对, 如user=zhuam&password=111,
URLLoaderDataFormat :用于设置读取文件的类型,有 TEXT (纯文本), VARIABLES (键/值对),BINARY (二进制格式),URLLoader 会根据类型不同来进行解码操作。
URLRequestMethod : 设置用哪种方式来传递数据, POST 或者 GET。
URLReqeustHeader : URL HTTP 头部。
一、HTTP(AS3 Remoting)
由于 Flash 对跨域访问有严格的权限限制,故而获取其他站点的页面信息,我都是在服务端做了一层 Proxy。

package c2s
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.utils.ByteArray;
public class HttpServiceInvoker
{
protected var resultCallbackFunction : Function;
protected var errorCallbackFunction : Function;
// 请求地址
private const urlAddress : String = “http://gcc.cuscstar.com:8080/weatherHttpProxy.jsp”;
public function HttpServiceInvoker(resultCallback : Function, errorCallback : Function)
{
resultCallbackFunction = resultCallback;
errorCallbackFunction = errorCallback;
super();
}
public function getWeather2(city: String): void {
// 建立 URLRequest 对象 设置 GET 方法调用
var request : URLRequest = new URLRequest(urlAddress);
request.method = URLRequestMethod.GET;
var cityVar : URLVariables = new URLVariables();
cityVar.city = city;
request.data = cityVar;
// URLLoader DATA FORMAT 设置 BINARY 格式用于做Response字符集的转换
var loader : URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, resultCallback);
loader.addEventListener(IOErrorEvent.IO_ERROR, errorCallback);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorCallback);
loader.load(request);
}
private function resultCallback(event:Event):void {
/// 将接收的数据转换为 ByteArry ,通过 readMultiByte 来转换编码格式
var ba:ByteArray = ByteArray(URLLoader(event.target).data);
var rhtml:String = ba.readMultiByte(ba.length, “gb2312″);
resultCallbackFunction(rhtml);
}
private function errorCallback(event:Event):void {
}
}
}

二、Hessian
Hessian ( http://hessian.caucho.com/ria/ )是Caucho公司制定的一个 RPC 协议,虽然它也是通过 HTTP协议传输 RPC 封包,但是它的 RPC 封包却是以二进制形式编码的,而且能够表现对象模型和异常体系,这使得 Hessian 比 XML-RPC 更有效率。
1、 首选需要我们去 http://hessian.caucho.com/#Flash/Flex 下载Hessian的最新Flash 版本 hessian-flash-3_1-snap.swc(30k)。
2、 引用该 swc 到您的 AsWing 项目中,下面这段代码是通过AS3来调用 Java后台的一个Hessian气象信息服务,注:Java 部分的 Hessian 服务的开发与实现在此就不做叙述,有心之人皆可 Google ,讲解的文章很多。
3、 AS3 通过 Hessian 与 Java 交互 Code ( 获取城市天气信息 )

package c2s
{
import flash.events.IOErrorEvent;
import hessian.client.HessianAsyncToken;
import hessian.client.HessianProxy;
import hessian.events.HessianErrorEvent;
import hessian.events.HessianResultEvent;
public class HessianServiceInvoker {
protected var resultCallbackFunction : Function;
protected var errorCallbackFunction : Function;
private var proxy:HessianProxy = new HessianProxy(“http://gcc.cuscstar.com:8080/hessian/service.do”);
public function HessianServiceInvoker(resultCallback:Function, errorCallback:Function) {
resultCallbackFunction = resultCallback;
errorCallbackFunction = errorCallback;
super();
}
public function resultCallback(data:Object):void {
resultCallbackFunction(data);
}
public function errorCallback(data:Object):void {
}
public function getWeather2(city: String):void
{
var token:HessianAsyncToken = proxy.getWeather2(city);
token.addEventListener(HessianErrorEvent.HESSIAN_ERROR, errorCallback);
token.addEventListener(HessianResultEvent.HESSIAN_RESULT, resultCallback);
}
}
}

三、AMF3 ( Action Message Format )
Adobe就提出AMF(Action Message Format)技术,即将Java等语言的对象转换为ActionScript对象的技术规范。AMF是将数据对象高度压缩,编码后作为2进制来传输的,比起WebService、HTTPService、XML在效率上的确是有很大的提升。
Adobe AMF协议及Java版本的AMF实现Blazeds也已经开放,
http://labs.adobe.com/technologies/blazeds/
服务端Java 的AMF服务的实现,在此不做叙述,下面这两个部分的代码一个是用纯AS3完成服务的调用,另一个采用Flex3 Framework 来完成服务的调用。
AS3 利用 Adobe AMF3 协议与 Java 交互 (Pure AS3)

package c2s
{
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;
public class Amf3ServiceInvoker
{
private var nc : NetConnection = new NetConnection();
private var responder : Responder = null;
private const amf3URL : String = “http://gcc.cuscstar.com:8080/messagebroker/amf”;
public function Amf3ServiceInvoker(result : Function, error : Function)
{
responder = new Responder(result, error);
super();
}
public function getWeather2(city: String) : void{
nc.objectEncoding = ObjectEncoding.AMF3;
nc.connect(amf3URL);
nc.call(“amf3ServiceInvoker.getWeather2″, responder, city);
}
}
}

Response.end()用法

mikel阅读(849)

ASP开发中可能有时候会用大段的if… else 的判断,不过如果是动态Response.write的内容,你想更方便阅读代码,可以用Response.End()来终端ASP的执行,也就类似于Break的用法,举个例子:

if (userid="")or(password="") then
Response.Write("<script lanuage=javascript>alert(&#39;UserName o&#114; Password is Empty!&#39;);location.href=&#39;../default.asp&#39;;</script>")
Response.End() ‘这里进行了中断
end if
下面是不为空进行读取数据库的操作,省略了n行代码

这样当传入的用户名或密码为空时,自动write提示信息信息,然后Response.End()中断程序,从而达到if 。。。else的作用。
另外使用Response.End的时候,就是我们日常调试程序的时候,比如
相输出拼接的SQL语句,而不想执行下面的代码,那么可以这么做

sql="sel&#101;ct * from userinfo "
response.Write(sql)
response.End()
rs.open sql ,conn,1,1 &#39;这句是不会执行的

如果怕加入Response.End()的地方过多而正式发布时候不好注释掉的化,可以用个函数将其封装起来,如下面代码:

sub debug()
Response.End()
end sub

上面的代码修改如下:

sql="sel&#101;ct * from userinfo "
response.Write(sql)
debug()
rs.open sql ,conn,1,1 &#39;这句是不会执行的

这样当进行正式发布时,将函数Debug中的语句注释掉,就可以起到调试的作用,不过这个也有个问题就是,如果你使用太多的Debug(),可能在调试的时候程序会不能按照需要进行中断,可能有时候你不希望这些地方中断执行,那么我们来进一步重构Debug()函数,如下:

sub debug(isBreak)
&#39;isBreak是boolean值的参数,如果设置为true的时候则进行中断,否则,不进行中断处理
if isBreak then
Response.End()
end
end sub

使用时候代码如下:

sql="sel&#101;ct * from userinfo "
response.Write(sql)
debug(false)
rs.open sql ,conn,1,1 &#39;这句是会执行的
rs.close()
sql="sel&#101;ct * from product "
response.write(sql)
debug(true)
rs.open sql,conn,1,1 &#39;这句不会执行

好了,这样基本上可以满足我们控制中断的需求了,不过只是简单的进行了分析,其实还很不完善,调试需求可能还有很多,需要满足,还需要进一步重构。其实程序开发就是一个重构重构再重构的过程,要不怎么会出来那么多的设计模式,都是前人从实际开发重构过程总结出来的经验,值得大家借鉴。